[
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.yaml",
    "content": "name: Bug Report 问题提交\ndescription: Report a bug encountered while using kubeasz 项目使用问题提交\nlabels: kind/bug\nbody:\n  - type: textarea\n    id: problem\n    attributes:\n      label: What happened? 发生了什么问题？\n      description: |\n        Please provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner.\n        操作命令，输出日志等，请尽可能提供详细信息，否则可能导致您的问题无法及时得到跟踪和解决。\n    validations:\n      required: true\n\n  - type: textarea\n    id: expected\n    attributes:\n      label: What did you expect to happen? 期望的结果是什么？\n    validations:\n      required: true\n\n  - type: textarea\n    id: repro\n    attributes:\n      label: How can we reproduce it (as minimally and precisely as possible)? 尽可能最小化、精确地描述如何复现问题\n    validations:\n      required: true\n\n  - type: textarea\n    id: additional\n    attributes:\n      label: Anything else we need to know? 其他需要说明的情况\n\n  - type: textarea\n    id: kubeVersion\n    attributes:\n      label: Kubernetes version k8s 版本\n      value: |\n        <details>\n\n        </details>\n    validations:\n      required: true\n\n  - type: textarea\n    id: kubeaszVersion\n    attributes:\n      label: Kubeasz version \n      value: |\n        <details>\n\n        </details>\n    validations:\n      required: true\n\n  - type: textarea\n    id: osVersion\n    attributes:\n      label: OS version 操作系统版本\n      value: |\n        <details>\n\n        ```console\n        # On Linux:\n        $ cat /etc/os-release\n        # paste output here\n        $ uname -a\n        # paste output here\n        ```\n\n        </details>\n    validations:\n      required: true\n\n  - type: textarea\n    id: plugins\n    attributes:\n      label: Related plugins (CNI, CSI, ...) and versions (if applicable) 其他网络插件等需要说明的情况\n      value: |\n        <details>\n\n        </details>\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/enhancement.yaml",
    "content": "name: Enhancement Tracking Issue\ndescription: Provide supporting details for a feature in development\nlabels: kind/feature\nbody:\n  - type: textarea\n    id: feature\n    attributes:\n      label: What would you like to be added?\n      description: |\n        Feature requests are unlikely to make progress as issues. \n        A proposal that works through the design along with the implications of the change can be opened as a KEP.\n    validations:\n      required: true\n\n  - type: textarea\n    id: rationale\n    attributes:\n      label: Why is this needed?\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--  Thanks for sending a pull request!  Here are some tips for you:\n\n-->\n\n#### What type of PR is this?\n\n<!--\nAdd one of the following kinds:\n/kind bug\n/kind cleanup\n/kind documentation\n/kind feature\n-->\n\n#### What this PR does / why we need it:\n\n#### Which issue(s) this PR fixes:\n<!--\n*Automatically closes linked issue when PR is merged.\nUsage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.\n_If PR is about `failing-tests or flakes`, please post the related issues/tests in a comment and do not use `Fixes`_*\n-->\nFixes #\n\n#### Special notes for your reviewer:\n\n#### Does this PR introduce a user-facing change?\n<!--\nIf no, just write \"NONE\" in the release-note block below.\nIf yes, a release note is required:\nEnter your extended release note in the block below. If the PR requires additional action from users switching to the new release, include the string \"action required\".\n\n-->\n```release-note\n\n```\n\n#### Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.:\n\n<!--\nThis section can be blank if this pull request does not require a release note.\n\nWhen adding links which point to resources within git repositories, like\nKEPs or supporting documentation, please reference a specific commit and avoid\nlinking directly to the master branch. This ensures that links reference a\nspecific point in time, rather than a document that may change over time.\n\nSee here for guidance on getting permanent links to files: https://help.github.com/en/articles/getting-permanent-links-to-files\n\nPlease use the following format for linking documentation:\n- [KEP]: <link>\n- [Usage]: <link>\n- [Other doc]: <link>\n-->\n```docs\n\n```\n"
  },
  {
    "path": ".github/workflows/mirror.yml",
    "content": "name: Mirroring\n\non:\n  push:\n    #branches:\n    #  - 'master'\n    tags:\n      - '*.*.*'\n\njobs:\n  to_gitee:\n    runs-on: ubuntu-latest\n    steps:                                              # <-- must use actions/checkout before mirroring!\n      - uses: actions/checkout@v2\n        with:\n          fetch-depth: 0\n      - uses: pixta-dev/repository-mirroring-action@v1\n        with:\n          target_repo_url:\n            git@gitee.com:easzlab/kubeasz.git\n          ssh_private_key:\n            ${{ secrets.SYNCGITEE }}           # 密钥 (secret)\n"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "name: Close inactive issues\non:\n  schedule:\n    - cron: \"1 21 * * *\"\n\njobs:\n  close-issues:\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n      pull-requests: write\n    steps:\n      - uses: actions/stale@v5\n        with:\n          operations-per-run: 50\n          days-before-issue-stale: 30\n          days-before-issue-close: 7\n          stale-issue-label: \"stale\"\n          stale-issue-message: \"This issue is stale because it has been open for 30 days with no activity.\"\n          close-issue-message: \"This issue was closed because it has been inactive for 14 days since being marked as stale.\"\n          days-before-pr-stale: -1\n          days-before-pr-close: -1\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# download directory\ndown/*\n\n# binaries directory\nbin/*\n\n# k8s storage manifests \nmanifests/storage/*\n!manifests/storage/test.yaml\n!manifests/storage/local-storage/\n\n# role based variable settings, exclude roles/os-harden/vars/\n#/roles/*/vars/*\n#!/roles/os-harden/vars/\n\n# cluster instances\nclusters/\n\n#\n*.crt\n*.key\n*.pem\n"
  },
  {
    "path": "README.md",
    "content": "<img alt=\"kubeasz-logo\" width=\"320\" height=\"100\" src=\"docs/pics/kubeasz.svg\">  <a href=\"docs/mixes/conformance.md\"><img align=\"right\" alt=\"conformance-icon\" width=\"75\" height=\"100\" src=\"https://www.cncf.io/wp-content/uploads/2020/07/certified_kubernetes_color-1.png\"></a>\n\n**kubeasz** 致力于提供快速部署高可用`k8s`集群的工具, 同时也努力成为`k8s`实践、使用的参考书；基于二进制方式部署和利用`ansible-playbook`实现自动化；既提供一键安装脚本, 也可以根据`安装指南`分步执行安装各个组件。\n\n**kubeasz** 从每一个单独部件组装到完整的集群，提供最灵活的配置能力，几乎可以设置任何组件的任何参数；同时又为集群创建预置一套运行良好的默认配置，甚至自动化创建适合大规模集群的[BGP Route Reflector网络模式](docs/setup/network-plugin/calico-bgp-rr.md)。\n\n- **集群特性** [Master高可用](docs/setup/00-planning_and_overall_intro.md#ha-architecture)、[离线安装](docs/setup/offline_install.md)、[多架构支持(amd64/arm64)](docs/setup/multi_platform.md)\n- **集群版本** kubernetes v1.24, v1.25, v1.26, v1.27, v1.28, v1.29, v1.30, v1.31, v1.32, v.1.33, v1.34\n- **运行时** [containerd](docs/setup/03-container_runtime.md) v1.7.x, v2.0.x, v2.1.x\n- **网络** [calico](docs/setup/network-plugin/calico.md), [cilium](docs/setup/network-plugin/cilium.md), [flannel](docs/setup/network-plugin/flannel.md), [kube-ovn](docs/setup/network-plugin/kube-ovn.md), [kube-router](docs/setup/network-plugin/kube-router.md)\n\n\n**[news]** kubeasz 通过cncf一致性测试 [详情](docs/mixes/conformance.md)\n\n推荐版本对照\n\n<table>\n  <thead>\n    <tr>\n      <td>Kubernetes</td>\n      <td>1.23</td>\n      <td>1.24-1.28</td>\n      <td>1.29</td>\n      <td>1.30</td>\n      <td>1.31</td>\n      <td>1.32</td>\n      <td>1.33</td>\n      <td>1.34</td>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>kubeasz</td>\n      <td>3.2.0</td>\n      <td>3.6.2</td>\n      <td>3.6.3</td>\n      <td>3.6.4</td>\n      <td>3.6.5</td>\n      <td>3.6.6</td>\n      <td>3.6.7</td>\n      <td>3.6.8</td>\n    </tr>\n  </tbody>\n</table>\n\n## 支持系统\n\n- **Alibaba Linux** 2.1903, 3.2104\n- **Alma Linux** 8, 9\n- **Anolis OS** 8.x RHCK, 8.x ANCK\n- **CentOS/RHEL** 7, 8, 9\n- **Debian** 10, 11([notes](docs/setup/multi_os.md#Debian))\n- **Fedora** 34, 35, 36, 37\n- **Kylin Linux Advanced Server V10** 麒麟V10 Tercel, Lance, Halberd\n- **openEuler** 22.03 LTS, 24.03 LTS([notes](docs/setup/multi_os.md#openEuler))\n- **openSUSE** Leap 15.x([notes](docs/setup/multi_os.md#openSUSE))\n- **Rocky Linux** 8, 9\n- **Ubuntu** 16.04, 18.04, 20.04, 22.04, 24.04\n\n能够支持大部分使用systemd的linux发行版，如果安装有问题先请查看[文档](docs/setup/multi_os.md)；如果某个能够支持安装的系统没有在列表中，欢迎提PR 告知。\n\n## 快速指南\n\n单机快速体验k8s集群的测试环境--[AllinOne部署](docs/setup/quickStart.md)\n\n## 安装指南\n\n<table border=\"0\">\n    <tr>\n        <td><a href=\"docs/setup/00-planning_and_overall_intro.md\">00-规划集群和配置介绍</a></td>\n        <td><a href=\"docs/setup/02-install_etcd.md\">02-安装etcd集群</a></td>\n        <td><a href=\"docs/setup/04-install_kube_master.md\">04-安装master节点</a></td>\n        <td><a href=\"docs/setup/06-install_network_plugin.md\">06-安装集群网络</a></td>\n    </tr>\n    <tr>\n        <td><a href=\"docs/setup/01-CA_and_prerequisite.md\">01-创建证书和安装准备</a></td>\n        <td><a href=\"docs/setup/03-container_runtime.md\">03-安装容器运行时</a></td>\n        <td><a href=\"docs/setup/05-install_kube_node.md\">05-安装node节点</a></td>\n        <td><a href=\"docs/setup/07-install_cluster_addon.md\">07-安装集群插件</a></td>\n    </tr>\n</table>\n\n## 使用指南\n\n<table border=\"0\">\n    <tr>\n        <td><strong>常用插件</strong><a href=\"docs/guide/index.md\">+</a></td>\n        <td><a href=\"docs/guide/kubedns.md\">DNS</a></td>\n        <td><a href=\"docs/guide/dashboard.md\">dashboard</a></td>\n        <td><a href=\"docs/guide/metrics-server.md\">metrics-server</a></td>\n        <td><a href=\"docs/guide/prometheus.md\">prometheus</a></td>\n        <td><a href=\"docs/deprecated/efk.md\">efk</a></td>\n    </tr>\n    <tr>\n        <td><strong>集群管理</strong><a href=\"docs/op/op-index.md\">+</a></td>\n        <td><a href=\"docs/op/op-node.md\">管理node节点</a></td>\n        <td><a href=\"docs/op/op-master.md\">管理master节点</a></td>\n        <td><a href=\"docs/op/op-etcd.md\">管理etcd节点</a></td>\n        <td><a href=\"docs/op/upgrade.md\">升级集群</a></td>\n        <td><a href=\"docs/op/cluster_restore.md\">备份恢复</a></td>\n    </tr>\n    <tr>\n        <td><strong>特性实验</strong></td>\n        <td><a href=\"docs/guide/networkpolicy.md\">NetworkPolicy</a></td>\n        <td><a href=\"docs/guide/rollingupdateWithZeroDowntime.md\">RollingUpdate</a></td>\n        <td><a href=\"docs/guide/hpa.md\">HPA</a></td>\n        <td><a href=\"\"></a></td>\n        <td><a href=\"\"></a></td>\n    </tr>\n    <tr>\n        <td><strong>周边生态</strong></td>\n        <td><a href=\"docs/guide/harbor.md\">harbor</a></td>\n        <td><a href=\"docs/guide/helm.md\">helm</a></td>\n        <td><a href=\"docs/deprecated/jenkins.md\">jenkins</a></td>\n        <td><a href=\"docs/deprecated/gitlab/readme.md\">gitlab</a></td>\n        <td><a href=\"docs/guide/argocd.md\">argocd</a></td>\n        <td><a href=\"\"></a></td>\n    </tr>\n</table>\n\n## 沟通交流\n\n- 微信：k8s&kubeasz实践, 搜索微信号`badtobone`, 请按格式备注（${城市}-${github用户名}）, 验证后加入群聊。\n- 推荐阅读\n  - [kubernetes架构师课程](https://www.toutiao.com/c/user/token/MS4wLjABAAAA0YFomuMNm87NNysXeUsQdI0Tt3gOgz8WG_0B3MzxsmI/?tab=article)\n  - [kubernetes-the-hard-way](https://github.com/kelseyhightower/kubernetes-the-hard-way)\n  - [feisky-Kubernetes 指南](https://github.com/feiskyer/kubernetes-handbook/blob/master/SUMMARY.md)\n  - [opsnull 安装教程](https://github.com/opsnull/follow-me-install-kubernetes-cluster)\n\n## 贡献&致谢\n\n欢迎提[Issues](https://github.com/easzlab/kubeasz/issues)和[PRs](docs/mixes/HowToContribute.md)参与维护项目！感谢您的关注与支持！\n- [如何 PR](docs/mixes/HowToContribute.md)\n- [如何捐赠](docs/mixes/donate.md)\n\nCopyright 2017 gjmzj (jmgaozz@163.com) Apache License 2.0, 详情见 [LICENSE](docs/mixes/LICENSE) 文件。\n"
  },
  {
    "path": "ansible.cfg",
    "content": "# Example config file for ansible -- https://ansible.com/\n# =======================================================\n\n# Nearly all parameters can be overridden in ansible-playbook\n# or with command line flags. Ansible will read ANSIBLE_CONFIG,\n# ansible.cfg in the current working directory, .ansible.cfg in\n# the home directory, or /etc/ansible/ansible.cfg, whichever it\n# finds first\n\n# For a full list of available options, run ansible-config list or see the\n# documentation: https://docs.ansible.com/ansible/latest/reference_appendices/config.html.\n\n[defaults]\n#inventory       = /etc/ansible/hosts\n#library         = ~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules\n#module_utils    = ~/.ansible/plugins/module_utils:/usr/share/ansible/plugins/module_utils\n#remote_tmp      = ~/.ansible/tmp\n#local_tmp       = ~/.ansible/tmp\n#forks           = 5\n#poll_interval   = 0.001\n#ask_pass        = False\n#transport       = smart\n\n# Plays will gather facts by default, which contain information about\n# the remote system.\n#\n# smart - gather by default, but don't regather if already gathered\n# implicit - gather by default, turn off with gather_facts: False\n# explicit - do not gather by default, must say gather_facts: True\ngathering = smart\n\n# This only affects the gathering done by a play's gather_facts directive,\n# by default gathering retrieves all facts subsets\n# all - gather all subsets\n# network - gather min and network facts\n# hardware - gather hardware facts (longest facts to retrieve)\n# virtual - gather min and virtual facts\n# facter - import facts from facter\n# ohai - import facts from ohai\n# You can combine them using comma (ex: network,virtual)\n# You can negate them using ! (ex: !hardware,!facter,!ohai)\n# A minimal set of facts is always gathered.\n#\n#gather_subset = all\n\n# some hardware related facts are collected\n# with a maximum timeout of 10 seconds. This\n# option lets you increase or decrease that\n# timeout to something more suitable for the\n# environment.\n#\ngather_timeout = 7\n\n# Ansible facts are available inside the ansible_facts.* dictionary\n# namespace. This setting maintains the behaviour which was the default prior\n# to 2.5, duplicating these variables into the main namespace, each with a\n# prefix of 'ansible_'.\n# This variable is set to True by default for backwards compatibility. It\n# will be changed to a default of 'False' in a future release.\n#\n#inject_facts_as_vars = True\n\n# Paths to search for collections, colon separated\n# collections_paths = ~/.ansible/collections:/usr/share/ansible/collections\n\n# Paths to search for roles, colon separated\nroles_path = /etc/kubeasz/roles \n\n# Host key checking is enabled by default\nhost_key_checking = False\n\n# You can only have one 'stdout' callback type enabled at a time. The default\n# is 'default'. The 'yaml' or 'debug' stdout callback plugins are easier to read.\n#\n#stdout_callback = default\n#stdout_callback = yaml\n#stdout_callback = debug\n\n\n# Ansible ships with some plugins that require whitelisting,\n# this is done to avoid running all of a type by default.\n# These setting lists those that you want enabled for your system.\n# Custom plugins should not need this unless plugin author disables them\n# by default.\n#\n# Enable callback plugins, they can output to stdout but cannot be 'stdout' type.\n#callback_whitelist = timer, mail\n\n# Determine whether includes in tasks and handlers are \"static\" by\n# default. As of 2.0, includes are dynamic by default. Setting these\n# values to True will make includes behave more like they did in the\n# 1.x versions.\n#\n#task_includes_static = False\n#handler_includes_static = False\n\n# Controls if a missing handler for a notification event is an error or a warning\n#error_on_missing_handler = True\n\n# Default timeout for connection plugins\n#timeout = 10\n\n# Default user to use for playbooks if user is not specified\n# Uses the connection plugin's default, normally the user currently executing Ansible,\n# unless a different user is specified here.\n#\n#remote_user = root\n\n# Logging is off by default unless this path is defined.\n#log_path = /var/log/ansible.log\n\n# Default module to use when running ad-hoc commands\n#module_name = command\n\n# Use this shell for commands executed under sudo.\n# you may need to change this to /bin/bash in rare instances\n# if sudo is constrained.\n#\n#executable = /bin/sh\n\n# By default, variables from roles will be visible in the global variable\n# scope. To prevent this, set the following option to True, and only\n# tasks and handlers within the role will see the variables there\n#\nprivate_role_vars = True\n\n# List any Jinja2 extensions to enable here.\n#jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n\n\n# If set, always use this private key file for authentication, same as\n# if passing --private-key to ansible or ansible-playbook\n#\n#private_key_file = /path/to/file\n\n# If set, configures the path to the Vault password file as an alternative to\n# specifying --vault-password-file on the command line. This can also be\n# an executable script that returns the vault password to stdout.\n#\n#vault_password_file = /path/to/vault_password_file\n\n# Format of string {{ ansible_managed }} available within Jinja2\n# templates indicates to users editing templates files will be replaced.\n# replacing {file}, {host} and {uid} and strftime codes with proper values.\n#\n#ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}\n\n# {file}, {host}, {uid}, and the timestamp can all interfere with idempotence\n# in some situations so the default is a static string:\n#\n#ansible_managed = Ansible managed\n\n# By default, ansible-playbook will display \"Skipping [host]\" if it determines a task\n# should not be run on a host. Set this to \"False\" if you don't want to see these \"Skipping\"\n# messages. NOTE: the task header will still be shown regardless of whether or not the\n# task is skipped.\n#\ndisplay_skipped_hosts = False\n\n# By default, if a task in a playbook does not include a name: field then\n# ansible-playbook will construct a header that includes the task's action but\n# not the task's args. This is a security feature because ansible cannot know\n# if the *module* considers an argument to be no_log at the time that the\n# header is printed. If your environment doesn't have a problem securing\n# stdout from ansible-playbook (or you have manually specified no_log in your\n# playbook on all of the tasks where you have secret information) then you can\n# safely set this to True to get more informative messages.\n#\ndisplay_args_to_stdout = False \n\n# Ansible will raise errors when attempting to dereference\n# Jinja2 variables that are not set in templates or action lines. Uncomment this line\n# to change this behavior.\n#\nerror_on_undefined_vars = True\n\n# Ansible may display warnings based on the configuration of the\n# system running ansible itself. This may include warnings about 3rd party packages or\n# other conditions that should be resolved if possible.\n# To disable these warnings, set the following value to False:\n#\nsystem_warnings = False\n\n# Ansible may display deprecation warnings for language\n# features that should no longer be used and will be removed in future versions.\n# To disable these warnings, set the following value to False:\n#\ndeprecation_warnings = False\n\n# Ansible can optionally warn when usage of the shell and\n# command module appear to be simplified by using a default Ansible module\n# instead. These warnings can be silenced by adjusting the following\n# setting or adding warn=yes or warn=no to the end of the command line\n# parameter string. This will for example suggest using the git module\n# instead of shelling out to the git command.\n#\n#command_warnings = False\n\n\n# set plugin path directories here, separate with colons\n#action_plugins     = /usr/share/ansible/plugins/action\n#become_plugins     = /usr/share/ansible/plugins/become\n#cache_plugins      = /usr/share/ansible/plugins/cache\n#callback_plugins   = /usr/share/ansible/plugins/callback\n#connection_plugins = /usr/share/ansible/plugins/connection\n#lookup_plugins     = /usr/share/ansible/plugins/lookup\n#inventory_plugins  = /usr/share/ansible/plugins/inventory\n#vars_plugins       = /usr/share/ansible/plugins/vars\n#filter_plugins     = /usr/share/ansible/plugins/filter\n#test_plugins       = /usr/share/ansible/plugins/test\n#terminal_plugins   = /usr/share/ansible/plugins/terminal\n#strategy_plugins   = /usr/share/ansible/plugins/strategy\n\n\n# Ansible will use the 'linear' strategy but you may want to try another one.\n#strategy = linear\n\n# By default, callbacks are not loaded for /bin/ansible. Enable this if you\n# want, for example, a notification or logging callback to also apply to\n# /bin/ansible runs\n#\n#bin_ansible_callbacks = False\n\n\n# Don't like cows?  that's unfortunate.\n# set to 1 if you don't want cowsay support or export ANSIBLE_NOCOWS=1\n#nocows = 1\n\n# Set which cowsay stencil you'd like to use by default. When set to 'random',\n# a random stencil will be selected for each task. The selection will be filtered\n# against the `cow_whitelist` option below.\n#\n#cow_selection = default\n#cow_selection = random\n\n# When using the 'random' option for cowsay, stencils will be restricted to this list.\n# it should be formatted as a comma-separated list with no spaces between names.\n# NOTE: line continuations here are for formatting purposes only, as the INI parser\n#       in python does not support them.\n#\n#cow_whitelist=bud-frogs,bunny,cheese,daemon,default,dragon,elephant-in-snake,elephant,eyes,\\\n#              hellokitty,kitty,luke-koala,meow,milk,moofasa,moose,ren,sheep,small,stegosaurus,\\\n#              stimpy,supermilker,three-eyes,turkey,turtle,tux,udder,vader-koala,vader,www\n\n# Don't like colors either?\n# set to 1 if you don't want colors, or export ANSIBLE_NOCOLOR=1\n#\n#nocolor = 1\n\n# If set to a persistent type (not 'memory', for example 'redis') fact values\n# from previous runs in Ansible will be stored. This may be useful when\n# wanting to use, for example, IP information from one group of servers\n# without having to talk to them in the same playbook run to get their\n# current IP information.\n#\n#fact_caching = memory\n\n# This option tells Ansible where to cache facts. The value is plugin dependent.\n# For the jsonfile plugin, it should be a path to a local directory.\n# For the redis plugin, the value is a host:port:database triplet: fact_caching_connection = localhost:6379:0\n#\n#fact_caching_connection=/tmp\n\n# retry files\n# When a playbook fails a .retry file can be created that will be placed in ~/\n# You can enable this feature by setting retry_files_enabled to True\n# and you can change the location of the files by setting retry_files_save_path\n#\nretry_files_enabled = False\n#retry_files_save_path = ~/.ansible-retry\n\n# prevents logging of task data, off by default\n#no_log = False\n\n# prevents logging of tasks, but only on the targets, data is still logged on the master/controller\n#no_target_syslog = False\n\n# Controls whether Ansible will raise an error or warning if a task has no\n# choice but to create world readable temporary files to execute a module on\n# the remote machine. This option is False by default for security. Users may\n# turn this on to have behaviour more like Ansible prior to 2.1.x. See\n# https://docs.ansible.com/ansible/latest/user_guide/become.html#becoming-an-unprivileged-user\n# for more secure ways to fix this than enabling this option.\n#\n#allow_world_readable_tmpfiles = False\n\n# Controls what compression method is used for new-style ansible modules when\n# they are sent to the remote system. The compression types depend on having\n# support compiled into both the controller's python and the client's python.\n# The names should match with the python Zipfile compression types:\n# * ZIP_STORED (no compression. available everywhere)\n# * ZIP_DEFLATED (uses zlib, the default)\n# These values may be set per host via the ansible_module_compression inventory variable.\n#\n#module_compression = 'ZIP_DEFLATED'\n\n# This controls the cutoff point (in bytes) on --diff for files\n# set to 0 for unlimited (RAM may suffer!).\n#\n#max_diff_size = 104448\n\n# Controls showing custom stats at the end, off by default\n#show_custom_stats = False\n\n# Controls which files to ignore when using a directory as inventory with\n# possibly multiple sources (both static and dynamic)\n#\n#inventory_ignore_extensions = ~, .orig, .bak, .ini, .cfg, .retry, .pyc, .pyo\n\n# This family of modules use an alternative execution path optimized for network appliances\n# only update this setting if you know how this works, otherwise it can break module execution\n#\n#network_group_modules=eos, nxos, ios, iosxr, junos, vyos\n\n# When enabled, this option allows lookups (via variables like {{lookup('foo')}} or when used as\n# a loop with `with_foo`) to return data that is not marked \"unsafe\". This means the data may contain\n# jinja2 templating language which will be run through the templating engine.\n# ENABLING THIS COULD BE A SECURITY RISK\n#\n#allow_unsafe_lookups = False\n\n# set default errors for all plays\n#any_errors_fatal = False\n\n\n[inventory]\n# List of enabled inventory plugins and the order in which they are used.\n#enable_plugins = host_list, script, auto, yaml, ini, toml\n\n# Ignore these extensions when parsing a directory as inventory source\n#ignore_extensions = .pyc, .pyo, .swp, .bak, ~, .rpm, .md, .txt, ~, .orig, .ini, .cfg, .retry\n\n# ignore files matching these patterns when parsing a directory as inventory source\n#ignore_patterns=\n\n# If 'True' unparsed inventory sources become fatal errors, otherwise they are warnings.\n#unparsed_is_failed = False\n\n\n[privilege_escalation]\n#become = False\n#become_method = sudo\n#become_ask_pass = False\n\n\n## Connection Plugins ##\n\n# Settings for each connection plugin go under a section titled '[[plugin_name]_connection]'\n# To view available connection plugins, run ansible-doc -t connection -l\n# To view available options for a connection plugin, run ansible-doc -t connection [plugin_name]\n# https://docs.ansible.com/ansible/latest/plugins/connection.html\n\n[paramiko_connection]\n# uncomment this line to cause the paramiko connection plugin to not record new host\n# keys encountered. Increases performance on new host additions. Setting works independently of the\n# host key checking setting above.\n#record_host_keys=False\n\n# by default, Ansible requests a pseudo-terminal for commands executed under sudo. Uncomment this\n# line to disable this behaviour.\n#pty = False\n\n# paramiko will default to looking for SSH keys initially when trying to\n# authenticate to remote devices. This is a problem for some network devices\n# that close the connection after a key failure. Uncomment this line to\n# disable the Paramiko look for keys function\n#look_for_keys = False\n\n# When using persistent connections with Paramiko, the connection runs in a\n# background process. If the host doesn't already have a valid SSH key, by\n# default Ansible will prompt to add the host key. This will cause connections\n# running in background processes to fail. Uncomment this line to have\n# Paramiko automatically add host keys.\n#host_key_auto_add = True\n\n\n[ssh_connection]\n# ssh arguments to use\n# Leaving off ControlPersist will result in poor performance, so use\n# paramiko on older platforms rather than removing it, -C controls compression use\n#ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s\n\n# The base directory for the ControlPath sockets.\n# This is the \"%(directory)s\" in the control_path option\n#\n# Example:\n# control_path_dir = /tmp/.ansible/cp\ncontrol_path_dir = /tmp\n\n# The path to use for the ControlPath sockets. This defaults to a hashed string of the hostname,\n# port and username (empty string in the config). The hash mitigates a common problem users\n# found with long hostnames and the conventional %(directory)s/ansible-ssh-%%h-%%p-%%r format.\n# In those cases, a \"too long for Unix domain socket\" ssh error would occur.\n#\n# Example:\n# control_path = %(directory)s/%%C\ncontrol_path = /tmp/ansible-ssh-%%h-%%p-%%r\n\n# Enabling pipelining reduces the number of SSH operations required to\n# execute a module on the remote server. This can result in a significant\n# performance improvement when enabled, however when using \"sudo:\" you must\n# first disable 'requiretty' in /etc/sudoers\n#\n# By default, this option is disabled to preserve compatibility with\n# sudoers configurations that have requiretty (the default on many distros).\n#\npipelining = True \n\n# Control the mechanism for transferring files (old)\n#   * smart = try sftp and then try scp [default]\n#   * True = use scp only\n#   * False = use sftp only\n#scp_if_ssh = smart\n\n# Control the mechanism for transferring files (new)\n# If set, this will override the scp_if_ssh option\n#   * sftp  = use sftp to transfer files\n#   * scp   = use scp to transfer files\n#   * piped = use 'dd' over SSH to transfer files\n#   * smart = try sftp, scp, and piped, in that order [default]\n#transfer_method = smart\n\n# If False, sftp will not use batch mode to transfer files. This may cause some\n# types of file transfer failures impossible to catch however, and should\n# only be disabled if your sftp version has problems with batch mode\nsftp_batch_mode = True\n\n# The -tt argument is passed to ssh when pipelining is not enabled because sudo\n# requires a tty by default.\n#usetty = True\n\n# Number of times to retry an SSH connection to a host, in case of UNREACHABLE.\n# For each retry attempt, there is an exponential backoff,\n# so after the first attempt there is 1s wait, then 2s, 4s etc. up to 30s (max).\n#retries = 3\n\n\n[persistent_connection]\n# Configures the persistent connection timeout value in seconds. This value is\n# how long the persistent connection will remain idle before it is destroyed.\n# If the connection doesn't receive a request before the timeout value\n# expires, the connection is shutdown. The default value is 30 seconds.\n#connect_timeout = 30\n\n# The command timeout value defines the amount of time to wait for a command\n# or RPC call before timing out. The value for the command timeout must\n# be less than the value of the persistent connection idle timeout (connect_timeout)\n# The default value is 30 second.\n#command_timeout = 30\n\n\n## Become Plugins ##\n\n# Settings for become plugins go under a section named '[[plugin_name]_become_plugin]'\n# To view available become plugins, run ansible-doc -t become -l\n# To view available options for a specific plugin, run ansible-doc -t become [plugin_name]\n# https://docs.ansible.com/ansible/latest/plugins/become.html\n\n[sudo_become_plugin]\n#flags = -H -S -n\n#user = root\n\n\n[selinux]\n# file systems that require special treatment when dealing with security context\n# the default behaviour that copies the existing context or uses the user default\n# needs to be changed to use the file system dependent context.\n#special_context_filesystems=fuse,nfs,vboxsf,ramfs,9p,vfat\n\n# Set this to True to allow libvirt_lxc connections to work without SELinux.\n#libvirt_lxc_noseclabel = False\n\n\n[colors]\n#highlight = white\n#verbose = blue\n#warn = bright purple\n#error = red\n#debug = dark gray\n#deprecate = purple\n#skip = cyan\n#unreachable = red\n#ok = green\n#changed = yellow\n#diff_add = green\n#diff_remove = red\n#diff_lines = cyan\n\n\n[diff]\n# Always print diff when running ( same as always running with -D/--diff )\n#always = False\n\n# Set how many context lines to show in diff\n#context = 3\n\n[galaxy]\n# Controls whether the display wheel is shown or not\n#display_progress=\n\n# Validate TLS certificates for Galaxy server\n#ignore_certs = False\n\n# Role or collection skeleton directory to use as a template for\n# the init action in ansible-galaxy command\n#role_skeleton=\n\n# Patterns of files to ignore inside a Galaxy role or collection\n# skeleton directory\n#role_skeleton_ignore=\"^.git$\", \"^.*/.git_keep$\"\n\n# Galaxy Server URL\n#server=https://galaxy.ansible.com\n\n# A list of Galaxy servers to use when installing a collection.\n#server_list=automation_hub, release_galaxy\n\n# Server specific details which are mentioned in server_list\n#[galaxy_server.automation_hub]\n#url=https://cloud.redhat.com/api/automation-hub/\n#auth_url=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token\n#token=my_ah_token\n#\n#[galaxy_server.release_galaxy]\n#url=https://galaxy.ansible.com/\n#token=my_token\n"
  },
  {
    "path": "docs/blog/seperated_containerd_services_for_docker_and_k8s.md",
    "content": "# 为docker和k8s创建独立的containerd进程\n\n## 背景\n\n公司有一台带GPU显卡的服务器，为了通过vllm推理镜像运行像“qwen3-32b”这样的大语言模型，已经配置了带`nvidia-container-runtime`运行时的docker服务；现在需要该服务器加入到k8s集群；因为docker和k8s都需要containerd服务；为了避免冲突，需要两个完全独立的 containerd 实例。\n\n## 方案\n\n必须隔离的 6 个关键点\n\n\n| 项 | Docker containerd | K8s containerd |\n| :--- | :--- | :--- |\n| binary | Docker 自带 | 系统安装|\n| systemd unit | docker.service\t| containerd-k8s.service |\n| socket | /var/run/docker/containerd.sock | /run/containerd-k8s/containerd.sock |\n| root | /var/lib/docker/containerd | /var/lib/containerd-k8s |\n| state | /run/docker/containerd | /run/containerd-k8s |\n| config | Docker 管理 | /etc/containerd-k8s/config.toml |\n\n## 基于kubeasz 安装步骤\n\n`kubeasz` 3.6.9 版本以上支持快速配置自定义的`containerd`服务; 在正常安装之前，首先修改 example/config.yml 配置文件参考如下：\n\n```\n# [containerd] root 存储目录，默认：/var/lib/containerd\nCONTAINERD_ROOT_DIR: \"/var/lib/k8scontainerd\"\n\n# [containerd] state 存储目录，默认：/run/containerd\nCONTAINERD_STATE_DIR: \"/run/k8scontainerd\"\n\n# [containerd] config 目录，默认：/etc/containerd\nCONTAINERD_CONFIG_DIR: \"/etc/k8scontainerd\"\n\n# [containerd] systemd service 名称，默认：containerd.service\nCONTAINERD_SERVICE_NAME: \"k8scontainerd.service\"\n```\n\n然后按照正常的安装流程即可。\n\n## 验证\n\n```\nps -ef | grep containerd\n\n# 可以看到两个不同的进程\n\n/opt/kube/bin/containerd-bin/containerd --log-level warn --config /etc/k8scontainerd/config.toml\n/usr/bin/containerd --config /var/run/docker/containerd/containerd.toml\n```\n\nThat's it. Have Fun!\n"
  },
  {
    "path": "docs/deprecated/efk.md",
    "content": "### 第一部分：EFK\n\n本文档已过期(deprecated)\n\n`EFK` 插件是`k8s`项目的一个日志解决方案，它包括三个组件：[Elasticsearch](), [Fluentd](), [Kibana]()；Elasticsearch 是日志存储和日志搜索引擎，Fluentd 负责把`k8s`集群的日志发送给 Elasticsearch, Kibana 则是可视化界面查看和检索存储在 ES 中的数据。\n- 建议在熟悉本文档内容后使用[Log-Pilot + ES + Kibana 日志方案](log-pilot.md)\n\n### 准备 \n\n参考官方[部署文档](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch)的基础上使用本项目`manifests/efk/`部署，以下为几点主要的修改：\n\n+ 修改 fluentd-es-configmap.yaml 中的部分 journald 日志源（增加集群组件服务日志搜集）\n+ 修改官方docker镜像，方便国内下载加速\n+ 修改 es-statefulset.yaml 支持日志存储持久化等\n+ 增加自动清理日志，见后文`第四部分`\n\n### 安装\n\n``` bash\n$ kubectl apply -f /etc/kubeasz/manifests/efk/\n$ kubectl apply -f /etc/kubeasz/manifests/efk/es-without-pv/\n```\n\n### 验证\n\n``` bash\nkubectl get pods -n kube-system|grep -E 'elasticsearch|fluentd|kibana'\nelasticsearch-logging-0                    1/1       Running   0          19h\nelasticsearch-logging-1                    1/1       Running   0          19h\nfluentd-es-v2.0.2-6c95c                    1/1       Running   0          17h\nfluentd-es-v2.0.2-f2xh8                    1/1       Running   0          8h\nfluentd-es-v2.0.2-pv5q5                    1/1       Running   0          8h\nkibana-logging-d5cffd7c6-9lz2p             1/1       Running   0          1m\n```\nkibana Pod 第一次启动时会用较长时间(10-20分钟)来优化和 Cache 状态页面，可以查看 Pod 的日志观察进度，如下等待 `Ready` 状态\n\n``` bash\n$ kubectl logs -n kube-system kibana-logging-d5cffd7c6-9lz2p -f\n...\n{\"type\":\"log\",\"@timestamp\":\"2018-03-13T07:33:00Z\",\"tags\":[\"listening\",\"info\"],\"pid\":1,\"message\":\"Server running at http://0:5601\"}\n{\"type\":\"log\",\"@timestamp\":\"2018-03-13T07:33:00Z\",\"tags\":[\"status\",\"ui settings\",\"info\"],\"pid\":1,\"state\":\"green\",\"message\":\"Status changed from uninitialized to green - Ready\",\"prevState\":\"uninitialized\",\"prevMsg\":\"uninitialized\"}\n```\n\n### 访问 Kibana\n\n推荐使用`kube-apiserver`方式访问（可以使用证书和rbac等方式进行认证授权），获取访问 URL\n\n- 使用证书登录(生成kubecfg.p12，并将证书下载到本地安装)：\n```bash\ngrep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d > kubecfg.crt\ngrep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d > kubecfg.key\nopenssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name \"kubernetes-client\"\n```\n\n``` bash\n$ kubectl cluster-info | grep Kibana\nKibana is running at https://192.168.1.10:8443/api/v1/namespaces/kube-system/services/kibana-logging/proxy\n```\n浏览器访问 URL：`https://192.168.1.10:8443/api/v1/namespaces/kube-system/services/kibana-logging/proxy`，然后使用`basic-auth`或者`证书` 的方式认证后即可，关于认证可以参考[dashboard文档](dashboard.md)\n\n首次登录需要在`Management` - `Index Patterns` 创建 `index pattern`，可以使用默认的 logstash-* pattern，点击下一步；在 Time Filter field name 下拉框选择 @timestamp; 点击创建Index Pattern后，稍等几分钟就可以在 Discover 菜单看到 ElasticSearch logging 中汇聚的日志；\n\n### 第二部分：日志持久化之静态PV\n日志数据是存放于 `Elasticsearch POD`中，但是默认情况下它使用的是`emptyDir`存储类型，所以当 `POD`被删除或重新调度时，日志数据也就丢失了。以下讲解使用`NFS` 服务器手动（静态）创建`PV` 持久化保存日志数据的例子。\n\n#### 配置 NFS\n\n+ 准备一个nfs服务器，如果没有可以参考[nfs-server](nfs-server.md)创建。 \n+ 配置nfs服务器的共享目录，即修改`/etc/exports`（根据实际网段替换`192.168.1.*`），修改后重启`systemctl restart nfs-server`。\n\n``` bash\n/share          192.168.1.*(rw,sync,insecure,no_subtree_check,no_root_squash)\n/share/es0      192.168.1.*(rw,sync,insecure,no_subtree_check,no_root_squash)\n/share/es1      192.168.1.*(rw,sync,insecure,no_subtree_check,no_root_squash)\n/share/es2      192.168.1.*(rw,sync,insecure,no_subtree_check,no_root_squash)\n```\n\n#### 使用静态 PV安装 EFK\n\n- 请按实际日志容量需求修改 `es-static-pv/es-statefulset.yaml` 文件中 volumeClaimTemplates 设置的 storage: 4Gi 大小\n- 请根据实际nfs服务器地址、共享目录、容量大小修改 `es-static-pv/es-pv*.yaml` 文件中对应的设置\n\n``` bash\n# 如果之前已经安装了默认的EFK，请用以下两个命令先删除它\n$ kubectl delete -f /etc/kubeasz/manifests/efk/\n$ kubectl delete -f /etc/kubeasz/manifests/efk/es-without-pv/\n\n# 安装静态PV 的 EFK\n$ kubectl apply -f /etc/kubeasz/manifests/efk/\n$ kubectl apply -f /etc/kubeasz/manifests/efk/es-static-pv/\n```\n+ 目录`es-static-pv` 下首先是利用 NFS服务预定义了三个 PV资源，然后在 `es-statefulset.yaml`定义中使用 `volumeClaimTemplates` 去匹配使用预定义的 PV资源；注意 PV参数：`accessModes` `storageClassName` `storage`容量大小必须两边匹配。 \n\n#### 验证安装\n\n+ 1.集群中查看 `pod` `pv` `pvc` 等资源\n\n``` bash\n$ kubectl get pods -n kube-system|grep -E 'elasticsearch|fluentd|kibana'\nelasticsearch-logging-0                    1/1       Running   0          10m\nelasticsearch-logging-1                    1/1       Running   0          10m\nfluentd-es-v2.0.2-6c95c                    1/1       Running   0          10m\nfluentd-es-v2.0.2-f2xh8                    1/1       Running   0          10m\nfluentd-es-v2.0.2-pv5q5                    1/1       Running   0          10m\nkibana-logging-d5cffd7c6-9lz2p             1/1       Running   0          10m\n\n$ kubectl get pv\nNAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                                       STORAGECLASS       REASON    AGE\npv-es-0   4Gi        RWX            Recycle          Bound       kube-system/elasticsearch-logging-elasticsearch-logging-0   es-storage-class             1m\npv-es-1   4Gi        RWX            Recycle          Bound       kube-system/elasticsearch-logging-elasticsearch-logging-1   es-storage-class             1m\npv-es-2   4Gi        RWX            Recycle          Available                                                               es-storage-class             1m\n\n$ kubectl get pvc --all-namespaces\nNAMESPACE     NAME                                            STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS       AGE\nkube-system   elasticsearch-logging-elasticsearch-logging-0   Bound     pv-es-0   4Gi        RWX            es-storage-class   2m\nkube-system   elasticsearch-logging-elasticsearch-logging-1   Bound     pv-es-1   4Gi        RWX            es-storage-class   1m\n```\n\n+ 2.网页访问 `kibana`查看具体的日志，如上须等待（约15分钟） `kibana Pod`优化和 Cache 状态页面，达到 `Ready` 状态。\n\n+ 3.登录 NFS Server 查看对应目录和内部数据\n\n``` bash\n$ ls /share\nes0  es1  es2\n```\n\n### 第三部分：日志持久化之动态PV\n`PV` 作为集群的存储资源，`StatefulSet` 依靠它实现 POD的状态数据持久化，但是当 `StatefulSet`动态伸缩时，它的 `PVC`请求也会变化，如果每次都需要管理员手动去创建对应的 `PV`资源，那就很不方便；因此 K8S还提供了 `provisioner`来动态创建 `PV`，不仅节省了管理员的时间，还可以根据不同的 `StorageClasses`封装不同类型的存储供 PVC 选用。\n\n+ 此功能需要 `API-SERVER` 参数 `--admission-control`字符串设置中包含 `DefaultStorageClass`，本项目中已经开启。\n+ `provisioner`指定 Volume 插件的类型，包括内置插件（如 kubernetes.io/glusterfs）和外部插件（如 external-storage 提供的 ceph.com/cephfs，nfs-client等），以下讲解使用 `nfs-client-provisioner`来动态创建 `PV`来持久化保存 `EFK`的日志数据。\n\n#### 配置 NFS（同上）\n\n确保 `/etc/exports` 配置如下共享目录，并确保 `/share`目录可读可写权限，否则可能因为权限问题无法动态生成 PV的对应目录。（根据实际情况替换IP段`192.168.1.*`）\n``` bash\n/share          192.168.1.*(rw,sync,insecure,no_subtree_check,no_root_squash)\n```\n\n#### 使用动态 PV安装 EFK\n\n- 首先根据[集群存储](../setup/08-cluster-storage.md)创建nfs-client-provisioner\n- 然后按实际需求修改 `es-dynamic-pv/es-statefulset.yaml` 文件中 volumeClaimTemplates 设置的 storage: 4Gi 大小   \n\n``` bash\n# 如果之前已经安装了默认的EFK或者静态PV EFK，请用以下命令先删除它\n$ kubectl delete -f /etc/kubeasz/manifests/efk/\n$ kubectl delete -f /etc/kubeasz/manifests/efk/es-without-pv/\n$ kubectl delete -f /etc/kubeasz/manifests/efk/es-static-pv/\n\n# 安装动态PV 的 EFK\n$ kubectl apply -f /etc/kubeasz/manifests/efk/\n$ kubectl apply -f /etc/kubeasz/manifests/efk/es-dynamic-pv/\n```\n+ 首先 `nfs-client-provisioner.yaml` 创建一个工作 POD，它监听集群的 PVC请求，并当 PVC请求来到时调用 `nfs-client` 去请求 `nfs-server`的存储资源，成功后即动态生成对应的 PV资源。\n+ `nfs-dynamic-storageclass.yaml` 定义 NFS存储类型的类型名 `nfs-dynamic-class`，然后在 `es-statefulset.yaml`中必须使用这个类型名才能动态请求到资源。\n\n#### 验证安装\n\n+ 1.集群中查看 `pod` `pv` `pvc` 等资源\n\n``` bash\n$ kubectl get pods -n kube-system|grep -E 'elasticsearch|fluentd|kibana'\nelasticsearch-logging-0                    1/1       Running   0          10m\nelasticsearch-logging-1                    1/1       Running   0          10m\nfluentd-es-v2.0.2-6c95c                    1/1       Running   0          10m\nfluentd-es-v2.0.2-f2xh8                    1/1       Running   0          10m\nfluentd-es-v2.0.2-pv5q5                    1/1       Running   0          10m\nkibana-logging-d5cffd7c6-9lz2p             1/1       Running   0          10m\n\n$ kubectl get pv\nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                                                       STORAGECLASS        REASON    AGE\npvc-50644f36-358b-11e8-9edd-525400cecc16   4Gi        RWX            Delete           Bound     kube-system/elasticsearch-logging-elasticsearch-logging-0   nfs-dynamic-class             10m\npvc-5b105ee6-358b-11e8-9edd-525400cecc16   4Gi        RWX            Delete           Bound     kube-system/elasticsearch-logging-elasticsearch-logging-1   nfs-dynamic-class             10m\n\n$ kubectl get pvc --all-namespaces\nNAMESPACE     NAME                                            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE\nkube-system   elasticsearch-logging-elasticsearch-logging-0   Bound     pvc-50644f36-358b-11e8-9edd-525400cecc16   4Gi        RWX            nfs-dynamic-class   10m\nkube-system   elasticsearch-logging-elasticsearch-logging-1   Bound     pvc-5b105ee6-358b-11e8-9edd-525400cecc16   4Gi        RWX            nfs-dynamic-class   10m\n```\n\n+ 2.网页访问 `kibana`查看具体的日志，如上须等待（约15分钟） `kibana Pod`优化和 Cache 状态页面，达到 `Ready` 状态。\n\n+ 3.登录 NFS Server 查看对应目录和内部数据\n\n``` bash\n$ ls /share # 可以看到类似如下的目录生成\nkube-system-elasticsearch-logging-elasticsearch-logging-0-pvc-50644f36-358b-11e8-9edd-525400cecc16\nkube-system-elasticsearch-logging-elasticsearch-logging-1-pvc-5b105ee6-358b-11e8-9edd-525400cecc16\n```\n\n### 第四部分：日志自动清理\n\n我们知道日志都存储在elastic集群中，且日志每天被分割成一个index，例如：\n\n```\n/ # curl elasticsearch-logging:9200/_cat/indices?v\nhealth status index               uuid                   pri rep docs.count docs.deleted store.size pri.store.size\ngreen  open   logstash-2019.04.29 ejMBlRcJQvqK76xIerenYg   5   1      69864            0     65.9mb         32.9mb\ngreen  open   logstash-2019.04.28 hacNCuQVTQCUL62Sl8avOA   5   1      17558            0     21.3mb         10.6mb\ngreen  open   .kibana_1           MVjF8lQeRDeKfoZcDhA93A   1   1          2            0     30.1kb           15kb\ngreen  open   logstash-2019.05.05 m2aD8X9RQ3u48DvVq18x_Q   5   1      31218            0     34.4mb         17.2mb\ngreen  open   logstash-2019.05.01 66OjwM5wT--DZaVfzUdXYQ   5   1      50610            0     54.6mb         27.1mb\ngreen  open   logstash-2019.04.30 L3AH165jT6izjHHa5L5g0w   5   1      56401            0     55.5mb         27.8mb\n...\n```\n\n因此 EFK 中的日志自动清理，只要定时去删除 es 中的 index 即可，如下命令\n\n```\n$ curl -X DELETE elasticsearch-logging:9200/logstash-xxxx.xx.xx\n```\n\n基于 alpine:3.8 创建镜像`es-index-rotator` [查看Dockerfile](../../dockerfiles/es-index-rotator/Dockerfile)，然后创建一个cronjob去完成清理任务\n\n```\n$ kubectl apply -f /etc/kubeasz/manifests/efk/es-index-rotator/\n```\n\n#### 验证日志清理\n\n- 查看 cronjob\n\n```\n$ kubectl get cronjob -n kube-system \nNAME               SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE\nes-index-rotator   3 1 */1 * *   False     0        19h             20h\n```\n- 查看日志清理情况\n\n```\n$ kubectl get pod -n kube-system |grep es-index-rotator\nes-index-rotator-1557507780-7xb89             0/1     Completed   0          19h\n\n# 查看日志，可以了解日志清理情况\n$ kubectl logs -n kube-system es-index-rotator-1557507780-7xb89 es-index-rotator \n```\nHAVE FUN!\n\n### 参考\n\n1. [EFK 配置](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch)\n1. [nfs-client-provisioner](https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client)\n1. [persistent-volume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)\n1. [storage-classes](https://kubernetes.io/docs/concepts/storage/storage-classes/)\n\n\n"
  },
  {
    "path": "docs/deprecated/gitlab/app.yaml.md",
    "content": "## 3.3 K8S 应用部署模板 app.yaml\n\n以下示例配置仅做参考，描述一个简单 java spring boot项目的 k8s 部署文件模板；在实际部署前，CI/CD流程中会对变量做替换。详见 [gitlab-ci.yml文件](gitlab-ci.yml.md)。\n\n``` bash\ncat > .ci/app.yaml << EOF\n---\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: PROJECT_NS\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: harborkey1\n  namespace: PROJECT_NS\ndata:\n    #待替换的变量DOCKER_KEY，参考 docs/guide/harbor.md#k8s%E4%B8%AD%E4%BD%BF%E7%94%A8harbor\n    .dockerconfigjson: DOCKER_KEY\ntype: kubernetes.io/dockerconfigjson\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: APP_NAME\n  namespace: PROJECT_NS\nspec:\n  replicas: APP_REP\n  template:\n    metadata:\n      labels:\n        run: APP_NAME\n    spec:\n      containers:\n      - name: APP_NAME\n        image: ProjectImage\n        env:\n          # 设置java的时区\n          - name: TZ\n            value: \"Asia/Shanghai\"\n        resources:\n          limits:\n            cpu: 500m\n            memory: 1600Mi\n          requests:\n            cpu: 200m\n            memory: 800Mi\n        ports:\n        - containerPort: 8080\n      imagePullSecrets:\n      - name: harborkey1\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    run: APP_NAME\n  name: APP_NAME\n  namespace: PROJECT_NS\nspec:\n  ports:\n  - port: 80\n    protocol: TCP\n    targetPort: 8080\n  selector:\n    run: APP_NAME\n  sessionAffinity: None\n\n---\napiVersion: networking.k8s.io/v1beta1 \nkind: Ingress\nmetadata:\n  name: APP_NAME-ingress\n  namespace: PROJECT_NS\nspec:\n  rules:\n  - host: AppDomain\n    http:\n      paths:\n      - path: /AppPath\n        backend:\n          serviceName: APP_NAME\n          servicePort: 80\nEOF\n```\n\n"
  },
  {
    "path": "docs/deprecated/gitlab/config.sh.md",
    "content": "## 3.2 环境配置替换 config.sh \n\n首先应用开发人员需要整理在不同环境（测试环境/生产环境）的配置参数，并在源代码中约定好替换的名称（如db_host, db_usr）；然后用户必须在项目gitlab web界面（“Settings”>\"CI/CD\">\"Variables\"）配置变量；最后根据gitlab-ci.yml文件定义CI/CD执行的需要，编写如下简单变量替换shell脚本；该shell脚本分别在测试环境打包阶段（beta-build）和生产环境打包阶段（prod-build）阶段运行。\n\n以下脚本仅作示例，实际应根据项目需要增加/修改需替换变量名称与对应源代码中的配置文件\n\n``` bash\ncat > .ci/config.sh << EOF\n#!/bin/bash\n\n#set -o verbose\n#set -o xtrace\n\nbeta_config() {\nsed -i \\\n        -e \"s/db_host/$BETA_DB_HOST/g\" \\\n        -e \"s/db_usr/$BETA_DB_USR/g\" \\\n        -e \"s/db_pwd/$BETA_DB_PWD/g\" \\\n    example-web/src/main/resources/config/datasource.properties        # 项目源码的配置文件\nsed -i \\\n        -e \"s/redis_host/$BETA_REDIS_HOST/g\" \\\n        -e \"s/redis_port/$BETA_REDIS_PORT/g\" \\\n        -e \"s/redis_pwd/$BETA_REDIS_PWD/g\" \\\n    example-web/src/main/resources/config/redis.properties             # 项目源码的配置文件\n}\n\nprod_config() {\nsed -i \\\n        -e \"s/db_host/$PROD_DB_HOST/g\" \\\n        -e \"s/db_usr/$PROD_DB_USR/g\" \\\n        -e \"s/db_pwd/$PROD_DB_PWD/g\" \\\n    example-web/src/main/resources/config/datasource.properties\nsed -i \\\n        -e \"s/redis_host/$PROD_REDIS_HOST/g\" \\\n        -e \"s/redis_port/$PROD_REDIS_PORT/g\" \\\n        -e \"s/redis_pwd/$PROD_REDIS_PWD/g\" \\\n    example-web/src/main/resources/config/redis.properties\n}\n\nif [[ \"$CI_JOB_STAGE\" == \"beta-build\" ]];then\n\tbeta_config\nelif [[ \"$CI_JOB_STAGE\" == \"prod-build\" ]];then\n\tprod_config\nelse\n\techo \"error: undefined CI_JOB_STAGE!\"\nfi\nEOF\n```\n\n"
  },
  {
    "path": "docs/deprecated/gitlab/gitlab-ci.yml.md",
    "content": "## 3.1 配置 gitlab-ci.yml\n\n示例应用搭建 CI/CD 流水线的背景需求\n\n- 应用测试环境部署在本地k8s平台，生产环境部署在阿里云上k8s平台\n- 应用的多个feature分支可以并行测试\n- 对于即将发布的release分支，本地提供封版测试环境，阿里云上提供UAT测试环境\n\n以下示例配置为个人经验总结，仅供参考，可以根据自己的理解和项目需要不断优化完善；总体来说 gitlab-ci.yml 配置很丰富，基本上能够满足各种个性化的CI/CD流程需要。\n\n``` bash\n$ cat > .ci/gitlab-ci.yml << EOF\nvariables:                                                               ### 定义全局变量 http://gitlab.test.com/help/ci/variables/README.md\n  PROJECT_NS: '$CI_PROJECT_NAMESPACE-$CI_JOB_STAGE'                      # 定义项目命名空间，对应k8s的namespace\n  APP_NAME: '$CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG'                       # 使用项目名和git提交信息作为应用名\n  IMAGE_NAME: '$CI_PROJECT_NAMESPACE-$CI_PROJECT_NAME:$CI_PIPELINE_ID'   # 定义镜像名称 \n\nstages:                                                                  ### 定义ci各阶段\n  - beta-build                                                           # beta环境编译打包\n  - beta-deploy                                                          # beta环境部署\n  - beta-feature-delete                                                  # beta环境feature分支手动删除\n  - prod-build                                                           # prod环境编译打包\n  - prod-uat-deploy                                                      # prod-uat环境部署\n  - prod-deploy                                                          # prod环境部署\n  - prod-rollback                                                        # prod回滚\n\njob_beta_build:\n  stage: beta-build                                                      # beta环境编译打包\n  tags:\n    - build-shell                                                        # 定义带`build-shell`标签的runner可以运行该job\n  only:                                                                  # 定义只在如下分支或者tag运行该job \n    - master\n    - develop\n    - /^feature.*$/\n    - release\n  #when: manual                                                          # 调试阶段可以先手动，后续可以注释掉以自动运行\n  script:                                                                ### runner上运行的脚本\n  - bash .ci/config.sh                                                   # 不同环境配置替换，后文详解 config.sh\n  - mvn clean install -Dmaven.test.skip=true -U                          # mvn 编译，可以去runner 虚机上手动执行编译测试\n  - mv example-web/target/*.jar dockerfiles/                             # 把mvn生成的xxx.jar移动到dockerfiles目录下\n  - export IMAGE=`echo $IMAGE_NAME | sed 's/\\//-/g'`                     # 转换镜像名，例：mygroup/java/example:172 >> mygroup-java-example:172\n  - cd dockerfiles && docker build -t $BETA_HARBOR/example/$IMAGE .      # 创建 docker 镜像\n  - docker login -u $BETA_HARBOR_USR -p $BETA_HARBOR_PWD $BETA_HARBOR    # 登录到内部镜像仓库 harbor，并推送\n  - docker push $BETA_HARBOR/example/$IMAGE                                          \n  - docker logout $BETA_HARBOR\n\njob_push_beta:                                                           ### 推送到beta环境，可以推送不同分支 develop, feature-1, ...>\n  stage: beta-deploy                                                     # 可以做到多分支同时测试，甚至最后的release分支也要在beta封版测试\n  tags:\n    - beta-shell                                                         # 定义带`beta-shell`标签的runner可以运行该job\n  only:\n    - master\n    - develop\n    - /^feature.*$/\n    - release\n  when: manual                                                           # 调试阶段可以先手动，后续可以注释掉以自动运行\n  variables:\n    BETA_EXP_Domain: '$CI_COMMIT_REF_SLUG.example.test.com'              # job内部变量，指定该应用在beta环境的 ingress 域名\n  script:\n  - export IMAGE=`echo $IMAGE_NAME | sed 's/\\//-/g'`                     # 转换 $IMAGE_NAME 中可能的 / 字符\n  - export PROJECT_NS=`echo $PROJECT_NS | sed 's/\\//-/g'`                # 转换命名空间中可能有的 / 字符\n  # 替换beta环境的参数配置\n  - sed -i \"s/PROJECT_NS/$PROJECT_NS/g\" .ci/app.yaml                     ### app.yaml 即k8s的部署模板文件，详见后面 app.yaml.md 文档，注意这里的变量有的来自>\n  - sed -i \"s/APP_NAME/$APP_NAME/g\" .ci/app.yaml                         # gitlab 系统变量, 有的是在项目 CI/CD 设置里面用户定义的变量\n  - sed -i \"s/APP_REP/$BETA_APP_REP/g\" .ci/app.yaml\n  - sed -i \"s/AppDomain/$BETA_EXP_Domain/g\" .ci/app.yaml\n  - sed -i \"s/ProjectImage/$BETA_HARBOR\\/example\\/$IMAGE/g\" .ci/app.yaml\n  - sed -i \"s/DOCKER_KEY/$BETA_KEY/g\" .ci/app.yaml                       # DOCKER_KEY 为k8s平台能从镜像仓库pull所需的认证信息，详见harbor文档\n  #\n  - mkdir -p /opt/kube/$PROJECT_NS/$APP_NAME                             # 在runner：beta-shell虚机本地创建应用配置目录，调试检查用\n  - cp -f .ci/app.yaml /opt/kube/$PROJECT_NS/$APP_NAME\n  - kubectl --kubeconfig=/etc/.beta/config apply -f .ci/app.yaml         # 部署应用（runner虚机上预先配置了kubectl权限执行测试k8s平台）\n\njob_delete_beta:                                                         ### 多测试环境并行部署在beta k8s平台，feature分支测试完毕后删除代码分支，\n  stage: beta-feature-delete                                             # 同时需要删除该分支在k8s平台上的部署，可以由开发人员自行执行该job删除\n  tags:\n    - beta-shell\n  only:\n    - /^feature.*$/\n  when: manual\n  script:\n  - export PROJECT_NS=`echo $PROJECT_NS | sed 's/\\//-/g'`\n  - kubectl --kubeconfig=/etc/.beta/config delete deploy,svc,ing $APP_NAME -n $PROJECT_NS\n\njob_prod_build:                                                          ### prod环境编译打包，这里prod环境我们使用阿里云上的K8S\n  stage: prod-build                                                      # 阿里云k8s平台上运行的uat环境和正式环境都使用本次打包镜像\n  tags:\n    - build-shell\n  only:                                                                  # 仅master和release分支可以执行该job\n    - master\n    - release\n  #when: manual\n  script:\n  - bash .ci/config.sh                                                   # config.sh 会执行替换生产环境的变量\n  - mvn clean install -Dmaven.test.skip=true -U                          # mvn 编译，可以去runner 虚机上手动执行编译测试\n  - mv example-web/target/*.jar dockerfiles/                             # 把mvn生成的xxx.jar移动到dockerfiles目录下\n  - export IMAGE=`echo $IMAGE_NAME | sed 's/\\//-/g'`\n  - cd dockerfiles && docker build -t $PROD_HARBOR/example/$IMAGE .\n  - docker login -u $PROD_HARBOR_USR -p $PROD_HARBOR_PWD $PROD_HARBOR\n  - docker push $PROD_HARBOR/example/$IMAGE\n  - docker logout $PROD_HARBOR\n\njob_push_prod_uat:                                                       ### 部署至阿里云uat环境\n  stage: prod-uat-deploy\n  tags:\n    - prod-shell\n  when: manual\n  only:                                                                  # 仅master和release分支可以执行该job\n    - master\n    - release\n  variables:\n    PROD_EXP_Domain: 'example-uat.xxxx.com'                              # job内部变量，指定该应用在uat环境的 ingress 域名\n  script:\n  - export IMAGE=`echo $IMAGE_NAME | sed 's/\\//-/g'`\n  - export PROJECT_NS=`echo $PROJECT_NS | sed 's/\\//-/g'`\n  # 替换prod环境的参数配置\n  - sed -i \"s/PROJECT_NS/$PROJECT_NS/g\" .ci/app.yaml\n  - sed -i \"s/APP_NAME/$CI_PROJECT_NAME/g\" .ci/app.yaml\n  - sed -i \"s/APP_REP/1/g\" .ci/app.yaml\n  - sed -i \"s/AppDomain/$PROD_EXP_Domain/g\" .ci/app.yaml\n  - sed -i \"s/ProjectImage/$PROD_HARBOR\\/example\\/$IMAGE/g\" .ci/app.yaml\n  - sed -i \"s/DOCKER_KEY/$PROD_KEY/g\" .ci/app.yaml\n  #\n  - mkdir -p /opt/kube/$PROJECT_NS/$APP_NAME\n  - cp -f .ci/app.yaml /opt/kube/$PROJECT_NS/$APP_NAME\n  - kubectl --kubeconfig=/etc/.aliyun/config apply -f .ci/app.yaml\n\njob_push_prod_release:                                                   ### 部署至阿里云正式环境\n  stage: prod-deploy\n  tags:\n    - prod-shell\n  when: manual\n  only:                                                                  # 仅master和release分支可以执行该job\n    - master\n    - release\n  variables:\n    PROD_EXP_Domain: 'example.xxxx.com'                                  # 指定该应用在阿里云正式环境的 ingress 域名\n  script:\n  - export IMAGE=`echo $IMAGE_NAME | sed 's/\\//-/g'`\n  - export PROJECT_NS=`echo $PROJECT_NS | sed 's/\\//-/g'`\n  # 替换prod环境的参数配置\n  - sed -i \"s/PROJECT_NS/$PROJECT_NS/g\" .ci/app.yaml\n  - sed -i \"s/APP_NAME/$CI_PROJECT_NAME/g\" .ci/app.yaml\n  - sed -i \"s/APP_REP/$PROD_APP_REP/g\" .ci/app.yaml\n  - sed -i \"s/AppDomain/$PROD_EXP_HOST/g\" .ci/app.yaml\n  - sed -i \"s/ProjectImage/$PROD_HARBOR\\/example\\/$IMAGE/g\" .ci/app.yaml\n  - sed -i \"s/DOCKER_KEY/$PROD_KEY/g\" .ci/app.yaml\n  #\n  - mkdir -p /opt/kube/$PROJECT_NS/$APP_NAME\n  - cp -f .ci/app.yaml /opt/kube/$PROJECT_NS/$APP_NAME\n  - kubectl --kubeconfig=/etc/.aliyun/config apply -f .ci/app.yaml\n\n1/3 rollback:                                                            ### 定义生产环境回退job  \n  stage: prod-rollback\n  tags:\n    - prod-shell\n  when: manual\n  only:\n    - master\n    - /^release.*$/\n  variables:\n    PROJECT_NS: '$CI_PROJECT_NAMESPACE-prod-deploy'                      # 定义job内变量覆盖全局变量设置\n  script:\n  - kubectl --kubeconfig=/etc/.aliyun/config -n $PROJECT_NS rollout undo deployment $CI_PROJECT_NAME --to-revision=1\n\n2/3 rollback:\n  stage: prod-rollback\n  tags:\n    - prod-shell\n  when: manual\n  only:\n    - master\n    - /^release.*$/\n  variables:\n    PROJECT_NS: '$CI_PROJECT_NAMESPACE-prod-deploy'                      # 定义job内变量覆盖全局变量设置\n  script:\n  - kubectl --kubeconfig=/etc/.aliyun/config -n $PROJECT_NS rollout undo deployment $CI_PROJECT_NAME --to-revision=2\n\n3/3 rollback:\n  stage: prod-rollback\n  tags:\n    - prod-shell\n  when: manual\n  only:\n    - master\n    - /^release.*$/\n  variables:\n    PROJECT_NS: '$CI_PROJECT_NAMESPACE-prod-deploy'                      # 定义job内变量覆盖全局变量设置\n  script:\n  - kubectl --kubeconfig=/etc/.aliyun/config -n $PROJECT_NS rollout undo deployment $CI_PROJECT_NAME --to-revision=3\nEOF\n```\n\n恭喜终于看完 gitlab-ci.yml 文件，怎么样，是不是一千个人可以写出一万个 CI/CD 流程 :)\n"
  },
  {
    "path": "docs/deprecated/gitlab/gitlab-install.md",
    "content": "# 安装 gitlab [Deprecated]\n\ngitlab 是深受企业用户喜爱的基于 git 的代码管理系统。安装 gitlab 最理想的方式是利用 gitlab charts 部署到 k8s 集群上，但此方式还未成熟，期待后续推出更成熟稳定版本；本文使用 Docker 方式安装 gitlab:\n\n- 环境：Ubuntu 16.04，虚机内存/CPU/存储请根据实际使用情况配置，一般`4C/8G/200G`足够\n- 安装 docker: 18.06.1-ce\n\n## 准备启动脚本\n\n``` bash\n$ cat > gitlab-setup.sh << EOF\n#!/bin/bash\n# 注意：设置 gitlab_shell_ssh_port 是为了后续可以使用 SSH 方式访问你的项目\ndocker run --detach \\\\\n    --hostname gitlab.test.com \\\\\n    --env GITLAB_OMNIBUS_CONFIG=\"external_url 'http://gitlab.test.com/'; gitlab_rails['gitlab_shell_ssh_port'] = 6022;\" \\\\\n    --publish 443:443 --publish 80:80 --publish 6022:22 \\\\\n    --name gitlab \\\\\n    --restart always \\\\\n    --volume /srv/gitlab/config:/etc/gitlab \\\\\n    --volume /srv/gitlab/logs:/var/log/gitlab \\\\\n    --volume /srv/gitlab/data:/var/opt/gitlab \\\\\n    docker.mirrors.ustc.edu.cn/gitlab/gitlab-ce:11.2.2-ce.0\nEOF\n```\n执行启动脚本：`sh gitlab-setup.sh` 执行成功后，等待数分钟可以看到\n\n```\n$ docker ps -a\nCONTAINER ID        IMAGE                                                 COMMAND             CREATED             STATUS                   PORTS                                                            NAMES\n4f9d5f97f494        docker.mirrors.ustc.edu.cn/gitlab/gitlab-ce:11.2.2-ce.0   \"/assets/wrapper\"   9 minutes ago       Up 9 minutes (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:6022->22/tcp   gitlab\n```\n## 配置 gitlab\n\n```\n$ docker exec -it gitlab vi /etc/gitlab/gitlab.rb\n```\n请阅读后修改（因为前面docker run 已经指定了必要参数，可以不修改，后续有需要再修改），修改保存以后需要重启容器\n\n```\n$ docker restart gitlab\n```\n## 首次访问 gitlab\n\n使用域名`gitlab.test.com`或者该主机 IP 首次登录时会要求设置 root 用户的密码，完成后就可以用 root 和新设密码登录；然后按需创建 Group, User, Projects等，还有相关配置。\n\n## 备份数据\n\n无论是企业、组织、个人都十分重视代码资产，之前我们的 gitlab 安装是单机版的，虽然可以有硬盘 raid 等保护，还有是丢失 gitlab 数据和配置的风险，因此我们有必要再做一些备份操作。这里利用 crontab 定期执行 rsync 命令备份到其他服务器。\n\n``` bash\n# 创建备份脚本\ncat > /root/gitlab-backup.sh << EOF\n#!/bin/bash\n# 请事先配置 gitlab 服务器到备份服务器的免密码 ssh 登录\nrsync -av --delete /srv/gitlab/config '-e ssh -l root' 192.168.1.xx:/backup_gitlab/config\nrsync -av --delete /srv/gitlab/data '-e ssh -l root' 192.168.1.xx:/backup_gitlab/data\nEOF\n\n# 创建并应用 crontab\ncat > /etc/cron.d/gitlab-backup << EOF\n## 每3个小时同步备份一次，具体根据需要修改\n11 */3 * * * root bash /root/gitlab-backup.sh > /root/gitlab/sync.log 2>&1\nEOF\n```\n如果 gitlab 服务器真的出现不可恢复的故障，丢失数据，那么至少保留有3小时前的备份，利用备份的文件，同样再用 docker 挂载 volume的方式运行，这样就可以恢复原 gitlab 服务运行。\n\n## 升级 gitlab\n\n因为前面使用了 docker 方式安装，因此 gitlab 升级很方便。\n\n- 升级前停止/删除容器：`$ docker stop gitlab && docker rm gitlab`\n- 如上节执行备份数据\n- 修改 gitlab-setup.sh 指定新的版本，执行该脚本\n\n## 参考\n\n- 1.[Install GitLab with Docker](https://docs.gitlab.com/omnibus/docker/)\n"
  },
  {
    "path": "docs/deprecated/gitlab/gitlab-runner.md",
    "content": "## 安装 Gitlab Runner\n\nGitlab Runner 安装方式有很多，可以参考官网文档 https://docs.gitlab.com/runner/install/; 这里为了方便直接在 Ubuntu1604 上 apt方式安装了。\n\n``` bash\n$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash\n$ apt-get install gitlab-runner\n```\n\n安装完成后就可以看到服务运行状态：`systemctl status gitlab-runner`，因为示例的java spring boot 项目需要，该虚机上要同时安装和配置 mvn 和 docker 环境。\n\n注意：需要通过 gitlab-runner shell 执行docker镜像打包等命令，因此要修改下 gitlab-runner 服务运行用户：\"--user\" \"gitlab-runner\" 改成 \"--user\" \"root\"\n\n``` bash\nvi /etc/systemd/system/gitlab-runner.service\n[Unit]\nDescription=GitLab Runner\nAfter=syslog.target network.target\nConditionFileIsExecutable=/usr/lib/gitlab-runner/gitlab-runner\n\n[Service]\nStartLimitInterval=5\nStartLimitBurst=10\nExecStart=/usr/lib/gitlab-runner/gitlab-runner \"run\" \"--working-directory\" \"/home/gitlab-runner\" \"--config\" \"/etc/gitlab-runner/config.toml\" \"--service\" \"gitlab-runner\" \"--syslog\" \"--user\" \"gitlab-runner\"\n\nRestart=always\nRestartSec=120\n\n[Install]\nWantedBy=multi-user.target\n```\n\n以上配置改完保存后执行服务重启：\n\n``` bash\n$ systemctl daemon-reload\n$ systemctl restart gitlab-runner\n```\n\n### 注册 Runner\n\n运行命令`gitlab-runner register`后进入交互式界面，按照提示注册，关注下面注释内容。\n\n``` bash\n$ gitlab-runner register\nRuntime platform                                    arch=amd64 os=linux pid=3269 revision=8bb608ff version=11.7.0\nRunning in system-mode.                            \n                                                   \nPlease enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):\nhttp://gitlab.test.com/       ### 这里输入gitlab URL\nPlease enter the gitlab-ci token for this runner:\ntzfBWCX-tQxxo1TCcoeJ          ### 这里输入项目的token\nPlease enter the gitlab-ci description for this runner:\n[k8s403]: build-shell         ### 命名此runner\nPlease enter the gitlab-ci tags for this runner (comma separated):\nbuild-shell                   ### 重要：指定runner tag，在gitlab-ci.yml文件中定义该tag才能执行 mvn编译/docker打包的任务\nRegistering runner... succeeded                     runner=tzfBWCX-\nPlease enter the executor: docker-ssh, parallels, shell, ssh, virtualbox, kubernetes, docker, docker+machine, docker-ssh+machine:\nshell                         ### 作为入门，在虚机上运行shell命令方式，方便调试\nRunner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!\n```\n另外根据示例项目的ci/cd流程，还需要注册标签 tag 为 `beta-shell` 和 `prod-shell` 的两个 Runner; 注意这两个runner所在虚机需要分别配置测试k8s和生产k8s的 kubeconfig 配置，这样 Runner 才能通过 shell 脚本执行 kubectl apply 命令部署应用。三个 Runner 注册成功后可以看到如图：\n\n![active-runner](pics/active-runner.jpg)\n\n"
  },
  {
    "path": "docs/deprecated/gitlab/readme.md",
    "content": "# Gitlab CI/CD 基础\n\nGitlab-ci 兼容 travis ci 格式，也是最流行的 CI 工具之一；本文讲解利用 gitlab, gitlab-runner, docker, harbor, kubernetes 等流行开源工具搭建一个自动化CI/CD流水线；示例配置以简单实用为原则，暂时没有选用 dind（docker in dockers）打包、gitlab Auto DevOps 等方式。一个最简单的流水线如下：\n\n- 代码提交 --> 镜像构建 --> 部署测试 --> 部署生产\n\n## 0.前提条件\n\n- 正常运行的 gitlab，[安装 gitlab 文档](gitlab-install.md)\n- 正常运行的容器仓库，[安装 Harbor 文档](../harbor.md)\n- 正常运行的 k8s，可以本地自建 k8s 集群，也可以使用公有云 k8s 集群\n- 若干虚机运行 gitlab-runner: 运行自动化流水线任务 pipeline job\n- 了解代码管理流程 gitflow 等\n\n## 1.准备测试项目代码\n\n假设你要开发一个 spring boot 项目；先登录你的 gitlab 账号，创建项目，上传你的代码；项目根目录看起来如下：\n\n```\n-rw-r--r-- 1 root root    44 Jan  2 16:38 eclipse.bat\ndrwxr-xr-x 8 root root  4096 Jan  7 15:29 .git/\n-rw-r--r-- 1 root root   276 Jan  7 08:44 .gitignore\ndrwxr-xr-x 3 root root  4096 Jan  7 08:44 example-api/\ndrwxr-xr-x 3 root root  4096 Jan  7 08:44 example-biz/\ndrwxr-xr-x 3 root root  4096 Jan  2 16:38 example-dal/\ndrwxr-xr-x 3 root root  4096 Jan  2 16:38 example-web/\n-rw-r--r-- 1 root root    54 Jan  2 16:38 install.bat\n-rw-r--r-- 1 root root 10419 Jan  2 16:38 pom.xml\n```\n传统做法是在本地配置好相关环境后使用 mvn 编译生成jar包，然后测试运行jar；这里我们要把应用打包成 docker 镜像，并创建 CI/CD 流水线：如下示例，在项目根目录新增创建2个文件夹及相关文件\n\n``` bash\ndockerfiles        ### 新增文件夹用来 docker 镜像打包\n└── Dockerfile     # 定义 docker 镜像\n.ci                ### 新增文件夹用来存放 CI/CD 相关内容\n├── app.yaml       # k8s 平台的应用部署文件\n├── config.sh      # 配置替换脚本\n└── gitlab-ci.yml  # gitlab-ci 的主配置文件\n```\n\n## 2.准备 docker 镜像描述文件 Dockerfile\n\n我们把 Dockerfile 放在独立目录下，java spring boot 应用可以这样写：\n\n``` bash\ncat > dockerfiles/Dockerfile << EOF\nFROM openjdk:8-jdk-alpine\nVOLUME /tmp\nCOPY *.jar app.jar         # 这里 *.jar 包就是后续在cicd pipeline 过程中 mvn 生成的jar包移动到此目录\nENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-jar\",\"/app.jar\"]\nEOF\n```\n\n## 3.准备 CI/CD 相关脚本和文件\n\n装完 gitlab 后使用浏览器登录gitlab，很容易找到帮助文档，里面有介绍gitlab-ci的内容（文档权威、详细！请多多阅读~ 随着CI/CD流程的深入，部分内容也可以回来查阅），先看如下文档（假设你本地gitlab使用域名`gitlab.test.com`）\n\n- 文档首页 http://gitlab.test.com/help\n- gitlab-ci 基本概念 http://gitlab.test.com/help/ci/README.md\n- variables 变量 http://gitlab.test.com/help/ci/variables/README.md\n\n目录`.ci`下面的三个文件`app.yaml`, `config.sh`, `gitlab-ci.yml`是互相关联的；gitlab-ci.yml 文件中会调用到另外两个文件；文件之间又通过一些变量定义联系，流程中用到的变量大致可以分为三种：\n\n- 第一种是gitlab自身预定义变量（比如项目名: CI_PROJECT_NAME，流水线ID: CI_PIPELINE_ID）；无需更改；\n- 第二种是在gitlab-ci.yml文件中定义的变量，一般是少量的自定义变量；按需少量改动；\n- 第三种是用户可以在项目web界面配置的变量：“Settings”>\"CI/CD\">\"Variables\"，本示例项目用到该类型变量举例：\n\n|变量|值|注解|\n|:-|:-|:-|\n|BETA_APP_REP|1|beta环境应用副本数|\n|BETA_DB_HOST|1.1.1.1:3306|beta环境应用连接数据库主机|\n|BETA_DB_PWD|xxxx|beta环境数据库连接密码|\n|BETA_DB_USR|xxxx|beta环境数据库连接用户|\n|BETA_REDIS_HOST|1.1.1.2|beta环境redis主机|\n|BETA_REDIS_PORT|6379|beta环境redis端口|\n|BETA_REDIS_PWD|xxxx|beta环境redis密码|\n|BETA_HARBOR|1.1.1.3|beta环境镜像仓库地址|\n|BETA_HARBOR_PWD|xxxx|beta环境镜像仓库密码|\n|BETA_HARBOR_USR|xxxx|beta环境镜像仓库用户|\n|PROD_APP_REP|2|prod环境应用副本数|\n|PROD_DB_HOST|2.2.2.1:3306|prod环境应用连接数据库主机|\n|PROD_DB_PWD|xxxx|prod环境数据库连接密码|\n|PROD_DB_USR|xxxx|prod环境数据库连接用户|\n|PROD_REDIS_HOST|2.2.2.2|prod环境redis主机|\n|PROD_REDIS_PORT|6379|prod环境redis端口|\n|PROD_REDIS_PWD|xxxx|prod环境redis密码|\n|PROD_HARBOR|2.2.2.3|prod环境镜像仓库地址|\n|PROD_HARBOR_PWD|xxxx|prod环境镜像仓库密码|\n|PROD_HARBOR_USR|xxxx|prod环境镜像仓库用户|\n|...|...|根据项目需要自行添加设置|\n\n掌握了以上基础知识，可以开始以下三个任务：\n\n- 3.1[配置 gitlab-ci.yml](gitlab-ci.yml.md), 整个CI/CD的主配置文件，定义所有的CI/CD阶段和每个阶段的任务\n- 3.2[配置 config.sh](config.sh.md)，根据不同分支/环境替换不同的应用程序变量（对应上述第三种变量）\n- 3.3[配置 app.yaml](app.yaml.md)，K8S应用部署简单模板，替换完成后可以部署到测试/生产的K8S平台上\n\n## 4.为项目配置 CI/CD 及创建 RUNNER\n\n使用浏览器访问gitlab，登录后，在项目页面进行配置，如图：\n\n![cicd-settings](pics/cicd-setting.jpg)\n\n- 在 General pipelines 中配置 Custom CI config path 为 .ci/gitlab-ci.yml\n- 在 Variables 中配置需要用到的变量\n- 在 Runners 中配置注册 gitlab-runner 实例（runner 就是用来自动执行ci job的），点进去后如图：\n\n![runner](pics/runner.jpg)\n\n- 作为入门，先来手动创建 specific Runner，后续同样可以创建 Group Runners/Shared Runners，使用起来更方便；本文档暂不涉及在 kubernetes 自动创建 Runner\n  - 按照官网文档安装 Gitlab Runner，参考[文档](gitlab-runner.md)\n  - 记下 gitlab URL, 项目 token，注册 Runner 时要用到\n  - 在 Gitlab Runner 注册本项目\n\n## 5.提交代码测试 CI/CD Pipelines\n\n终于经过 1~4 步骤把示例项目的CI/CD 流水线创建出来了，是时候试试提交代码测试下成果了；别担心，初次 CI/CD job执行一般都会失败的:) 好在现在你已经基本了解了所有CI/CD流程与配置，失败了就查看错误日志一一排除。另外因为采用虚机安装 Runner 执行 shell 脚本的方式执行 ci job，我们始终可以登录虚机以手动执行 shell 脚本的方式调试，这对于初学来说很有帮助。查看 CI/CD 执行情况如图：\n\n![cicd-pipeline](pics/cicd-pipeline.jpg)\n\n## 6.gitlab-ci 安全实践\n\n现在为止 CICD Pipelines 已经可以跑通了，甚至稍微修改下 gitlab-ci.yml 配置，项目代码每一次提交后可以自动执行`编译`、`打包`、`部署测试`、`部署生产`等等工作；也许你还没来得及慢慢体会这顺畅的感觉，赶紧先踩个刹车，控制下车速；因为现在你需要考虑 gitlab-ci 的安全配置了，这很重要！\n\n首先 gitlab 项目的基本安全就是项目成员控制，访问项目的权限分为：所有者（Owner），维护者（Maintainer），开发者（Developer），报告者（Reporter），访客（Guest）；详细的权限介绍请查阅官方文档，这里简单地介绍两类权限：所有者和维护者属于`特权用户`，开发者属于`普通用户`，他们应该具有如下权限区分：\n\n- 特权用户对整个项目负责，包括项目代码开发、配置管理、CI流程、测试环境、生产环境等\n- 特权用户可以提交代码到所有分支包括 master/release 分支，执行所有 ci job\n- 普通用户只负责对应项目模块代码开发、不接触程序配置、只能访问测试环境\n- 普通用户只能提交代码到 develop/feature 分支，只能执行这两个分支的 ci job\n\n以下的安全实践配置作为个人经验分享，仅作参考；如果你的项目需要更高的安全性，请阅读 gitlab-ci 官方相关文档，尝试找到属于自己的最佳实践。\n\n- 正确设置项目成员（Settings > Members），严格限制项目维护者（Maintainer）人数，大部分应该作为开发者（Developer）提交代码\n- 配置项目受保护分支/受保护标签，一般把master/release分支设置成受保护分支，限制只有维护者才能在保护分支commit和merge，从而限制只有维护者才能执行部署生产的 ci job，http://gitlab.test.com/help/user/project/protected_branches.md\n- 配置受保护的变量，受保护的变量只在受保护分支和受保护tag的pipeline中可见，防止生产环境配置参数泄露，http://gitlab.test.com/help/ci/variables/README#protected-variables\n- 配置受保护的Runner，只能执行受保护分支上的 ci jobs\n- CICD Pipelines 中发布生产的任务请设置手动执行，同样生产的回退任务设置手动执行\n\n"
  },
  {
    "path": "docs/deprecated/jenkins.md",
    "content": "# Jenkins CI/CD\n\n**此文档已过期，仅留档**\n\n## 前言\n本文档介绍如何快速通过K8s集群实现Jenkins 动态Slave CI/CD流程。\n\n## 开始之前\n在开始之前需要准备以下环境：\n- k8s dns组件  \n参考文档：[kubedns](kubedns.md)\n- helm  \n为了简化部署，通过helm来安装Jenkins，可参考文档：[helm](helm.md)\n- 持久化存储  \n这里使用**NFS**演示，参考文档：[cluster-storage](../setup/08-cluster-storage.md)。\n如果k8s集群是部署在公有云，也可使用厂商的NAS等存储方案，项目中已集成支持阿里云NAS，其他的方案参考相关厂商文档\n\n- Ingress Controller(nginx-ingress/traefik)  \n默认是通过Ingress访问Jenkins，因此需要安装一种`Ingress Controller`。参考文档：[ingress](ingress.md)\n- Gitlab 代码管理仓库  \n用于提交代码后自动触发CI, 目前项目中还没有相关内容，可[参考官网](https://about.gitlab.com/installation/)进行安装。\n\n## 安装Jenkins\n执行以下命令快速安装：\n```\nhelm install manifests/jenkins/ --name jenkins\n```\n如果通过/etc/kubeasz/roles/helm/helm.yml安装的helm，安装过程会出现如下错误\n\n``` bash\nE0703 08:40:22.376225   19888 portforward.go:331] an error occurred forwarding 41655 -> 44134: error forwarding port 44134 to pod 5098414beaaa07140a4ba3240690b1ce989ece01e5db33db65eec83bd64bdedf, uid : exit status 1: 2018/07/03 08:40:22 socat[19991] E write(5, 0x1aec120, 3424): Connection reset by peer\nError: transport is closing\n```\n请执行以下命令快速安装进行修复：\n```\nhelm install --tls manifests/jenkins/ --name jenkins\n```\n\n由于初始化过程中，默认安装指定的插件，所以启动较慢，大概5-10分钟左右就可以启动完成了。  \n\n部分默认配置说明：\n**注**：以下配置都定义在`manifests/jenkins/values.yaml`文件中。\n<table border=\"0\">\n    <tr>\n        <td><b>字段</b></td>\n        <td><b>说明</b></td>\n        <td><b>默认值</b></td>\n    </tr>\n    <tr>\n        <td>InstallPlugins</td>\n        <td>初始化安装的插件</td>\n        <td>\n            <ul>\n                <li>kubernetes:1.6.3</li>\n                <li>workflow-aggregator:2.5</li>\n                <li>workflow-job:2.21</li>\n                <li>credentials-binding:1.16</li>\n                <li>git:3.9.0</li>\n                <li>gitlab:1.5.6</li>\n            </ul>\n        </td>\n    </tr>\n    <tr>\n        <td>HostName</td>\n        <td>Ingress访问入口</td>\n        <td>jenkins.local.com</td>\n    </tr>\n    <tr>\n        <td>AdminPassword</td>\n        <td>admin登录密码</td>\n        <td>admin</td>\n    </tr>\n    <tr>\n        <td>UpdateCenter</td>\n        <td>插件下载镜像地址</td>\n        <td>https://mirrors.tuna.tsinghua.edu.cn/jenkins</td>\n    </tr>\n    <tr>\n        <td>StorageClass</td>\n        <td>持久化存储SC</td>\n        <td>nfs-dynamic-class</td>\n    </tr>\n</table>\n\n\n## 配置Kubernetes plugin\n登录Jenkins，点击左边导航`系统管理`——>`系统设置`，拖动到最下面可以看到`云——>Kubernetes`配置，默认配置有以下字段：  \n\n- Name：配置名称，后面运行测试的时候会用到，用于区别多个Kubernetes配置，默认为：kubernetes\n- Kubernetes URL：集群访问url，可通过`kubectl cluster-info`查看，如果集群有部署**DNS**插件, 也可以直接填服务名称(自动解析)，默认使用服务名称：https://kubernetes\n- Jenkins URL：Jenkins访问地址，默认使用服务名称+端口号\n\n在Jenkins初始化时，默认都已经配置好了，可以直接新建项目测试了。\n\n## 简单测试\n点击左边：新建任务——>流水线(Pipeline)\n任务名称可以随便起，这里为：k8s-test\n配置——>流水线，选择`Pipeline script`\n以下为测试脚本内容：\n```\npodTemplate(label: 'jenkins-slave', cloud: 'kubernetes')\n{\n    node ('jenkins-slave') {\n        stage('test') {\n            echo \"hello, world\"\n            sleep 60\n        }\n    }\n}\n```\n\n- cloud：插件配置中的Name\n- label：插件配置中的Images——>Kubernetes Pod Tempalte——>Labels\n- node：与label一致即可\n\n保存配置，点击立即构建，查看控制台输出，出现以下内容就表示运行成功了：\n```\nAgent default-lsths is provisioned from template Kubernetes Pod Template\nAgent specification [Kubernetes Pod Template] (jenkins-slave): \n* [jnlp] jenkins/jnlp-slave:alpine(resourceRequestCpu: 200m, resourceRequestMemory: 256Mi, resourceLimitCpu: 200m, resourceLimitMemory: 256Mi)\n\nRunning on default-lsths in /home/jenkins/workspace/k8s-test\n[Pipeline] {\n[Pipeline] stage\n[Pipeline] { (test)\n[Pipeline] echo\nhello, world\n[Pipeline] sleep\nSleeping for 1 min 0 sec\n[Pipeline] }\n[Pipeline] // stage\n[Pipeline] }\n[Pipeline] // node\n[Pipeline] }\n[Pipeline] // podTemplate\n[Pipeline] End of Pipeline\nFinished: SUCCESS\n```\n\n\n## 配置自动触发CI\n\n- 配置Gitlab项目  \n在`Gitlab`中创建一个测试项目，将上面测试的脚本内容写入到一个`Jenkinsfile`文件中，然后上传到该测试项目根路径下。\n\n- 配置Jenkins项目  \n点击项目`配置`——>`构建触发器`——>勾选`Build when a change is pushed to GitLab. GitLab webhook URL:http://jenkins.local.com/project/k8s-test`——>保存配置\n\n- 配置Webhook  \n进入Gitlab测试项目的`Settings——>Integrations`，一般只需要填写`URL`即可，其他的可根据需求环境配置\n默认Jenkins配置不允许匿名用户触发构建，因此还需要添加用户和token。  \nURL的格式为：  \n`http://[UserID]:[API Token]@jenkins.local.com/project/[ProjectName]`\n\nJenkins 用户ID Token查看：\n点击右上角的`用户名——>设置——>API Token(点击Show API Token...)`\n\n最终Webhook中的URL类似：\nhttp://admin:a910b1492e39e9dd1ea48ea7f7638aaf@jenkins.local.com/project/k8s-test\n\n后面只需要我们一提交代码到Git仓库，就会自动触发Jenkins进行构建了。\n\n## 项目应用\n这里我们以一个简单的Java项目为例，实战演示如何进行CI/CD。\n基本环境配置上面已经说过了，这里就不多介绍。  \n示例项目：https://github.com/lusyoe/springboot-k8s-example\n\n结构说明：\n- 镜像构建文件：`Dockerfile`\n- k8s应用配置：`k8s-example.yaml`\n- 项目源码：`src`\n- Jenkins构建文件：`jenkins/Jenkinsfile`\n\n构建流程说明：\n- 通过Jenkins kubernetes插件，定义构建过程中所需的3个docker容器：maven、docker、kubectl (这3个容器都在一个pod中)\n- 挂载docker.sock和kubeconfig文件\n- 首先使用`maven`容器，检出代码，执行项目构建\n- 使用`docker`容器，构建镜像，推送到镜像参考\n- 使用`kubectl`容器，部署`k8s-example`应用(这里后面也可以使用helm)\n\n访问：  \n项目通过Ingress访问`k8s-example.com`，出现`hello, world`,就表示服务部署成功了。\n"
  },
  {
    "path": "docs/deprecated/kuboard.md",
    "content": "# 安装 Kuboard\n\n## Kuboard 介绍\n\nKuboard 是一款免费的 Kubernetes 管理工具，提供了丰富的功能：\n\n* Kubernetes 多集群管理\n* Kubernetes 基本管理功能\n  * 节点管理\n  * 名称空间管理\n  * 存储类/存储卷管理\n  * 控制器（Deployment/StatefulSet/DaemonSet/CronJob/Job/ReplicaSet）管理\n  * Service/Ingress 管理\n  * ConfigMap/Secret 管理\n  * CustomerResourceDefinition 管理\n* Kubernetes 问题诊断\n  * Top Nodes / Top Pods\n  * 事件列表及通知\n  * 容器日志及终端\n  * KuboardProxy (kubectl proxy 的在线版本)\n  * PortForward (kubectl port-forward 的快捷版本)\n  * 复制文件 （kubectl cp 的在线版本）\n* 认证与授权\n  * Github/GitLab 单点登录\n  * KeyCloak 认证\n  * LDAP 认证\n  * 完整的 RBAC 权限管理\n* Kuboard 特色功能\n  * Kuboard 官方套件\n    * Grafana+Prometheus 资源监控\n    * Grafana+Loki+Promtail 日志聚合\n  * Kuboard 自定义名称空间布局\n  * Kuboard 中英文语言包\n\n<p>\n  <a aria-label=\"github\" href=\"https://starchart.cc/eip-work/kuboard-press\" target=\"_blank\">\n    <img src=\"https://badgen.net/github/stars/eip-work/kuboard-press?label=github stars\"/>\n  </a>\n</p>\n\n<a href=\"https://starchart.cc/eip-work/kuboard-press\" target=\"_blank\">\n  <img src=\"https://starchart.cc/eip-work/kuboard-press.svg\" alt=\"Kubernetes教程_Kuboard_Github_Star\" style=\"height: 320px; width: 540px;\">\n</a>\n\n点击这里可以查看 [Kuboard 的安装文档](https://kuboard.cn/install/v3/install.html)\n\n## 在线演示\n\n<div>\n  在线演示环境中，您具备 <span style=\"color: red; font-weight: bold\">只读</span> 权限，只能体验 Kuboard 的一部分功能。<br/>\n</div>\n<div style=\"padding: 10px; border: 1px solid #eee; border-radius: 10px; margin: 10px 0px; background-color: #fafafa;\">\n  <a href=\"http://demo.kuboard.cn\" target=\"_blank\">http://demo.kuboard.cn</a> <br/>\n  <div style=\"width: 60px; display: inline-block; margin-top: 5px;\">用&nbsp;户</div>\n  demo <br/>\n  <div style=\"width: 60px; display: inline-block;\">密&nbsp;码</div>\n  demo123\n</div>\n\n## 特点介绍\n\n相较于 Kubernetes Dashboard 等其他 Kubernetes 管理界面，Kuboard 的主要特点有：\n\n* 多种认证方式\n\n  Kuboard 可以使用内建用户库、gitlab / github 单点登录或者 LDAP 用户库进行认证，避免管理员将 ServiceAccount 的 Token 分发给普通用户而造成的麻烦。使用内建用户库时，管理员可以配置用户的密码策略、密码过期时间等安全设置。\n\n  ![Kuboard登录界面](https://kuboard.cn/images/intro.assets/image-20210405162940278.png)\n\n* 多集群管理\n\n  管理员可以将多个 Kubernetes 集群导入到 Kuboard 中，并且通过权限控制，将不同集群/名称空间的权限分配给指定的用户或用户组。\n\n  ![Kuboard集群列表页](https://kuboard.cn/images/intro.assets/image-20210405164029151.png)\n\n* 微服务分层展示\n\n  在 Kuboard 的名称空间概要页中，以经典的微服务分层方式将工作负载划分到不同的分层，更加直观地展示微服务架构的结构，并且可以为每一个名称空间自定义名称空间布局。\n\n  ![Kuboard-微服务分层](https://kuboard.cn/images/intro.assets/image-20210405164532452.png)\n\n* 工作负载的直观展示\n\n  Kuboard 中将 Deployment 的历史版本、所属的 Pod 列表、Pod 的关联事件、容器信息合理地组织在同一个页面中，可以帮助用户最快速的诊断问题和执行各种相关操作。\n\n  ![Kuboard-工作负载详情](https://kuboard.cn/images/intro.assets/image-20210405180147614.png)\n\n* 工作负载编辑\n\n  Kuboard 提供了图形化的工作负载编辑界面，用户无需陷入繁琐的 YAML 文件细节中，即可轻松完成对容器的编排任务。支持的 Kubernetes 对象类型包括：Node、Namespace、Deployment、StatefulSet、DaemonSet、Secret、ConfigMap、Service、Ingress、StorageClass、PersistentVolumeClaim、LimitRange、ResourceQuota、ServiceAccount、Role、RoleBinding、ClusterRole、ClusterRoleBinding、CustomResourceDefinition、CustomResource 等各类常用 Kubernetes 对象，\n\n  ![Kuboard-工作负载编辑](https://kuboard.cn/images/intro.assets/image-20210405180800712.png)\n\n* 存储类型支持\n\n  在 Kuboard 中，可以方便地对接 NFS、CephFS 等常用存储类型，并且支持对 CephFS 类型的存储卷声明执行扩容和快照操作。\n\n  ![Kuboard-存储类](https://kuboard.cn/images/intro.assets/image-20210405181928653.png)\n\n* 丰富的互操作性\n\n  可以提供许多通常只在 `kubectl` 命令行界面中才提供的互操作手段，例如：\n\n  * Top Nodes / Top Pods\n  * 容器的日志、终端\n  * 容器的文件浏览器（支持从容器中下载文件、上传文件到容器）\n  * KuboardProxy（在浏览器中就可以提供 `kubectl proxy` 的功能）\n\n  ![Kuboard-文件浏览器](https://kuboard.cn/images/intro.assets/image-20210405182805543.png)\n\n* 套件扩展\n\n  Kuboard 提供了必要的套件库，使得用户可以根据自己的需要扩展集群的管理能力。当前提供的套件有：\n\n  * 资源层监控套件，基于 Prometheus / Grafana 提供 K8S 集群的监控能力，可以监控集群、节点、工作负载、容器组等各个级别对象的 CPU、内存、网络、磁盘等资源的使用情况；\n  * 日志聚合套件，基于 Grafana / Loki / Promtail 实现日志聚合；\n  * 存储卷浏览器，查看和操作存储卷中的内容；\n\n  ![Kuboard-套件扩展](https://kuboard.cn/images/intro.assets/image-20210405183652378.png)\n\n\n\n访问 Kuboard 网站 https://kuboard.cn 可以加入 Kuboard 社群，并获得帮助。\n"
  },
  {
    "path": "docs/deprecated/practice/dockerize_system_service.md",
    "content": "# 容器化系统服务\n\n## 容器化 haproxy\n\n本例使用 [docker hub 官方](https://github.com/docker-library/haproxy) 维护的 haproxy 镜像；haproxy 配置举例如下\n\n```\nglobal\n        log stdout format raw local1 notice\n        nbproc 1\n\ndefaults\n        log     global\n        timeout connect 5s\n        timeout client  10m\n        timeout server  10m\n\nlisten apiservers\n        bind 0.0.0.0:6443\n        mode tcp\n        option tcplog\n        option dontlognull\n        option dontlog-normal\n        balance roundrobin \n        server 192.168.1.1 192.168.1.1:6443 check inter 10s fall 2 rise 2 weight 1\n        server 192.168.1.2 192.168.1.2:6443 check inter 10s fall 2 rise 2 weight 1\n```\n\n在 systemd 系统上编写服务文件如下 /etc/systemd/system/haproxy.service\n\n```\n[Unit]\nDescription=haproxy\nDocumentation=https://github.com/docker-library/haproxy\nAfter=docker.service\nRequires=docker.service\n\n[Service]\nUser=root\nExecStart=/bin/docker run \\\n  --name haproxy \\\n  --publish 6443:6443 \\\n  --volume /etc/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \\\n  docker.io/library/haproxy:1.9.8-alpine\nExecStop=/bin/docker rm -f haproxy\nExecReload=/bin/docker kill -s HUP haproxy\nRestart=always\nRestartSec=10\nDelegate=yes\nLimitNOFILE=50000\nLimitNPROC=50000\n\n[Install]\nWantedBy=multi-user.target\n```\n\n## 容器化 chrony\n\n- chrony 服务器端配置（假设chrony服务器端192.168.1.1）\n\n```\n$ cat /etc/chrony.conf\n# Use public servers from the pool.ntp.org project.\nserver ntp1.aliyun.com iburst\nserver ntp2.aliyun.com iburst\npool pool.ntp.org iburst\n\n# Ignor source level\nstratumweight 0\n\n# Record the rate at which the system clock gains/losses time.\ndriftfile /var/lib/chrony/drift\n\n# Allow the system clock to be stepped in the first five updates\n# if its offset is larger than 1 second.\nmakestep 1 5\n\n# Enable kernel synchronization of the real-time clock (RTC).\nrtcsync\n\n# Allow NTP client access from local network.\nallow 0.0.0.0/0\n\n# Serve time even if not synchronized to a time source.\nlocal stratum 10\n\n# Select which information is logged.\n#log measurements statistics tracking\n\n#\nnoclientlog\n```\n- chrony 客户端配置\n\n```\n$ cat /etc/chrony.conf\n# Use local chrony server.\nserver 192.168.1.1 iburst\n\n# Record the rate at which the system clock gains/losses time.\ndriftfile /var/lib/chrony/drift\n\n# Allow the system clock to be stepped in the first five updates\n# if its offset is larger than 1 second.\nmakestep 1 5\n\n# Enable kernel synchronization of the real-time clock (RTC).\nrtcsync\n\n# Select which information is logged.\n#log measurements statistics tracking\n```\n\n- 在 systemd 系统上编写服务文件如下 /etc/systemd/system/chrony.service\n\n```\n[Unit]\nDescription=chrony\nDocumentation=https://github.com/kubeasz/dockerfiles/chrony\nAfter=docker.service\nRequires=docker.service\n\n[Service]\nUser=root\nExecStart=/opt/kube/bin/docker run \\\n  --cap-add SYS_TIME \\\n  --name chrony \\\n  --network host \\\n  --volume /etc/chrony.conf:/etc/chrony/chrony.conf \\\n  --volume /var/lib/chrony:/var/lib/chrony \\\n  easzlab/chrony:0.1.0\nExecStartPost=/sbin/iptables -t raw -A PREROUTING -p udp -m udp --dport 123 -j NOTRACK\nExecStartPost=/sbin/iptables -t raw -A OUTPUT -p udp -m udp --sport 123 -j NOTRACK\nExecStop=/opt/kube/bin/docker rm -f chrony\nRestart=always\nRestartSec=10\nDelegate=yes\n\n[Install]\nWantedBy=multi-user.target\n```\n"
  },
  {
    "path": "docs/deprecated/practice/es_cluster.md",
    "content": "# Elasticsearch 部署实践\n\n`Elasticsearch`是目前全文搜索引擎的首选，它可以快速地储存、搜索和分析海量数据；也可以看成是真正分布式的高效数据库集群；`Elastic`的底层是开源库`Lucene`；封装并提供了`REST API`的操作接口。\n\n## 单节点 docker 测试安装 \n \n``` bash\ncat > es-start.sh << EOF\n#!/bin/bash\n\nsysctl -w vm.max_map_count=262144\n\ndocker run --detach \\\n   --name es01 \\\n   -p 9200:9200 -p 9300:9300 \\\n   -e \"discovery.type=single-node\" \\\n   -e \"bootstrap.memory_lock=true\" --ulimit memlock=-1:-1 \\\n   --ulimit nofile=65536:65536 \\\n   --volume /srv/elasticsearch/data:/usr/share/elasticsearch/data \\\n   --volume /srv/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \\\n   jmgao1983/elasticsearch:6.4.0\nEOF\n```\n\n执行`sh es-start.sh`后，就在本地运行了。\n\n- 验证 docker 镜像运行情况  \n\n``` bash\nroot@docker-ts:~# docker ps -a\nCONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                                            NAMES\n171f3fecb596        jmgao1983/elasticsearch:6.4.0   \"/usr/local/bin/do...\"   2 hours ago         Up 2 hours          0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es01\n```\n\n- 验证 es 健康检查  \n\n``` bash\nroot@docker-ts:~# curl http://127.0.0.1:9200/_cat/health\nepoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent\n1535523956 06:25:56  docker-es     green           1         1      0   0    0    0        0             0                  -                100.0%\n```\n\n## 在 k8s 上部署 Elasticsearch 集群\n\n在生产环境下，Elasticsearch 集群由不同的角色节点组成：\n\n- master 节点：参与主节点选举，不存储数据；建议3个以上，维护整个集群的稳定可靠状态\n- data 节点：不参与选主，负责存储数据；主要消耗磁盘，内存\n- client 节点：不参与选主，不存储数据；负责处理用户请求，实现请求转发，负载均衡等功能\n\n这里使用`helm chart`来部署 (https://github.com/helm/charts/tree/master/incubator/elasticsearch)\n\n- 1.安装 helm: 以本项目[安全安装helm](../guide/helm.md)为例\n- 2.准备 PV: 以本项目[K8S 集群存储](../setup/08-cluster-storage.md)创建`nfs`动态 PV 为例\n- 3.安装 elasticsearch chart  \n\n``` bash\n$ cd /etc/kubeasz/manifests/es-cluster\n# 如果你的helm安装没有启用tls证书，请忽略以下--tls参数\n$ helm install --tls --name es-cluster --namespace elastic -f es-values.yaml elasticsearch\n```\n\n- 4.验证 es 集群  \n\n``` bash\n# 验证k8s上 es集群状态\n$ kubectl get pod,svc -n elastic \nNAME                                                   READY   STATUS    RESTARTS   AGE\npod/es-cluster-elasticsearch-client-778df74c8f-7fj4k   1/1     Running   0          2m17s\npod/es-cluster-elasticsearch-client-778df74c8f-skh8l   1/1     Running   0          2m3s\npod/es-cluster-elasticsearch-data-0                    1/1     Running   0          25m\npod/es-cluster-elasticsearch-data-1                    1/1     Running   0          11m\npod/es-cluster-elasticsearch-master-0                  1/1     Running   0          25m\npod/es-cluster-elasticsearch-master-1                  1/1     Running   0          12m\npod/es-cluster-elasticsearch-master-2                  1/1     Running   0          10m\n\nNAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE\nservice/es-cluster-elasticsearch-client      NodePort    10.68.157.105   <none>        9200:29200/TCP,9300:29300/TCP   25m\nservice/es-cluster-elasticsearch-discovery   ClusterIP   None            <none>        9300/TCP                        25m\n\n# 验证 es集群本身状态\n$ curl $NODE_IP:29200/_cat/health\n1539335131 09:05:31 es-on-k8s green 7 2 0 0 0 0 0 0 - 100.0%\n\n$ curl $NODE_IP:29200/_cat/indices?v\nhealth status index uuid pri rep docs.count docs.deleted store.size pri.store.size\nroot@k8s401:/etc/kubeasz# curl 10.100.97.41:29200/_cat/nodes?\n172.31.2.4 27 80 5 0.09 0.11 0.21 mi - es-cluster-elasticsearch-master-0\n172.31.1.7 30 97 3 0.39 0.29 0.27 i  - es-cluster-elasticsearch-client-778df74c8f-skh8l\n172.31.3.7 20 97 3 0.11 0.17 0.18 i  - es-cluster-elasticsearch-client-778df74c8f-7fj4k\n172.31.1.5  8 97 5 0.39 0.29 0.27 di - es-cluster-elasticsearch-data-0\n172.31.2.5  8 80 3 0.09 0.11 0.21 di - es-cluster-elasticsearch-data-1\n172.31.1.6 18 97 4 0.39 0.29 0.27 mi - es-cluster-elasticsearch-master-2\n172.31.3.6 20 97 4 0.11 0.17 0.18 mi * es-cluster-elasticsearch-master-1\n```\n\n### es 性能压测\n\n如上已使用 chart 在 k8s上部署了 **7** 节点的 elasticsearch 集群；各位应该十分好奇性能怎么样；官方提供了压测工具[esrally](https://github.com/elastic/rally)可以方便的进行性能压测，这里省略安装和测试过程；压测机上执行：  \n`esrally --track=http_logs --target-hosts=\"$NODE_IP:29200\" --pipeline=benchmark-only --report-file=report.md`  \n压测过程需要1-2个小时，部分压测结果如下：  \n\n``` bash\n------------------------------------------------------\n    _______             __   _____\n   / ____(_)___  ____ _/ /  / ___/_________  ________\n  / /_  / / __ \\/ __ `/ /   \\__ \\/ ___/ __ \\/ ___/ _ \\\n / __/ / / / / / /_/ / /   ___/ / /__/ /_/ / /  /  __/\n/_/   /_/_/ /_/\\__,_/_/   /____/\\___/\\____/_/   \\___/\n------------------------------------------------------\n\n|   Lap |                               Metric |         Task |       Value |    Unit |\n|------:|-------------------------------------:|-------------:|------------:|--------:|\n...\n|   All |                       Min Throughput | index-append |     16903.2 |  docs/s |\n|   All |                    Median Throughput | index-append |     17624.4 |  docs/s |\n|   All |                       Max Throughput | index-append |     19382.8 |  docs/s |\n|   All |              50th percentile latency | index-append |     1865.74 |      ms |\n|   All |              90th percentile latency | index-append |     3708.04 |      ms |\n|   All |              99th percentile latency | index-append |     6379.49 |      ms |\n|   All |            99.9th percentile latency | index-append |     8389.74 |      ms |\n|   All |           99.99th percentile latency | index-append |     9612.84 |      ms |\n|   All |             100th percentile latency | index-append |     9861.02 |      ms |\n|   All |         50th percentile service time | index-append |     1865.74 |      ms |\n|   All |         90th percentile service time | index-append |     3708.04 |      ms |\n|   All |         99th percentile service time | index-append |     6379.49 |      ms |\n|   All |       99.9th percentile service time | index-append |     8389.74 |      ms |\n|   All |      99.99th percentile service time | index-append |     9612.84 |      ms |\n|   All |        100th percentile service time | index-append |     9861.02 |      ms |\n|   All |                           error rate | index-append |           0 |       % |\n|   All |                       Min Throughput |      default |        0.66 |   ops/s |\n|   All |                    Median Throughput |      default |        0.66 |   ops/s |\n|   All |                       Max Throughput |      default |        0.66 |   ops/s |\n|   All |              50th percentile latency |      default |      770131 |      ms |\n|   All |              90th percentile latency |      default |      825511 |      ms |\n|   All |              99th percentile latency |      default |      838030 |      ms |\n|   All |             100th percentile latency |      default |      839382 |      ms |\n|   All |         50th percentile service time |      default |      1539.4 |      ms |\n|   All |         90th percentile service time |      default |     1635.39 |      ms |\n|   All |         99th percentile service time |      default |     1728.02 |      ms |\n|   All |        100th percentile service time |      default |      1736.2 |      ms |\n|   All |                           error rate |      default |           0 |       % |\n...\n```  \n\n从测试结果看：集群的吞吐可以（k8s es-client pod还可以扩展）；延迟略高一些（因为使用了nfs共享存储）；整体效果不错。\n\n### 中文分词安装\n\n安装 ik 插件即可，可以自定义已安装ik插件的es docker镜像：创建如下 Dockerfile  \n\n``` bash\nFROM jmgao1983/elasticsearch:6.4.0\n\nRUN /usr/share/elasticsearch/bin/elasticsearch-plugin install \\\n  --batch https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.0/elasticsearch-analysis-ik-6.4.0.zip \\\n  && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n```\n\n### 参考阅读\n\n1. [Elasticsearch 入门教程](http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html)\n2. [Elasticsearch 压测方案之 esrally 简介](https://segmentfault.com/a/1190000011174694)\n"
  },
  {
    "path": "docs/deprecated/practice/go_web_app/Dockerfile",
    "content": "# a demon for containerize golang web apps\n#\n# @author:\n# @repo:    \n# @ref:     \n\n# stage 1: build src code to binary\nFROM golang:1.13-alpine3.10 as builder\n\nCOPY *.go /app/\n\nRUN cd /app && go build -o hellogo .\n\n# stage 2: use alpine as base image\nFROM alpine:3.10\n\nRUN apk update && \\\n    apk --no-cache add tzdata ca-certificates && \\\n    cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \\\n    apk del tzdata && \\\n    rm -rf /var/cache/apk/*\n\nCOPY --from=builder /app/hellogo /hellogo\n\nCMD [\"/hellogo\"] \n"
  },
  {
    "path": "docs/deprecated/practice/go_web_app/Dockerfile-more",
    "content": "# build stage\nFROM golang:1.13 as builder\n\n# ENV GOPROXY=https://goproxy.cn\n# 设置 GOPROXY 是为编译时能够通过代理下载Qiang外的包\n# 设置 GOPRIVATE 是为编译时下载本地gitlab上的包时候不使用代理\nENV GOPROXY=https://goproxy.io\nENV GOPRIVATE=gitlab.yourdomain.com/*\n\nWORKDIR /root\n\nCOPY ./ .\n\n# 本地 gitlab 上的项目非公开，编译时需要用 ssh key 的方式下载本地 gitlab 包\n# 提前把 ssh key 中的公钥上传到gitlab 个人profile中的 SSH KEY 中\n# 在 docker build 时通过命令行参数用--build-arg 'SSH_PKEY=${KEY_TXT}' 传入\n# 在 CICD 流水线中，${KEY_TXT} 可以是jenkins中的secret-text参数，也可以是gitlab-ci中的secret variables\nARG SSH_PKEY\n\n# 设置 git config 是为了拉区项目时使用ssh方式 git@gitlab.yourdomain.com:xxx/yyy.git\n# \n\nRUN git config --global url.\"git@gitlab.yourdomain.com:\".insteadof \"https://gitlab.yourdomain.com/\" && \\\n   mkdir -p /root/.ssh && \\\n   echo \"-----BEGIN RSA PRIVATE KEY-----\" > /root/.ssh/id_rsa && \\\n   echo \"${SSH_PKEY}\" >> /root/.ssh/id_rsa && \\\n   echo \"-----END RSA PRIVATE KEY-----\" >> /root/.ssh/id_rsa && \\\n   sed -i \"2s/ /\\\\n/g\" /root/.ssh/id_rsa && \\\n   echo \"StrictHostKeyChecking no\" > /root/.ssh/config && \\\n   chmod 600 /root/.ssh/id_rsa\n\nRUN go mod tidy && \\\n    go mod download\n\nRUN CGO_ENABLED=0 GOOS=linux go build -installsuffix cgo -o main cmd/main.go\n\n# final stage\nFROM alpine:3.10\n\nWORKDIR /home/admin/bin\n\nCOPY --from=builder /root/main .\n\nCMD [\"./main\"]\n"
  },
  {
    "path": "docs/deprecated/practice/go_web_app/hellogo.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"math/rand\"\n\t\"net/http\"\n\t\"time\"\n)\n\nvar appVersion = \"1.2\" //Default/fallback version\nvar instanceNum int\n\nfunc getFrontpage(w http.ResponseWriter, r *http.Request) {\n\tt := time.Now()\n\tfmt.Fprintf(w, \"Hello, Go! I'm instance %d running version %s at %s\\n\", instanceNum, appVersion, t.Format(\"2019-01-02 15:04:05\"))\n}\n\nfunc health(w http.ResponseWriter, r *http.Request) {\n\tw.WriteHeader(http.StatusOK)\n}\n\nfunc getVersion(w http.ResponseWriter, r *http.Request) {\n\tfmt.Fprintf(w, \"%s\\n\", appVersion)\n}\n\nfunc main() {\n\trand.Seed(time.Now().UTC().UnixNano())\n\tinstanceNum = rand.Intn(1000)\n\thttp.HandleFunc(\"/\", getFrontpage)\n\thttp.HandleFunc(\"/health\", health)\n\thttp.HandleFunc(\"/version\", getVersion)\n\tlog.Fatal(http.ListenAndServe(\":3000\", nil))\n}\n"
  },
  {
    "path": "docs/deprecated/practice/go_web_app/hellogo.yaml",
    "content": "---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: hellogo-deploy\nspec:\n  replicas: 3\n  minReadySeconds: 5 # Wait 5 seconds after each new pod comes up before marked as \"ready\"\n  strategy:\n    type: RollingUpdate # describe how we do rolling updates\n    rollingUpdate:\n      maxUnavailable: 1 # When updating take one pod down at a time\n      maxSurge: 1\n  selector:\n    matchLabels:\n      name: hellogo-app\n  template:\n    metadata:\n      labels:\n        name: hellogo-app\n    spec:\n      containers:\n      - name: hellogo\n        image: hellogo:v1.0\n        imagePullPolicy: IfNotPresent\n        resources:\n          requests:\n            memory: \"32Mi\"\n            cpu: \"50m\"\n          limits:\n            memory: \"64Mi\"\n            cpu: \"100m\"\n        ports:\n          - containerPort: 3000\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: hellogo-svc\nspec:\n  type: NodePort\n  ports:\n  - name: http\n    port: 80\n    targetPort: 3000\n    nodePort: 30000\n  selector:\n    name: hellogo-app\n"
  },
  {
    "path": "docs/deprecated/practice/go_web_app/readme.md",
    "content": "# 容器化 GO 应用\n\nGolang 作为服务器端新兴热门语言同时也是容器技术的主要编写语言备受关注；它简洁、有趣、并行、安全等特点让 GO 应用容器化相对省心；一般来说做下时间本地化、安装信任根证书，然后把编译生成的二进制拷贝进去即可。\n\n## 一个演示 GO WEB 应用\n\n[hellogo 代码](hellogo.go)\n\n## Dockerfile\n\n作为演示项目的Dockerfile比较简单，请看 [Dockerfile 文件](Dockerfile)\n\n- 采用 docker 多阶段编译，使生成的目标镜像最小\n- 使用 alpine 基础镜像\n- 安装 tzdata 做时间本地化\n- 安装信任根证书\n\n一个真实复杂go项目的Dockerfile可能如这个例子：[复杂 Dockerfile](Dockerfile-more)\n\n## 制作镜像\n\n在 Dockerfile 文件所在目录，执行\n\n```\ndocker build -t hellogo:v1.0 .\n```\n\n## 本地测试应用\n\n- 1.单机运行 hellogo 容器应用 \n\n```\ndocker run -d --name hello -p3000:3000 hellogo:v1.0\n```\n\n- 2.验证测试\n\n``` bash\n# 查看本地监听端口\n$ ss -ntl|grep 3000\nLISTEN   0         128                       *:3000                   *:*\n\n# 查看应用状态\n$ curl localhost:3000\nHello, Go! I'm instance 987 running version 1.2 at 13109-10-13 08:39:11\n\n$ curl localhost:3000/health -i\nHTTP/1.1 200 OK\nDate: Sun, 13 Oct 2019 00:39:15 GMT\nContent-Length: 0\n\n$ curl localhost:3000/version\n1.2\n```\n\n## 在 k8s 上运行演示应用\n\n- 可以参考项目`github.com/easzlab/kubeasz` 快速搭建一个本地 k8s 测试环境\n\n- 1.编写基于k8s的应用编排文件 [hellogo.yaml](hellogo.yaml)\n  - 设置应用副本数`replicas: 3`\n  - 预设新副本启动延迟5秒`minReadySeconds: 5`\n  - 设置滚动更新策略\n  - 设置资源使用限制，安装实际情况修改\n  - 设置服务对外暴露方式 NodePort，根据实际情况修改端口，或者使用 ingress 方式\n\n- 2.在 k8s 上运行应用\n\n``` bash\n# 运行\n$ kubectl apply -f hellogo.yaml\n\n# 验证\n$ kubectl get pod\nNAME                             READY   STATUS    RESTARTS   AGE\nhellogo-deploy-854dcd85c-2zm9l   1/1     Running   0          12m\nhellogo-deploy-854dcd85c-7nfk5   1/1     Running   0          12m\nhellogo-deploy-854dcd85c-ns7fp   1/1     Running   0          12m\n\n$kubectl get deploy\nNAME             READY   UP-TO-DATE   AVAILABLE   AGE\nhellogo-deploy   3/3     3            3           13m\n\n$kubectl get svc\nNAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE\nhellogo-svc   NodePort    10.68.194.109   <none>        80:30000/TCP   13m\n\n# 使用curl测试应用三副本状态（用curl多次访问看到三个不同`instance id`）\n$ curl http://192.168.111.3:30000\nHello, Go! I'm instance 629 running version 1.2 at 13109-10-13 09:06:25\n\n$ curl http://192.168.111.3:30000\nHello, Go! I'm instance 722 running version 1.2 at 13109-10-13 09:06:27\n\n$curl http://192.168.111.3:30000\nHello, Go! I'm instance 799 running version 1.2 at 13109-10-13 09:06:28\n```\n"
  },
  {
    "path": "docs/deprecated/practice/java_war_app.md",
    "content": "# JAVA WAR 应用迁移 K8S 实践\n\n初步思路是这样：应用代码与应用配置分离，应用代码打包成 docker 镜像存于内部 harbor 仓库，应用配置使用 configmap 挂载，这样不同的环境只需要修改 configmap 即可部署。\n\n- 使用 maven 把 java 应用代码打包成 xxx.war\n- 基于 tomcat 镜像和 xxx.war 做成应用 docker 镜像\n- 编写 k8s deployment 文件，在 pod 指定上述应用镜像，同时把应用配置做成 configmap 挂载到 pod 里\n\n经过多次尝试部署发现问题：configmap配置是可以挂载上去，但是会把目录下其他的文件删掉，而且tomcat 目录 webapps/xxxxx/下其他目录也消失了。原来是因为 tomcat 容器完全启动完成后才会解压 war包，而 configmap 配置文件是一开始就挂载上去了，导致失败。\n\n- 调整应用镜像打包过程：xxx.war 先解压后再进行应用镜像打包\n\n## 应用 gitlab CI/CD 集成\n\n- 在内部gitlab创建项目，上传应用java代码，同时在项目根目录下新加如下目录和文件，配置相应的 gitlab-runner 和 环境变量参数\n\n``` bash\n├── .app.yaml\t\t# k8s deployment 部署模板文件 \n├── config.yaml\t\t# k8s configmap 配置模板文件\n├── dockerfiles\n│   └── Dockerfile\t# Dockerfile 文件\n├── .gitlab-ci.yml\t# gitlab ci 配置文件\n└── .ns.yaml\t\t# k8s namespace 和 imagePullSecrets的配置文件\n```\n### gitlab-ci 文件摘要\n\n``` bash\nvariables:\n  PROJECT_NS: '$CI_PROJECT_NAMESPACE-$CI_JOB_STAGE'\n  APP_NAME: '$CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG'\n\nstages:\n  - package\n  - beta\n\njob_package:\n  stage: package\n  tags:\n    - package-shell\n  only:\n    - master\n    - /^feature-.*$/\n  script:\n  - mvn clean install -Dmaven.test.skip=true\n  - unzip target/xxxx.war -d dockerfiles/project\n  - cd dockerfiles && docker build -t harbor.test.lo/project/$CI_PROJECT_NAME:$CI_PIPELINE_ID .\n  - docker login -u $HARBOR_USR -p $HARBOR_PWD harbor.test.lo\n  - docker push harbor.test.lo/project/$CI_PROJECT_NAME:$CI_PIPELINE_ID\n  - docker logout harbor.test.lo\n\njob_push_beta:\n  stage: beta\n  tags:\n    - beta-shell\n  only:\n    - master\n    - /^feature-.*$/\n  when: manual\n  script:\n  # 替换beta环境的参数配置\n  - sed -i \"s/PROJECT_NS/$PROJECT_NS/g\" config.yaml .app.yaml .ns.yaml\n  - sed -i \"s/TemplateProject/$APP_NAME/g\" config.yaml .app.yaml\n  - sed -i \"s/DB_HOST/$BETA_DB_HOST/g\" config.yaml\n  - sed -i \"s/DB_PWD/$BETA_DB_PWD/g\" config.yaml\n  - sed -i \"s/APP_REP/$BETA_APP_REP/g\" .app.yaml\n  - sed -i \"s/ProjectImage/$CI_PROJECT_NAME:$CI_PIPELINE_ID/g\" .app.yaml\n  #\n  - mkdir -p /opt/kube/$PROJECT_NS/$APP_NAME\n  - cp -f .ns.yaml config.yaml .app.yaml /opt/kube/$PROJECT_NS/$APP_NAME\n  - kubectl --kubeconfig=/etc/.beta/config apply -f .ns.yaml\n  - kubectl --kubeconfig=/etc/.beta/config apply -f config.yaml\n  - kubectl --kubeconfig=/etc/.beta/config apply -f .app.yaml\n\n# 生产部署与beta环境类同，这里省略\n```\n\n### Dockerfile 编写\n\n```\nFROM tomcat:8.5.33-jre8-alpine\n\nCOPY . /usr/local/tomcat/webapps/\n\n# 设置tomcat日志使用的时区\nRUN sed -i 's/^JAVA_OPTS=.*webresources\\\"$/JAVA_OPTS=\\\"$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Duser.timezone=GMT+08\\\"/g' /usr/local/tomcat/bin/catalina.sh\n```\n\n### k8s deployment 配置举例\n\n```\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: TemplateProject\n  namespace: PROJECT_NS\nspec:\n  replicas: APP_REP\n  template:\n    metadata:\n      labels:\n        run: TemplateProject\n    spec:\n      containers:\n      - name: TemplateProject\n        image: harbor.test.lo/project/ProjectImage\n        imagePullPolicy: IfNotPresent\n        ports:\n        - containerPort: 8080\n        volumeMounts:\n        - name: db-config\n          mountPath: \"/usr/local/tomcat/webapps/project/xxxx/yyyy/config/datasource.properties\"\n          subPath: datasource.properties\n      imagePullSecrets:\n      - name: projectkey1\n      volumes:\n      - name: db-config\n        configMap:\n          name: TemplateProject-config\n          defaultMode: 0640\n          items:\n          - path: datasource.properties\n            key: datasource.properties\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    run: TemplateProject\n  name: TemplateProject\n  namespace: PROJECT_NS\nspec:\n  ports:\n  - port: 80\n    protocol: TCP\n    targetPort: 8080\n  selector:\n    run: TemplateProject\n  sessionAffinity: None\n```\n\n### k8s configmap 配置举例\n\n```\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: TemplateProject-config\n  namespace: PROJECT_NS\ndata:\n  datasource.properties: |\n    dataSource.maxIdle = 5\n    dataSource.maxActive = 41\n    dataSource.driverClassName = com.mysql.jdbc.Driver\n    dataSource.url = jdbc:mysql://DB_HOST:8066/project?useUnicode=true&characterEncoding=utf-8\n    dataSource.username = username\n    dataSource.password = DB_PWD\n```\n"
  },
  {
    "path": "docs/deprecated/practice/mariadb_cluster.md",
    "content": "# Mariadb 数据库集群\n\nMariadb 是从 MySQL 衍生出来的开源关系型数据库，目前兼容 mysql 5.7 版本；它也非常流行，拥有 Google Facebook 等重要企业用户。本文档介绍使用 helm charts 方式安装 mariadb cluster，仅供实践交流使用。\n\n## 前提条件\n\n- 已部署 k8s 集群，参考[这里](../setup/quickStart.md)\n- 已部署 helm，参考[这里](../guide/helm.md)\n- 集群提供持久性存储，参考[这里](../setup/08-cluster-storage.md)\n\n\n## mariadb charts 配置修改\n\n按照惯例，直接把 chart 下载到本地，然后把配置复制 values.yaml 出来进行修改，这样方便以后整体更新 chart，安装实际使用需要修改配置文件\n\n``` bash\n$ cd /etc/kubeasz/manifests/mariadb-cluster\n# 编辑 my-values.yaml 修改以下部分\n\nservice:\n  type: NodePort     # 方便集群外部访问\n  port: 3306\n  nodePort:\n    master: 33306    # 设置主库的nodePort\n    slave: 33307     # 设置从库的nodePort\n\nrootUser:            # 设置 root 密码\n  password: test.c0m\n  forcePassword: true\n\ndb:                  # 设置初始测试数据库\n  user: hello\n  password: hello\n  name: hello\n  forcePassword: true\n\nreplication:         # 设置主从复制\n  enabled: true\n  user: replicator\n  password: R4%forep11CAT0r\n  forcePassword: true\n\nmaster:\n  affinity: {}\n  antiAffinity: soft\n  tolerations: []\n  persistence:\n    enabled: true    # 启用持久化存储\n    mountPath: /bitnami/mariadb\n    storageClass: \"nfs-db\"  # 设置使用 nfs-db 存储类\n    annotations: {}\n    accessModes:\n    - ReadWriteOnce\n    size: 5Gi        # 设置存储容量 \n\nslave:\n  replicas: 1\n  affinity: {}\n  antiAffinity: soft\n  tolerations: []\n  persistence:\n    enabled: false   # 从库这里没有启用持久性存储\n```\n\n## 安装\n\n使用 helm 安装\n\n``` bash\n$ cd /etc/kubeasz/manifests/mariadb-cluster\n$ helm install --name mariadb --namespace default -f my-values.yaml ./mariadb\n```\n\n## 验证\n\n``` bash\n$ kubectl get pod,svc | grep mariadb\npod/mariadb-mariadb-master-0      1/1     Running   0          27m\npod/mariadb-mariadb-slave-0       1/1     Running   0          29m\n\nservice/mariadb                       NodePort    10.68.170.168   <none>        3306:33306/TCP       29m\nservice/mariadb-mariadb-slave         NodePort    10.68.151.95    <none>        3306:33307/TCP       29m\n```\n\n"
  },
  {
    "path": "docs/guide/argocd.md",
    "content": "# argocd 安装\n\n用 GitOps 方式把 Kubernetes 声明式配置“自动、可观测、可回滚”地同步到集群的控制器；它是 Kubernetes 世界里 GitOps 的事实标准。\n\n## 初始安装\n- 建议使用helm chart 方式基础安装；后续用声明式方式配置cluster、project、repository等\n\n## 服务暴露\n- 建议使用ingress方式\n- 备用：kubectl patch svc argocd-server -n argocd -p '{\"spec\": {\"type\": \"NodePort\"}}'\n\n## 密码登录\n- 获取初始化密码 `argocd admin initial-password -n argocd`\n- 登录 `argocd login {nodeIP}:{nodePort}`\n- 更新密码 `argocd account update-password`\n- 重置遗忘密码 \n\n```\nkubectl -n argocd patch secret argocd-secret -p '{\"data\": {\"admin.password\": null, \"admin.passwordMtime\": null}}'\nkubectl -n argocd delete pods -l app.kubernetes.io/name=argocd-server\n```\n\n## SSO 登录\n- 参考文档：https://help.aliyun.com/zh/ram/obtain-user-information-through-oidc\n- 阿里云控制台-RAM访问控制-集成管理-OAuth应用：创建应用 https://ram.console.aliyun.com/applications/create\n  - OAuth 协议版本：2.0\n  - 应用类型：Web应用\n  - 回调地址：填写 https://${argocd-server-domain}/api/dex/callback\n  - OAuth 范围：openid(必选), aliuid(可选), profile(可选)\n\n- OAuth应用创建后，准备以下参数\n  - \"应用 ID\" --> dex.config: connectors oidc.config.clientID\n  - 创建应用密码 --> dex.config: connectors oidc.config.clientSecret\n\n- 配置argocd-cm\n\n```\n  dex.config: |\n    connectors:\n    - type: oidc\n      id: aliyun\n      name: aliyun\n      config:\n        issuer: https://oauth.aliyun.com\n        clientID: \"406************\"\n        clientSecret: E8G***************************************************b6\n        scopes:\n        - profile\n        - openid\n        - aliuid\n        getUserInfo: true\n        userIDKey: uid\n        userNameKey: uid\n        claimMapping:\n          preferred_username: name\n          email: uid\n```\n\n- 配置argocd-rbac-cm\n\n```\ndata:\n  policy.csv: |\n    # 设置普通用户app-dev 只读权限\n    p, role:app-dev, projects, get, *, allow\n    p, role:app-dev, applications, get, *, allow\n    p, role:app-dev, logs, get, *, allow\n    p, role:app-dev, exec, create, */*, allow\n\n    # 设置测试项目，所有权限\n    p, role:app-dev, applications, *, test-project/*, allow\n    \n    # 阿里云子账号 ID：2***********84\n    g, \"2***********84\", role:admin\n    g, \"2***********27\", role:app-dev\n\n  policy.default: role:''\n  scopes: '[name]'\n```\n\n## 支持 application in any namespace\n\n- 配置 argocd-cm\n\n```\ndata:\n  # 设置argocd 资源标记方式，使用annotation，禁用labelKey\n  # application.instanceLabelKey: argocd.argoproj.io/instance\n  application.resourceTrackingMethod: annotation\n```\n\n- 配置 argocd-cmd-params-cm\n\n```\ndata:\n  #application.namespaces: app-team-one, app-team-two\n  application.namespaces: '*'\n  applicationsetcontroller.allowed.scm.providers: '*'\n  applicationsetcontroller.namespaces: '*'\n```\n\n然后重启 argocd-server 和 argocd-application-controller\n\n## 其他设置\n\n- argocd 部署应用 ingress 资源一直Progressing，参考：https://github.com/argoproj/argo-cd/issues/14607\n\n```\n# 修改argocd-cm configmap，重启argocd-application-controller\ndata:\n  resource.customizations: |\n    networking.k8s.io/Ingress:\n      health.lua: |\n        hs = {}\n        hs.status = \"Healthy\"\n        hs.message = \"Skip health check for Ingress\"\n        return hs\n```\n"
  },
  {
    "path": "docs/guide/chrony.md",
    "content": "# chrony 时间同步\n\n在安装k8s集群前需确保各节点时间同步；`chrony` 是一个优秀的 `NTP` 实现，性能比ntp好，且配置管理方便；它既可作时间服务器服务端，也可作客户端。\n\n- `OpenStack` 社区也推荐使用 `chrony`实现各节点之间的时间同步\n\n## 安装配置介绍\n\n项目中选定一个节点(`groups.chrony[0]`)作为集群内部其他节点的时间同步源，而这个节点本身从公网源同步；当然如果整个集群都无法访问公网，那么请手动校准这个节点的时间后，仍旧可以作为内部集群的时间源服务器。\n\n- 配置 chrony server，详见roles/chrony/templates/server.conf.j2 \n\n- 配置 chrony client，详见roles/chrony/templates/client.conf.j2\n\n## `kubeasz` 集成安装\n\n- 修改 clusters/${cluster_name}/hosts 文件，在 `chrony`组中加入选中的节点ip\n- [可选] 修改 clusters/${cluster_name}/config.yml 中的相关配置\n-执行命令安装 `ezctl setup ${cluster_name} 01`\n\n## 验证安装\n\n- 检查chronyd服务状态 `systemctl status chronyd`\n- 检查chronyd时间同步日志 `/var/log/chrony`\n\n## 验证时间同步状态完成\n\nchrony 服务启动后，chrony server 会与配置的公网参考时间服务器进行同步；server 同步完成后，chrony client 会与 server 进行时间同步；一般来说整个集群达到时间同步需要几十分钟。可以用如下命令检查，初始时 **NTP synchronized: no**，同步完成后 **NTP synchronized: yes**\n\n``` bash\n$ ansible -i clusters/${cluster_name}/hosts all -m shell -a 'timedatectl'\n192.168.1.1 | SUCCESS | rc=0 >>\n      Local time: Sat 2019-01-26 11:51:51 HKT\n  Universal time: Sat 2019-01-26 03:51:51 UTC\n        RTC time: Sat 2019-01-26 03:51:52\n       Time zone: Asia/Hong_Kong (HKT, +0800)\n Network time on: yes\nNTP synchronized: yes\n RTC in local TZ: no\n\n192.168.1.4 | SUCCESS | rc=0 >>\n      Local time: Sat 2019-01-26 11:51:51 HKT\n  Universal time: Sat 2019-01-26 03:51:51 UTC\n        RTC time: Sat 2019-01-26 03:51:52\n       Time zone: Asia/Hong_Kong (HKT, +0800)\n Network time on: yes\nNTP synchronized: yes\n RTC in local TZ: no\n\n192.168.1.2 | SUCCESS | rc=0 >>\n      Local time: Sat 2019-01-26 11:51:51 HKT\n  Universal time: Sat 2019-01-26 03:51:51 UTC\n        RTC time: Sat 2019-01-26 03:51:52\n       Time zone: Asia/Hong_Kong (HKT, +0800)\n Network time on: yes\nNTP synchronized: yes\n RTC in local TZ: no\n\n192.168.1.3 | SUCCESS | rc=0 >>\n      Local time: Sat 2019-01-26 11:51:51 HKT\n  Universal time: Sat 2019-01-26 03:51:51 UTC\n        RTC time: Sat 2019-01-26 03:51:52\n       Time zone: Asia/Hong_Kong (HKT, +0800)\n Network time on: yes\nNTP synchronized: yes\n RTC in local TZ: no\n```\n"
  },
  {
    "path": "docs/guide/dashboard.1.6.3.md",
    "content": "## dashboard\n\n本文档基于 dashboard 1.6.3版本，从 1.7.x 版本以后，dashboard 默认开启自带的登录验证界面，登录流程差异详见[新版本](dashboard.md)。\n\n+ 注意：实际测试k8s版本<=1.9.1支持dashboard 1.6.3, 建议k8s 1.9 以后使用 dashboard 新版本。\n\n### 部署\n\n``` bash\n# 部署dashboard 主yaml配置文件\n$ kubectl create -f /etc/kubeasz/manifests/dashboard/1.6.3/kubernetes-dashboard.yaml\n# 部署基本密码认证配置[可选]，密码文件位于 /etc/kubernetes/ssl/basic-auth.csv\n$ kubectl create -f /etc/kubeasz/manifests/dashboard/1.6.3/ui-admin-rbac.yaml\n$ kubectl create -f /etc/kubeasz/manifests/dashboard/1.6.3/ui-read-rbac.yaml\n```\n\n请在另外窗口打开 [kubernetes-dashboard.yaml](../../manifests/dashboard/1.6.3/kubernetes-dashboard.yaml)\n\n+ 由于 kube-apiserver 启用了 RBAC授权，dashboard使用的 ServiceAccount `kubernetes-dashboard` 必须有相应的权限去访问apiserver(在新版本1.8.0中，该访问权限已按最小化方式授权)，在1.6.3 版本，先粗放一点，把`kubernetes-dashboard` 与 集群角色 `cluster-admin` 绑定，这样dashboard就拥有了所有访问apiserver的权限。\n+ 开发测试环境为了方便配置dashboard-service时候，指定 `NodePort`方式暴露服务，这样集群外部可以使用 `http://NodeIP:NodePort` 方式直接访问 dashboard，生产环境建议关闭该访问途径。\n\n### 验证\n\n``` bash\n# 查看pod 运行状态\nkubectl get pod -n kube-system | grep dashboard\nkubernetes-dashboard-86bd8778bf-w4974      1/1       Running   0          12h\n# 查看dashboard service\nkubectl get svc -n kube-system|grep dashboard\nkubernetes-dashboard   NodePort    10.68.7.67      <none>        80:5452/TCP\t12h\n# 查看集群服务\nkubectl cluster-info|grep dashboard\nkubernetes-dashboard is running at https://192.168.1.10:6443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy\n# 查看pod 运行日志，关注有没有错误\nkubectl logs kubernetes-dashboard-86bd8778bf-w4974 -n kube-system\n```\n\n### 访问\n\n因为dashboard 作为k8s 原生UI，能够展示各种资源信息，甚至可以有修改、增加、删除权限，所以有必要对访问进行认证和控制，本项目预置部署的集群有以下安全设置：详见 [apiserver配置模板](../../roles/kube-master/templates/kube-apiserver.service.j2)\n\n+ 启用 `TLS认证` `RBAC授权`等安全特性\n+ 关闭 apiserver非安全端口8080的外部访问`--insecure-bind-address=127.0.0.1`\n+ 关闭匿名认证`--anonymous-auth=false`\n+ 补充启用基本密码认证 `--token-auth-file=/etc/kubernetes/ssl/basic-auth.csv`，[密码文件模板](../../roles/kube-master/templates/basic-auth.csv.j2)中按照每行(密码,用户名,序号)的格式，可以定义多个用户\n\n#### 1. 临时访问：使用 `http://NodeIP:NodePort` 方式直接访问 dashboard，生产环境建议关闭该途径\n\n#### 2. 用户+密码访问：安全性比证书方式差点，务必保管好密码文件`basic-auth.csv`\n\n- 这里演示两种权限，使用admin 登录dashboard拥有所有权限，使用readonly 登录后仅查看权限，首先在 master节点文件 `/etc/kubernetes/ssl/basic-auth.csv` 确认用户名和密码，如果要增加或者修改用户，修改保存该文件后记得逐个重启你的master 节点\n- 为了演示用户密码访问，如果你已经完成证书访问方式，你可以在浏览器删除证书，或者访问时候浏览器询问你证书时不选证书\n- 2.1 设置用户admin 的RBAC 权限，如下运行配置文件 `kubectl create -f ui-admin-rbac.yaml`\n\n``` bash\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: ui-admin\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - services\n  - services/proxy\n  verbs:\n  - '*'\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: ui-admin-binding\n  namespace: kube-system\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: ui-admin\nsubjects:\n- apiGroup: rbac.authorization.k8s.io\n  kind: User\n  name: admin\n```  \n- 2.2 设置用户readonly 的RBAC 权限，如下运行配置文件 `kubectl create -f ui-read-rbac.yaml`\n\n``` bash\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: ui-read\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - services\n  - services/proxy\n  verbs:\n  - get\n  - list\n  - watch\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: ui-read-binding\n  namespace: kube-system\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: ui-read\nsubjects:\n- apiGroup: rbac.authorization.k8s.io\n  kind: User\n  name: readonly\n```\n- 2.3 访问 `https://x.x.x.x:6443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy` 使用 admin登录拥有所有权限，比如删除某个部署；使用 readonly登录只有查看权限，尝试删除某个部署会提示错误 `forbidden: User \\\"readonly\\\" cannot delete services/proxy in the namespace \\\"kube-system\\\"`\n\n#### 3. 证书访问：最安全的方式，配置较复杂\n- 使用集群CA 生成客户端证书，可以根据需要生成权限不同的证书，这里为了演示直接使用 kubectl使用的证书和key(在03.kubectl.yml阶段生成)，该证书拥有所有权限\n- 指定格式导出该证书，进入`/etc/kubernetes/ssl`目录，使用命令`openssl pkcs12 -export -in admin.pem -inkey admin-key.pem -out kube-admin.p12` 提示输入证书密码和确认密码，可以用密码再增加一层保护，也可以直接回车跳过，完成后目录下多了 `kube-admin.p12`文件，将它分发给授权的用户\n- 用户将 `kube-admin.p12` 双击导入证书即可，`IE` 和`Chrome` 中输入`https://x.x.x.x:6443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy` 或者 `https://x.x.x.x:6443/ui` 即可访问。补充：最新firefox需要在浏览器中单独导入 [选项] - [隐私与安全] - [证书/查看证书] - [您的证书] 页面点击 [导入] 该证书\n\n### 小结\n\n+ dashboard 版本 1.6.3 访问控制实现较复杂，文档中给出的例子也有助于你理解 RBAC的灵活控制能力，当然最好去[官方文档](https://kubernetes.io/docs/admin/authorization/rbac/)学习一下，这块篇幅不长\n+ 由于还未部署 Heapster 插件，当前 dashboard 不能展示 Pod、Nodes 的 CPU、内存等 metric 图形，后续部署 heapster后自然能够看到\n+ 本文中的权限设置仅供演示用，生产环境请在此基础上修改成适合你安全需求的方式\n\n"
  },
  {
    "path": "docs/guide/dashboard.2.x.md",
    "content": "## dashboard\n\n本文档基于 dashboard 2.2 版本，k8s 1.22 版本，因 dashboard 1.7 以后默认开启了自带的登录验证机制，因此不同版本登录有差异：\n\n- 旧版（<= 1.6）建议通过apiserver访问，直接通过apiserver 认证授权机制去控制 dashboard权限，详见[旧版文档](dashboard.1.6.3.md)\n- 新版（>= 1.7）可以使用自带的登录界面，使用不同Service Account Tokens 去控制访问 dashboard的权限\n\n### 部署\n\n参考 https://github.com/kubernetes/dashboard\n\n+ 增加了通过`api-server`方式访问dashboard\n+ 增加了`NodePort`方式暴露服务，这样集群外部可以使用 `https://NodeIP:NodePort` (注意是https不是http，区别于1.6.3版本) 直接访问 dashboard。\n\n安装部署\n\n``` bash\n# ezctl 集成部署组件，xxxx 代表集群部署名\n# dashboard 部署文件位于 /etc/kubeasz/clusters/xxxx/yml/dashboard/ 目录\n./ezctl setup xxxx 07\n```\n\n### 验证部署\n\n``` bash\n# 查看pod 运行状态\nkubectl get pod -n kube-system | grep dashboard\ndashboard-metrics-scraper-856586f554-l6bf4   1/1     Running   0          35m\nkubernetes-dashboard-698d4c759b-67gzg        1/1     Running   0          35m\n\n# 查看dashboard service\nkubectl get svc -n kube-system|grep dashboard\nkubernetes-dashboard   NodePort    10.68.219.38   <none>        443:24108/TCP                   53s\n\n# 查看pod 运行日志\nkubectl logs -n kube-system kubernetes-dashboard-698d4c759b-67gzg\n```\n\n### 登陆\n\n因为dashboard 作为k8s 原生UI，能够展示各种资源信息，甚至可以有修改、增加、删除权限，所以有必要对访问进行认证和控制，为演示方便这里使用 `https://NodeIP:NodePort` 方式访问 dashboard，支持两种登录方式：Kubeconfig、令牌(Token)\n\n**注意：** 使用chrome浏览器访问 `https://NodeIP:NodePort` 可能提示安全风险无法访问，可以换firefox浏览器设置安全例外，继续访问。 \n\n- Token令牌方式登录（admin）\n\n选择 Token 方式登录，复制下面输出的admin token 字段到输入框\n\n``` bash\n# 获取 Bearer Token，找到输出中 ‘token:’ 开头的后面部分\n$ kubectl describe -n kube-system secrets admin-user \n```\n\n- Token令牌方式登录（只读）\n\n选择 Token 方式登录，复制下面输出的read token 字段到输入框\n\n``` bash\n# 获取 Bearer Token，找到输出中 ‘token:’ 开头的后面部分\n$ kubectl describe -n kube-system secrets dashboard-read-user \n```\n\n- Kubeconfig登录（admin）\nAdmin kubeconfig文件默认位置：`/root/.kube/config`，该文件中默认没有token字段，使用Kubeconfig方式登录，还需要将token追加到该文件中，完整的文件格式如下：\n```\napiVersion: v1\nclusters:\n- cluster:\n    certificate-authority-data: LS0tLS1CRUdxxxxxxxxxxxxxx\n    server: https://192.168.1.2:6443\n  name: kubernetes\ncontexts:\n- context:\n    cluster: kubernetes\n    user: admin\n  name: kubernetes\ncurrent-context: kubernetes\nkind: Config\npreferences: {}\nusers:\n- name: admin\n  user:\n    client-certificate-data: LS0tLS1CRUdJTiBDRxxxxxxxxxxx\n    client-key-data: LS0tLS1CRUdJTxxxxxxxxxxxxxx\n    token: eyJhbGcixxxxxxxxxxxxxxxx\n```\n\n- Kubeconfig登录（只读）\n首先[创建只读权限 kubeconfig文件](../op/kcfg-adm.md)，然后类似追加只读token到该文件，略。\n\n### 参考\n\n- 1.[Dashboard docs](https://github.com/kubernetes/dashboard/blob/master/docs/README.md)\n- 2.[a-read-only-kubernetes-dashboard](https://blog.cowger.us/2018/07/03/a-read-only-kubernetes-dashboard.html)\n"
  },
  {
    "path": "docs/guide/dashboard.md",
    "content": "## dashboard\n\n本文档基于 dashboard 7.12.0 版本，k8s 1.32 版本，dashboard 7.0.0 以后引入大量不兼容变化。\n\n### 部署\n\n假设已经使用kubeasz 部署k8s集群完成；新版dashboard 部署如下：（以单机集群为例，其他情况请修改集群名称'default'为实际的名称）\n\n``` bash\n# 1. 修改 clusters/default/config.yml 文件，设置 dashboard_install: \"yes\"\n\n# 2. 下载dashboard 需要的镜像\n./ezdown -X dashboard\n\n# 3. 执行安装，配置文件位于 clusters/default/yml/dashboard/ 目录\ndk ezctl setup default 07\n```\n\n+ 增加`NodePort`方式暴露服务，这样集群外部可以使用 `https://NodeIP:NodePort` (注意是https不是http) 直接访问 dashboard。\n\n### 验证\n\n``` bash\n# 查看pod 运行状态\nkubectl get pod -n kube-system |grep kubernetes-dashboard\nkubernetes-dashboard-api-6d77cb7964-4tklq               1/1     Running   0          17h\nkubernetes-dashboard-auth-5fbd64f659-f9dst              1/1     Running   0          17h\nkubernetes-dashboard-kong-6dcdbf5dfd-829h4              1/1     Running   0          17h\nkubernetes-dashboard-metrics-scraper-7757c48476-4lcrq   1/1     Running   0          17h\nkubernetes-dashboard-web-5f9f47979-7khrk                1/1     Running   0          17h\n\n# 查看service\nkubectl get svc -n kube-system |grep kong\nkubernetes-dashboard-kong-proxy        NodePort    10.68.148.170   <none>   443:31544/TCP  17h\n```\n\n### 登陆\n\n因为dashboard 作为k8s 原生UI，能够展示各种资源信息，甚至可以有修改、增加、删除权限，所以有必要对访问进行认证和控制，为演示方便这里使用 `https://NodeIP:NodePort` 方式访问 dashboard，目前支持登录方式：令牌(Token)\n\n**注意：** 使用chrome浏览器访问 `https://NodeIP:NodePort` 可能提示安全风险无法访问，可以换firefox浏览器设置安全例外，继续访问。\n\n- Token令牌方式登录（admin）\n\n选择 Token 方式登录，复制下面输出的admin token 字段到输入框\n\n``` bash\n# 获取 Bearer Token，找到输出中 ‘token:’ 开头的后面部分\n$ kubectl describe -n kube-system secrets admin-user \n```\n\n- Token令牌方式登录（只读）\n\n选择 Token 方式登录，复制下面输出的read token 字段到输入框\n\n``` bash\n# 获取 Bearer Token，找到输出中 ‘token:’ 开头的后面部分\n$ kubectl describe -n kube-system secrets dashboard-read-user \n```\n\n### 参考\n\n- [旧版文档 dashboard 1.6.3](dashboard.1.6.3.md)\n- [旧版文档 dashboard 2.x](dashboard.2.x.md)\n- https://github.com/kubernetes/dashboard\n"
  },
  {
    "path": "docs/guide/harbor.md",
    "content": "# harbor 镜像仓库\n\nHabor是由VMWare中国团队开源的企业级容器镜像仓库。特性包括：友好的用户界面，基于角色的访问控制，水平扩展，同步复制，AD/LDAP集成以及审计日志等。本文档仅说明单机安装harbor 服务。\n\n- 目录\n  - 安装步骤\n  - 安装讲解\n  - 配置docker/containerd信任harbor证书\n  - 在k8s集群使用harbor\n  - 管理维护\n\n### 安装步骤\n\n1. 下载离线安装包，成功后在/etc/kubeasz/down/目录下有离线包harbor-offline-installer-$HARBOR_VER.tgz\n\n```\nezdown -D\nezdown -R\n```\n\n2. 利用ezctl [文档](../setup/ezctl.md) 创建一个新的集群，已有集群修改同样的文件\n\n```\n#clusters/xxx/hosts 中修改如下，配置harbor组下机器，设置NEW_INSTALL=true\n...\n# 'NEW_INSTALL': 'true' to install a harbor server; 'false' to integrate with existed one\n[harbor]\n192.168.1.8 NEW_INSTALL=true\n...\n\n#clusters/xxx/config.yml 中修改如下，按需修改HARBOR_DOMAIN/HARBOR_TLS_PORT 等配置项，举例如下\n############################\n# role:harbor\n############################\n# harbor version，完整版本号\nHARBOR_VER: \"v2.10.2\"\nHARBOR_DOMAIN: \"harbor.yourdomain.com\"\nHARBOR_PATH: /var/data\nHARBOR_TLS_PORT: 8443\nHARBOR_REGISTRY: \"{{ HARBOR_DOMAIN }}:{{ HARBOR_TLS_PORT }}\"\n\n# if set 'false', you need to put certs named harbor.pem and harbor-key.pem in directory 'down'\nHARBOR_SELF_SIGNED_CERT: true\n\n# install component\nHARBOR_WITH_TRIVY: false\n```\n\n3. 配置完成后，执行 `./ezctl setup xxx harbor`，完成harbor安装和docker 客户端配置\n\n- 安装验证\n\n1. 在harbor节点使用`docker ps -a` 查看harbor容器组件运行情况\n2. 浏览器访问地址（忽略证书报错） `https://${HARBOR_DOMAIN}:${HARBOR_TLS_PORT}`，管理员账号是 admin ，密码见harbor.yml文件 harbor_admin_password 对应值（默认密码 Harbor12345 已被随机生成的16位随机密码替换，不然存在安全隐患)\n\n### 安装讲解\n\n根据`playbooks/11.harbor.yml`文件，harbor节点需要以下步骤：\n\n- role `os-harden` 系统安全加固（可选）\n- role `chrony` 时间同步服务（可选）\n- role `prepare` 基础系统环境准备\n- role `docker` 安装docker\n- role `harbor` 安装harbor\n- 注意：`kube_node`节点在harbor部署完之后，需要配置harbor的证书（详见下节配置docker/containerd信任harbor证书），并可以在hosts里面添加harbor的域名解析，如果你的环境中有dns服务器，可以跳过hosts文件设置\n\n1. 下载docker-compose可执行文件到$PATH目录\n1. 自注册变量result判断是否已经安装harbor，避免重复安装问题\n1. 解压harbor离线安装包到指定目录\n1. 导入harbor所需 docker images\n1. 创建harbor证书和私钥(复用集群的CA证书)\n1. 修改harbor.yml配置文件\n1. 启动harbor安装脚本\n\n### 在k8s集群使用harbor\n\nadmin用户web登录后可以方便的创建项目，并指定项目属性(公开或者私有)；然后创建用户，并在项目`成员`选项中选择用户和权限；\n\n#### 镜像上传\n\n使用docker客户端登录`{{ HARBOR_REGISTRY }}`，然后把镜像tag成 `{{ HARBOR_REGISTRY }}/$项目名/$镜像名:$TAG` 之后，即可使用docker push 上传\n\n``` bash\ndocker login harbor.test.com\nUsername: \nPassword:\nLogin Succeeded\ndocker tag busybox:latest harbor.test.com/library/busybox:latest\ndocker push harbor.test.com/library/busybox:latest\nThe push refers to a repository [harbor.test.com/library/busybox]\n0271b8eebde3: Pushed \nlatest: digest: sha256:91ef6c1c52b166be02645b8efee30d1ee65362024f7da41c404681561734c465 size: 527\n```\n#### k8s中使用harbor\n\n1. 如果镜像保存在harbor中的公开项目中，那么只需要在yaml文件中简单指定harbor私有镜像即可，例如\n\n``` bash\napiVersion: v1\nkind: Pod\nmetadata:\n  name: test-busybox\nspec:\n  containers:\n  - name: test-busybox\n    image: harbor.test.com/xxx/busybox:latest\n    imagePullPolicy: Always\n```\n\n2. 如果镜像保存在harbor中的私有项目中，那么yaml文件中使用该私有项目的镜像需要指定`imagePullSecrets`，例如\n\n``` bash\napiVersion: v1\nkind: Pod\nmetadata:\n  name: test-busybox\nspec:\n  containers:\n  - name: test-busybox\n    image: harbor.test.com/xxx/busybox:latest\n    imagePullPolicy: Always\n  imagePullSecrets:\n  - name: harborkey1\n```\n其中 `harborKey1`可以用以下两种方式生成：\n\n+ 1.使用 `kubectl create secret docker-registry harborkey1 --docker-server=harbor.test.com --docker-username=admin --docker-password=Harbor12345 --docker-email=team@test.com`\n+ 2.使用yaml配置文件生成 \n\n``` bash\n//harborkey1.yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: harborkey1\n  namespace: default\ndata:\n    .dockerconfigjson: {base64 -w 0 ~/.docker/config.json}\ntype: kubernetes.io/dockerconfigjson\n```\n前面docker login会在~/.docker下面创建一个config.json文件保存鉴权串，这里secret yaml的.dockerconfigjson后面的数据就是那个json文件的base64编码输出（-w 0让base64输出在单行上，避免折行）\n\n### 管理维护\n\n+ 日志目录 `/var/log/harbor`\n+ 数据目录 `/var/data` ，其中最主要是 `/var/data/database` 和 `/var/data/registry` 目录，如果你要彻底重新安装harbor，删除这两个目录即可\n\n先进入harbor安装目录 `cd /var/data/harbor`，常规操作如下：\n\n1. 暂停harbor `docker-compose stop` : docker容器stop，并不删除容器\n2. 恢复harbor `docker-compose start` : 恢复docker容器运行\n3. 停止harbor `docker-compose down -v` : 停止并删除docker容器\n4. 启动harbor `docker-compose up -d` : 启动所有docker容器\n\n修改harbor的运行配置，需要如下步骤：\n\n``` bash\n# 停止 harbor\n docker-compose down -v\n# 修改配置\n vim harbor.yml\n# 执行./prepare已更新配置到docker-compose.yml文件\n ./prepare\n# 启动 harbor\n docker-compose up -d\n```\n"
  },
  {
    "path": "docs/guide/helm.md",
    "content": "# Helm\n\n`Helm`致力于成为k8s集群的应用包管理工具，希望像linux 系统的`RPM` `DPKG`那样成功；确实在k8s上部署复杂一点的应用很麻烦，需要管理很多yaml文件（configmap,controller,service,rbac,pv,pvc等等），而helm能够整齐管理这些文档：版本控制，参数化安装，方便的打包与分享等。  \n- 建议积累一定k8s经验以后再去使用helm；对于初学者来说手工去配置那些yaml文件对于快速学习k8s的设计理念和运行原理非常有帮助，而不是直接去使用helm，面对又一层封装与复杂度。\n- 本文基于helm 3（建议版本），helm 2 文档[请看这里](helm2.md)\n\n## 安装 helm\n\n在官方repo下载[release版本](https://github.com/helm/helm/releases)中自带的二进制文件即可（以Linux amd64为例）\n\n```\nwget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz\nmv ./linux-amd64/helm /usr/bin\n```\n\n- 启用官方 charts 仓库\n\n```\nhelm repo add stable https://kubernetes-charts.storage.googleapis.com/\n```\n国内镜像\n```\n helm repo add stable http://mirror.azure.cn/kubernetes/charts\n```\n\n\n## 使用 helm 安装应用\n\nhelm3 安装命令与 helm2 稍有变化，个人习惯先下载对应charts到本地然后按照固定目录格式安装，以创建一个redis集群举例：\n\n- 创建 redis-cluster 目录\n``` bash\nmkdir -p /opt/charts/redis-cluster\ncd /opt/charts/redis-cluster\n```\n\n- 下载最新stalbe/redis-ha\n```\nhelm repo update\nhelm pull stable/redis-ha\n```\n\n- 解压 charts，复制 values.yaml设置\n```\ntar zxvf redis-ha-*.tgz\ncp redis-ha/values.yaml .\n```\n\n- 创建 start.sh 脚本记录启动命令\n```\ncat > start.sh << EOF\n#!/bin/sh\nset -x\n\nROOT=$(cd `dirname $0`; pwd)\ncd $ROOT\n\nhelm install redis \\\n\t--create-namespace \\\n\t--namespace dependency \\\n\t-f ./values.yaml \\\n\t./redis-ha\nEOF\n```\n\n- 查看当前目录结构如下\n```\ntree .\n.\n├── redis-ha\t\t# redis-ha 原始charts目录\n├── start.sh\t\t# 启动命名脚本\n└── values.yaml\t\t# 个性化参数配置\n```\n\n- 修改当前目录的 values.yaml 为你的个性化配置\n``` bash\n#举例values.yaml 配置如下，没有启用PV\n#cat values.yaml\nimage:\n  repository: redis\n  tag: 5.0.6-alpine\n\nreplicas: 2\n\n## Redis specific configuration options\nredis:\n  port: 6379\n  masterGroupName: \"mymaster\"       # must match ^[\\\\w-\\\\.]+$) and can be templated\n  config:\n    ## For all available options see http://download.redis.io/redis-stable/redis.conf\n    min-replicas-to-write: 1\n    min-replicas-max-lag: 5   # Value in seconds\n    maxmemory: \"4g\"       # Max memory to use for each redis instance. Default is unlimited.\n    maxmemory-policy: \"allkeys-lru\"  # Max memory policy to use for each redis instance. Default is volatile-lru.\n    repl-diskless-sync: \"yes\"\n    rdbcompression: \"yes\"\n    rdbchecksum: \"yes\"\n\n  resources:\n    requests:\n      memory: 200Mi\n      cpu: 100m\n    limits:\n      memory: 4000Mi\n\n## Sentinel specific configuration options\nsentinel:\n  port: 26379\n  quorum: 1\n\n  resources:\n    requests:\n      memory: 200Mi\n      cpu: 100m\n    limits:\n      memory: 200Mi\n\nhardAntiAffinity: true\n\n## Configures redis with AUTH (requirepass & masterauth conf params)\nauth: false\n\npersistentVolume:\n  enabled: false\n\nhostPath:\n  path: \"/data/mcs-redis/{{ .Release.Name }}\"\n```\n\n- 执行安装\n```\nbash ./start.sh\n```\n\n- 查看安装\n```\nhelm ls -A\nNAME \tNAMESPACE \tREVISION\tUPDATED                                \tSTATUS  \tCHART         \tAPP VERSION\nredis\tdependency\t1       \t2020-05-28 20:57:31.166002853 +0800 CST\tdeployed\tredis-ha-4.4.4\t5.0.6\n\n# 查看k8s上资源\nkubectl get pod,svc -n dependency\nNAME                          READY   STATUS    RESTARTS   AGE\npod/redis-redis-ha-server-0   2/2     Running   0          119s\npod/redis-redis-ha-server-1   2/2     Running   0          104s\n\nNAME                                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)              AGE\nservice/redis-redis-ha              ClusterIP   None          <none>        6379/TCP,26379/TCP   119s\nservice/redis-redis-ha-announce-0   ClusterIP   10.68.41.65   <none>        6379/TCP,26379/TCP   119s\nservice/redis-redis-ha-announce-1   ClusterIP   10.68.64.49   <none>        6379/TCP,26379/TCP   119s\n```\n\n"
  },
  {
    "path": "docs/guide/hpa.md",
    "content": "## Horizontal Pod Autoscaling\n\n自动水平伸缩，是指运行在k8s上的应用负载(POD)，可以根据资源使用率进行自动扩容、缩容；我们知道应用的资源使用率通常都有高峰和低谷，所以k8s的`HPA`特性应运而生；它也是最能体现区别于传统运维的优势之一，不仅能够弹性伸缩，而且完全自动化！\n\n根据 CPU 使用率或自定义 metrics 自动扩展 Pod 数量（支持 replication controller、deployment）；k8s1.6版本之前是通过kubelet来获取监控指标，1.6版本之后是通过api server、heapster或者kube-aggregator来获取监控指标。\n\n### Metrics支持\n\n根据不同版本的API中，HPA autoscale时靠以下指标来判断资源使用率：\n- autoscaling/v1: CPU\n- autoscaling/v2alpha1\n  - 内存\n  - 自定义metrics\n  - 多metrics组合: 根据每个metric的值计算出scale的值，并将最大的那个值作为扩容的最终结果\n\n### 基础示例\n\n本实验环境基于k8s 1.8 和 1.9，仅使用`autoscaling/v1` 版本API，**注意确保**`k8s` 集群插件`kubedns` 和 `heapster` 工作正常。\n\n``` bash\n# 创建deploy和service\n$ kubectl run php-apache --image=pilchard/hpa-example --requests=cpu=200m --expose --port=80\n\n# 创建autoscaler\n$ kubectl autoscale deploy php-apache --cpu-percent=50 --min=1 --max=10\n\n# 等待3~5分钟查看hpa状态\n$ kubectl get hpa php-apache\nNAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE\nphp-apache   Deployment/php-apache   0% / 50%   1         10        1          3m\n\n# 增加负载\n$ kubectl run --rm -it load-generator --image=busybox /bin/sh\nHit enter for command prompt\n$ while true; do wget -q -O- http://php-apache; done;\n\n# 等待约5分钟查看hpa显示负载增加，且副本数目增加为4\n$ kubectl get hpa php-apache\nNAME         REFERENCE               TARGETS      MINPODS   MAXPODS   REPLICAS   AGE\nphp-apache   Deployment/php-apache   430% / 50%   1         10        4          4m\n\n# 注意k8s为了避免频繁增删pod，对副本的增加速度有限制\n# 实验过程可以看到副本数目从1到4到8到10，大概都需要4~5分钟的缓冲期\n$ kubectl get hpa php-apache\nNAME         REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE\nphp-apache   Deployment/php-apache   86% / 50%   1         10        8          9m\n$ kubectl get hpa php-apache\nNAME         REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE\nphp-apache   Deployment/php-apache   52% / 50%   1         10        10         12m\n\n# 清除负载，CTRL+C 结束上述循环程序，稍后副本数目变回1\n$ kubectl get hpa php-apache\nNAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE\nphp-apache   Deployment/php-apache   0% / 50%   1         10        1          17m\n```\n\n"
  },
  {
    "path": "docs/guide/index.md",
    "content": "## 使用指南\n\n### 附加组件安装\n\n- 安装 [kubedns](kubedns.md)\n- 安装 [dashboard](dashboard.md)\n- 安装 [metrics-server](metrics-server.md)\n- 安装 [prometheus](prometheus.md)\n- 安装 [kubeapps](kubeapps.md)\n- 安装 [ingress](ingress.md)\n- 安装 [helm](helm.md)\n- 安装 [efk](efk.md)\n- 安装 [harbor](harbor.md)\n- 安装 [metallb](metallb.md)\n\n### 基础特性演示\n\n- 自动水平伸缩 [Horizontal Pod Autoscaling](hpa.md)\n- 网络安全策略 [Network Policy](networkpolicy.md)\n- 滚动更新 [rollingupdate](rollingupdateWithZeroDowntime.md)\n\n\n"
  },
  {
    "path": "docs/guide/ingress-tls.md",
    "content": "# 使用 traefik 配置 https ingress\n\n本文档已过期，安装最新版本，请参考相关官方文档。\n\n本文档基于 traefik 配置 https ingress 规则，请先阅读[配置基本 ingress](ingress.md)。与基本 ingress-controller 相比，需要额外配置 https tls 证书，主要步骤如下：\n\n## 1.准备 tls 证书\n\n可以使用Let's Encrypt签发的免费证书，这里为了测试方便使用自签证书 (tls.key/tls.crt)，注意CN 配置为 ingress 的域名：\n\n``` bash\n$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj \"/CN=hello.test.com\"\n```\n\n## 2.在 kube-system 命名空间创建 secret: traefik-cert，以便后面 traefik-controller 挂载该证书\n\n``` bash\n$ kubectl -n kube-system create secret tls traefik-cert --key=tls.key --cert=tls.crt\n```\n\n## 3.创建 traefik-controller，增加 traefik.toml 配置文件及https 端口暴露等，详见该 yaml 文件\n\n``` bash\n$ kubectl apply -f /etc/kubeasz/manifests/ingress/traefik/tls/traefik-controller.yaml\n```\n\n## 4.创建 https ingress 例子\n\n``` bash\n# 创建示例应用\n$ kubectl run test-hello --image=nginx:alpine --port=80 --expose\n# hello-tls-ingress 示例\napiVersion: networking.k8s.io/v1beta1 \nkind: Ingress\nmetadata:\n  name: hello-tls-ingress\n  annotations:\n    kubernetes.io/ingress.class: traefik\nspec:\n  rules:\n  - host: hello.test.com\n    http:\n      paths:\n      - backend:\n          serviceName: test-hello\n          servicePort: 80\n  tls:\n  - secretName: traefik-cert\n# 创建https ingress\n$ kubectl apply -f /etc/kubeasz/manifests/ingress/traefik/tls/hello-tls.ing.yaml\n# 注意根据hello示例，需要在default命名空间创建对应的secret: traefik-cert\n$ kubectl create secret tls traefik-cert --key=tls.key --cert=tls.crt\n```\n\n## 5.验证 https 访问\n\n验证 traefik-ingress svc\n\n``` bash\n$ kubectl get svc -n kube-system traefik-ingress-service \nNAME                      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                                     AGE\ntraefik-ingress-service   NodePort   10.68.250.253   <none>        80:23456/TCP,443:23457/TCP,8080:35941/TCP   66m\n```\n\n可以看到项目默认使用nodePort 23456暴露traefik 80端口，nodePort 23457暴露 traefik 443端口，因此在客户端 hosts 增加记录 `$Node_IP hello.test.com`之后，可以在浏览器验证访问如下：\n\n``` bash\nhttps://hello.test.com:23457\n```\n\n如果你已经配置了[转发 ingress nodePort](../op/loadballance_ingress_nodeport.md)，那么增加对应 hosts记录后，可以验证访问 `https://hello.test.com`\n\n## 配置 dashboard ingress\n\n前提1：k8s 集群的dashboard 已安装\n\n```\n$ kubectl get svc -n kube-system | grep dashboard\nkubernetes-dashboard      NodePort    10.68.211.168   <none>        443:39308/TCP\t3d11h\n```\n前提2：`/etc/kubeasz/manifests/ingress/traefik/tls/traefik-controller.yaml`的配置文件`traefik.toml`开启了`insecureSkipVerify = true`\n\n配置 dashboard ingress：`kubectl apply -f /etc/kubeasz/manifests/ingress/traefik/tls/k8s-dashboard.ing.yaml` 内容如下：\n\n```\napiVersion: networking.k8s.io/v1beta1 \nkind: Ingress\nmetadata:\n  name:  kubernetes-dashboard\n  namespace: kube-system\n  annotations:\n    traefik.ingress.kubernetes.io/redirect-entry-point: https\nspec:\n  rules:\n  - host: dashboard.test.com\n    http:\n      paths:\n      - path: /\n        backend:\n          serviceName: kubernetes-dashboard\n          servicePort: 443\n```\n- 注意annotations 配置了 http 跳转 https 功能\n- 注意后端服务是443端口\n\n## 参考\n\n- [Add a TLS Certificate to the Ingress](https://docs.traefik.io/user-guide/kubernetes/#add-a-tls-certificate-to-the-ingress)\n"
  },
  {
    "path": "docs/guide/ingress.md",
    "content": "## Ingress简介\n\n本文档已过期，安装最新版本，请参考相关官方文档。\n\ningress就是从外部访问k8s集群的入口，将用户的URL请求转发到不同的service上。ingress相当于nginx反向代理服务器，它包括的规则定义就是URL的路由信息；它的实现需要部署`Ingress controller`(比如 [traefik](https://github.com/containous/traefik) [ingress-nginx](https://github.com/kubernetes/ingress-nginx) 等)，`Ingress controller`通过apiserver监听ingress和service的变化，并根据规则配置负载均衡并提供访问入口，达到服务发现的作用。\n\n- 未配置ingress：\n\n集群外部 -> NodePort -> K8S Service\n\n- 配置ingress:\n\n集群外部 -> Ingress -> K8S Service\n\n- **注意：ingress 本身也需要部署`Ingress controller`时使用以下几种方式让外部访问**\n  - 使用`NodePort`方式\n  - 使用`hostPort`方式\n  - 使用LoadBalancer地址方式\n\n- 以下讲解基于`Traefik`，如果想要了解`ingress-nginx`的原理与实践，推荐阅读博客[烂泥行天下](https://www.ilanni.com/?p=14501)的相关文章\n\n### 部署 Traefik\n\nTraefik 提供了一个简单好用 `Ingress controller`，下文侧重讲解 ingress部署和测试例子。请查看yaml配置 [traefik-ingress.yaml](../../manifests/ingress/traefik/traefik-ingress.yaml)，参考[traefik 官方k8s例子](https://github.com/containous/traefik/tree/master/examples/k8s)\n\n#### 安装 traefik ingress-controller\n\n``` bash\nkubectl create -f /etc/kubeasz/manifests/ingress/traefik/traefik-ingress.yaml\n```\n+ 注意需要配置 `RBAC`授权\n+ 注意`trafik pod`中 `80`端口为 traefik ingress-controller的服务端口，`8080`端口为 traefik 的管理WEB界面；为后续配置方便指定`80` 端口暴露`NodePort`端口为 `23456`(对应于在hosts配置中`NODE_PORT_RANGE`范围内可用端口)\n\n#### 验证 traefik ingress-controller\n\n``` bash\n# kubectl get deploy -n kube-system traefik-ingress-controller\nNAME                         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\ntraefik-ingress-controller   1         1         1            1           4m\n\n# kubectl get svc -n kube-system traefik-ingress-service\nNAME                      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                       AGE\ntraefik-ingress-service   NodePort   10.68.69.170   <none>        80:23456/TCP,8080:34815/TCP   4m\n```\n+ 可以看到`traefik-ingress-service` 服务端口`80`暴露的nodePort确实为`23456`\n\n#### 测试 ingress\n\n+ 首先创建测试用K8S应用，并且该应用服务不用nodePort暴露，而是用ingress方式让外部访问\n\n``` bash\nkubectl run test-hello --image=nginx:alpine --expose --port=80\n##\n# kubectl get deploy test-hello\nNAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\ntest-hello   1         1         1            1           56s\n# kubectl get svc test-hello\nNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE\ntest-hello   ClusterIP   10.68.124.115   <none>        80/TCP    1m\n```\n+ 然后为这个应用创建 ingress，`kubectl create -f /etc/kubeasz/manifests/ingress/test-hello.ing.yaml`\n\n``` bash\n# test-hello.ing.yaml内容\napiVersion: networking.k8s.io/v1beta1 \nkind: Ingress\nmetadata:\n  name: test-hello\nspec:\n  rules:\n  - host: hello.test.com\n    http:\n      paths:\n      - path: /\n        backend:\n          serviceName: test-hello\n          servicePort: 80\n```\n+ 集群内部尝试访问: `curl -H Host:hello.test.com 10.68.69.170(traefik-ingress-service的服务地址)` 能够看到欢迎页面 `Welcome to nginx!`；\n+ 在集群外部尝试访问(假定集群一个NodeIP为 192.168.1.1): `curl -H Host:hello.test.com 192.168.1.1:23456`，也能够看到欢迎页面 `Welcome to nginx!`，说明ingress测试成功\n\n#### 为 traefik WEB 管理页面创建 ingress 规则 \n\n`kubectl create -f /etc/kubeasz/manifests/ingress/traefik/traefik-ui.ing.yaml`\n\n``` bash\n# traefik-ui.ing.yaml内容\n---\napiVersion: networking.k8s.io/v1beta1 \nkind: Ingress\nmetadata:\n  name: traefik-web-ui\n  namespace: kube-system\nspec:\n  rules:\n  - host: traefik-ui.test.com\n    http:\n      paths:\n      - path: /\n        backend:\n          serviceName: traefik-ingress-service\n          servicePort: 8080\n```\n\n+ 在集群外部可以使用 `curl -H Host:traefik-ui.test.com 192.168.1.1:23456` 尝试访问WEB管理页面，返回 `<a href=\"/dashboard/\">Found</a>.`说明 traefik-ui的ingress配置生效了。\n\n+ 在客户端主机也可以通过修改本机 `hosts` 文件，如上例子，增加两条记录：\n\n``` text\n192.168.1.1\thello.test.com\n192.168.1.1\ttraefik-ui.test.com\n```\n打开浏览器输入域名 `http://hello.test.com:23456` 和 `http://traefik-ui.test.com:23456` 就可以访问k8s的应用服务了。\n\n### 可选1: 使用`LoadBalancer`服务类型来暴露ingress，自有环境（非公有云）可以参考[metallb文档](metallb.md)\n\n``` bash\n# 修改traefik-ingress 使用 LoadBalancer服务\n$ sed -i 's/NodePort$/LoadBalancer/g' /etc/kubeasz/manifests/ingress/traefik/traefik-ingress.yaml\n# 创建traefik-ingress\n$ kubectl apply -f /etc/kubeasz/manifests/ingress/traefik/traefik-ingress.yaml\n# 验证\n$ kubectl get svc --all-namespaces |grep traefik\nkube-system   traefik-ingress-service   LoadBalancer   10.68.163.243   192.168.1.241   80:23456/TCP,8080:37088/TCP   1m\n```\n这时可以修改客户端本机 `hosts`文件：(如上例192.168.1.241)\n\n``` text\n192.168.1.241     hello.test.com\n192.168.1.241     traefik-ui.test.com\n```\n打开浏览器输入域名 `http://hello.test.com` 和 `http://traefik-ui.test.com`可以正常访问。\n\n### 可选2: 部署`ingress-service`的负载均衡\n\n- 利用 nginx/haproxy 等集群，可以做代理转发以去掉 `23456`这个端口。如果你的集群根据本项目部署了高可用方案，那么可以利用`LB` 节点haproxy 来做，当然如果生产环境K8S应用已经部署非常多，建议还是使用独立的 `nginx/haproxy`集群。\n\n具体参考[配置转发 ingress nodePort](../op/loadballance_ingress_nodeport.md)，如上配置访问集群`MASTER_IP`的`80`端口时，由haproxy代理转发到实际的node节点暴露的nodePort端口上了。这时可以修改客户端本机 `hosts`文件如下：(假定 MASTER_IP=192.168.1.10)\n\n``` text\n192.168.1.10     hello.test.com\n192.168.1.10    traefik-ui.test.com\n```\n打开浏览器输入域名 `http://hello.test.com` 和 `http://traefik-ui.test.com`可以正常访问。\n\n## 下一步[配置https ingress](ingress-tls.md)\n"
  },
  {
    "path": "docs/guide/ipvs.md",
    "content": "# IPVS 服务负载均衡\n\nkube-proxy 组件监听 API server 中 service 和 endpoint 的变化情况，从而为 k8s 集群内部的 service 提供动态负载均衡。在v1.10之前主要通过 iptables来实现，是稳定、推荐的方式，但是当服务多的时候会产生太多的 iptables 规则，大规模情况下有明显的性能问题；在v1.11 GA的 ipvs高性能负载模式，采用增量式更新，并可以保证 service 更新期间连接的保持。\n\n- NOTE: k8s v1.11.0 CentOS7下使用ipvs模式会有问题（见 kubernetes/kubernetes#65461），测试 k8s v1.10.2 CentOS7 可以。\n\n## 启用 ipvs\n\n建议 k8s 版本1.13 及以后启用 ipvs，只要在 kube-proxy 启动参数（或者配置文件中）中增加 `--proxy-mode=ipvs`:\n\n``` bash\n[Unit]\nDescription=Kubernetes Kube-Proxy Server\nAfter=network.target\n\n[Service]\nWorkingDirectory=/var/lib/kube-proxy\nExecStart={{ bin_dir }}/kube-proxy \\\n  --bind-address={{ NODE_IP }} \\\n  --hostname-override={{ NODE_IP }} \\\n  --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \\\n  --logtostderr=true \\\n  --proxy-mode=ipvs\nRestart=on-failure\nRestartSec=5\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target\n```\n"
  },
  {
    "path": "docs/guide/istio.md",
    "content": "---\ntitle: \"Istio 1.1.7 安装　\"\ndate: 2019-05-19T19:44:00+08:00\n---\n\n#### Service Mesh(服务网格)  \n\n--- \nKubernetes 已经给我们带来了诸多的好处。但是仍有些需求比如 A/B 测试、金丝雀发布、限流、访问控制,端到端认证等需要运维人员进一步去解决。\n\nIstio 是完全开源的服务网格,提供了一套完整的解决方案，可以透明地分层到现有的分布式应用程序上。对开发人员几乎无感的同时获得超能力。\n\n如果想要现有的服务支持 Istio，只需要在当前的环境中部署一个特殊的 sidecar 代理，即可。\n\n##### 前提   \n\n---- \n\n- 安装 Kubernetes 集群 1.9+ \n- [安装 Helm](./helm.md)   \n\n##### 准备\n\n---- \n\n进入 [Istio release](https://github.com/istio/istio/releases) 页面下载最新版安装包并解压到当前目录,\n\n```sh\ncurl -L https://git.io/getLatestIstio | sh -\n\n\nll istio-1.1.7/\ntotal 40\ndrwxr-xr-x  2 root root  4096 May 15 08:59 bin\ndrwxr-xr-x  6 root root  4096 May 15 08:59 install\n-rw-r--r--  1 root root   602 May 15 08:59 istio.VERSION\n-rw-r--r--  1 root root 11343 May 15 08:59 LICENSE\n-rw-r--r--  1 root root  5921 May 15 08:59 README.md\ndrwxr-xr-x 15 root root  4096 May 15 08:59 samples\ndrwxr-xr-x  7 root root  4096 May 15 08:59 tools\n```\n- install  Kubernetes 安装所需的 .yaml 文件\n- samples  Task中的示例应用\n- bin/istioctl 客户端工具\n- istio.VERSION 配置文件\n\n#### 安装 \n---- \n\n注意事项\n\n- Node 节点内存不能低于 4G，否则相关容器可能启动失败  \n- Istio 默认使用‘负载均衡器’服务对象类型。对于裸机安装没有负载均衡器的情况下，安装需指定‘NodePort’类型。\n\n\n##### 方案1：使用 Helm template 进行安装\n\n```bash\ncd /usr/local/src/istio-1.1.7\n\nkubectl create namespace istio-system\n\n# 安装 istio-init chart，来启动 Istio CRD 的安装过程\nhelm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system --set gateways.istio-ingressgateway.type=NodePort --set gateways.istio-egressgateway.type=NodePort | kubectl apply -f -\n\n# 稍等一会儿执行\n# 输出 23 或者 28 （若开启了 cert-manager）\nkubectl get crds | grep 'istio.io\\|certmanager.k8s.io' | wc -l\n\n# 部署与你选择的配置文件相对应的 Istio 的核心组件\n# 不同配置说明 https://istio.io/zh/docs/setup/kubernetes/additional-setup/config-profiles/\n\n# 选择 default 配置\nhelm template install/kubernetes/helm/istio --name istio --namespace istio-system \\\n  --set gateways.istio-ingressgateway.type=NodePort \\\n  --set gateways.istio-egressgateway.type=NodePort | kubectl apply -f -\n\n# 或选择 demo 配置\nhelm template install/kubernetes/helm/istio --name istio --namespace istio-system \\\n  --set gateways.istio-ingressgateway.type=NodePort \\\n  --set gateways.istio-egressgateway.type=NodePort \\\n  --values install/kubernetes/helm/istio/values-istio-demo.yaml | kubectl apply -f -\n```\n\n##### 方案2：在 Helm 和 Tiller 的环境中使用 helm install 命令进行安装\n\n见[官方文档](https://istio.io/zh/docs/setup/kubernetes/install/helm/#%E6%96%B9%E6%A1%88-2-%E5%9C%A8-helm-%E5%92%8C-tiller-%E7%9A%84%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-helm-install-%E5%91%BD%E4%BB%A4%E8%BF%9B%E8%A1%8C%E5%AE%89%E8%A3%85)\n\n\n##### 验证\n```bash\nkubectl get pod -n istio-system\n\n# default 配置时\nNAME                                     READY   STATUS    RESTARTS   AGE\nistio-citadel-899dfb67c-5hlsc             1/1     Running     0          49s\nistio-cleanup-secrets-1.1.7-nkdxt         0/1     Completed   0          50s\nistio-galley-555dd7c7d7-rpfln             1/1     Running     0          49s\nistio-ingressgateway-5b547dfb7b-ctm5l     1/1     Running     0          49s\nistio-init-crd-10-l9xcj                   0/1     Completed   0          66s\nistio-init-crd-11-nqvml                   0/1     Completed   0          66s\nistio-pilot-9f5c75ddf-n5s6p               2/2     Running     0          49s\nistio-policy-bd45d757d-6qcdg              2/2     Running     1          49s\nistio-security-post-install-1.1.7-nbwwv   0/1     Completed   0          50s\nistio-sidecar-injector-998dd6cbb-n2hdm    1/1     Running     0          49s\nistio-telemetry-656df5b64-k8vkf           2/2     Running     1          49s\nprometheus-7f87866f5f-t97wc               1/1     Running     0          49s\n\n# demo 配置时\ngrafana-749c78bcc5-fbzmn                  1/1     Running     0          101s\nistio-citadel-899dfb67c-8shx2             1/1     Running     0          100s\nistio-cleanup-secrets-1.1.7-jbhsl         0/1     Completed   0          102s\nistio-egressgateway-748d5fd794-x5bjt      1/1     Running     0          101s\nistio-galley-555dd7c7d7-86r2b             1/1     Running     0          101s\nistio-grafana-post-install-1.1.7-kq7b4    0/1     Completed   0          103s\nistio-ingressgateway-55dd86767f-jd9m4     1/1     Running     0          101s\nistio-init-crd-10-l9xcj                   0/1     Completed   0          16m\nistio-init-crd-11-nqvml                   0/1     Completed   0          16m\nistio-pilot-6964dd4957-7bzdq              2/2     Running     0          101s\nistio-policy-689687bd77-ncw2n             2/2     Running     1          101s\nistio-security-post-install-1.1.7-t2kwh   0/1     Completed   0          102s\nistio-sidecar-injector-998dd6cbb-7mwkh    1/1     Running     0          100s\nistio-telemetry-8564679887-59c8z          2/2     Running     1          101s\nistio-tracing-595796cf54-jn49s            1/1     Running     0          100s\nkiali-5df77dc9b6-psjs4                    1/1     Running     0          101s\nprometheus-7f87866f5f-hrbgt               1/1     Running     0          100s\n\n```\n\n```bash\nkubectl get svc -n istio-system\n\n# default 配置时\nNAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                        AGE\nistio-citadel            ClusterIP   10.68.236.249   <none>        8060/TCP,15014/TCP             75s\nistio-galley             ClusterIP   10.68.105.102   <none>        443/TCP,15014/TCP,9901/TCP     75s\nistio-ingressgateway     NodePort    10.68.181.46    <none>        15020:32761/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:33185/TCP,15030:20745/TCP,15031:36208/TCP,15032:34095/TCP,15443:36244/TCP   75s\nistio-pilot              ClusterIP   10.68.252.143   <none>        15010/TCP,15011/TCP,8080/TCP,15014/TCP   75s\nistio-policy             ClusterIP   10.68.40.51     <none>        9091/TCP,15004/TCP,15014/TCP   75s\nistio-sidecar-injector   ClusterIP   10.68.55.134    <none>        443/TCP                        74s\nistio-telemetry          ClusterIP   10.68.16.11     <none>        9091/TCP,15004/TCP,15014/TCP,42422/TCP       75s\nprometheus               ClusterIP   10.68.65.238    <none>        9090/TCP                       75s\n\n# demo 配置时\nNAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                        AGE\ngrafana                  ClusterIP   10.68.65.248    <none>        3000/TCP                       2m27s\nistio-citadel            ClusterIP   10.68.72.100    <none>        8060/TCP,15014/TCP             2m26s\nistio-egressgateway      NodePort    10.68.21.24     <none>        80:26775/TCP,443:28249/TCP,15443:38494/TCP  2m27s\nistio-galley             ClusterIP   10.68.73.9      <none>        443/TCP,15014/TCP,9901/TCP     2m27s\nistio-ingressgateway     NodePort    10.68.122.190   <none>        15020:39248/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:33522/TCP,15030:26010/TCP,15031:27064/TCP,15032:32158/TCP,15443:30848/TCP   2m27s\nistio-pilot              ClusterIP   10.68.116.5     <none>        15010/TCP,15011/TCP,8080/TCP,15014/TCP  2m26s\nistio-policy             ClusterIP   10.68.239.246   <none>        9091/TCP,15004/TCP,15014/TCP   2m27s\nistio-sidecar-injector   ClusterIP   10.68.93.151    <none>        443/TCP                        2m26s\nistio-telemetry          ClusterIP   10.68.117.254   <none>        9091/TCP,15004/TCP,15014/TCP,42422/TCP  2m26s\njaeger-agent             ClusterIP   None            <none>        5775/UDP,6831/UDP,6832/UDP     2m25s\njaeger-collector         ClusterIP   10.68.103.8     <none>        14267/TCP,14268/TCP            2m26s\njaeger-query             ClusterIP   10.68.73.252    <none>        16686/TCP                      2m26s\nkiali                    ClusterIP   10.68.214.228   <none>        20001/TCP                      2m27s\nprometheus               ClusterIP   10.68.203.209   <none>        9090/TCP                       2m26s\ntracing                  ClusterIP   10.68.113.236   <none>        80/TCP                         2m25s\nzipkin                   ClusterIP   10.68.96.189    <none>        9411/TCP                       2m25s\n```\n\n##### Sidecar 的自动注入\n\n注意事项\n\n需要在kube-apiserver 启动 admission-control 参数中加入 MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook并确保正确的顺序,如果是多master安装，确保每个kube-apiserver都要进行修改。\n\n\n##### 部署应用验证\n\nistio 的samples目录中有很多示例。我们现在使用samples/sleep/sleep.yaml 来验证刚刚开启的Sidecar自动注入功能。\n\n进入目录 istio-1.1.7/ 部署一个新的应用\n\n```bash\ncd istio-1.1.7/\nkubectl apply -f samples/sleep/sleep.yaml\n\nkubectl get pod \nNAME                            READY   STATUS    RESTARTS   AGE\nsleep-7549f66447-wv8cl          1/1     Running   0          1m\n```\n\n一切都是熟悉的味道。下面给 default 命名空间设置标签：istio-injection=enabled，这样就会在pod 创建时触发 Sidecar 的注入过程。从此default 名称空间拥有了超能力.\n\n```bash\nkubectl label namespace default istio-injection=enabled\nkubectl get namespace -L istio-injection\nNAME           STATUS   AGE     ISTIO-INJECTION\ndefault        Active   1h    enabled\nistio-system   Active   3d22h   \nkube-public    Active   4d2h    \nkube-system    Active   4d2h\n```\n接下来删除上面创建的pod，观察下有什么变化。\n\n```bash\nkubectl delete pod sleep-7549f66447-wv8cl\npod \"sleep-7549f66447-wv8cl\" deleted\n\nkubectl get pod \nNAME                            READY   STATUS    RESTARTS   AGE\nsleep-7549f66447-x4td6          2/2     Running   0          37s\n```\n\n刚刚的pod里面现在已经拥有两个容器，进入pod一探究竟。\n```bash\n kubectl describe pod sleep-7549f66447-x4td6\n\n ....\n  Containers:\n   sleep:\n    Container ID:   docker://\n    Image:         pstauffer/curl\n    .... \n   \n   istio-proxy:\n    Container ID:   docker://\n    Image:         docker.io/istio/proxyv2:1.1.7\n    ....\n    \n```\n多出了一个 `istio-proxy` 容器及其对应的存储卷\n\n\n#### 卸载istio \n\n---\n\n```bash\n# 采用 default 配置安装\nhelm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -\n# 采用 demo 配置安装\nhelm template install/kubernetes/helm/istio --name istio --namespace istio-system \\\n  --values install/kubernetes/helm/istio/values-istio-demo.yaml | kubectl delete -f -\n\nkubectl delete namespace istio-system\n```\n\n\n#### 资源\n- [官方安装文档](https://istio.io/zh/docs/setup/kubernetes/install/helm/)\n"
  },
  {
    "path": "docs/guide/kernel_upgrade.md",
    "content": "# Linux Kernel 升级\n\nk8s,docker,cilium等很多功能、特性需要较新的linux内核支持，所以有必要在集群部署前对内核进行升级；CentOS7 和 Ubuntu16.04可以很方便的完成内核升级。\n\n## CentOS7\n\n红帽企业版 Linux 仓库网站 https://www.elrepo.org，主要提供各种硬件驱动（显卡、网卡、声卡等）和内核升级相关资源；兼容 CentOS7 内核升级。如下按照网站提示载入elrepo公钥及最新elrepo版本，然后按步骤升级内核（以安装长期支持版本 kernel-lt 为例）\n\n``` bash\n#安装所需软件包\nyum install -y perl wget\n\n#下载所需内核版本的 RPM 包，更多版本可以从中寻找（http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/）\nwget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm\nwget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm\nwget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.278-1.el7.elrepo.x86_64.rpm\nwget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-tools-5.4.278-1.el7.elrepo.x86_64.rpm\nwget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-tools-libs-5.4.278-1.el7.elrepo.x86_64.rpm\n\n# 卸载旧版工具（安装kernel-lt-tools会和旧版本的kernel-tools导致冲突，需要卸载旧版本的）\nyum remove kernel-tools kernel-tools-libs -y\n\n#安装下载的 RPM 包\nrpm -ivh kernel-lt-tools-libs-5.4.278-1.el7.elrepo.x86_64.rpm\nrpm -ivh kernel-lt-tools-5.4.278-1.el7.elrepo.x86_64.rpm \nrpm -ivh kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm\nrpm -ivh kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm \n\n#验证安装，可以看到新版本的和旧版本的\nrpm -qa | grep kernel\nkernel-lt-5.4.278-1.el7.elrepo.x86_64\nkernel-lt-tools-libs-5.4.278-1.el7.elrepo.x86_64\nkernel-3.10.0-1160.71.1.el7.x86_64\nkernel-lt-devel-5.4.278-1.el7.elrepo.x86_64\nkernel-lt-tools-5.4.278-1.el7.elrepo.x86_64\n\n#查看默认启动顺序\nawk -F\\' '$1==\"menuentry \" {print i++ \" : \" $2}' /etc/grub2.cfg\n0 : CentOS Linux (5.4.278-1.el7.elrepo.x86_64) 7 (Core)\n1 : CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)\n2 : CentOS Linux (0-rescue-0b208d4cc51848998d32430e022d3040) 7 (Core)\n#设置默认启动内核顺序\ngrub2-set-default 0  \n#重启\nreboot\n#重启后进行检查是否成功切换到新内核\nuname -r\n5.4.278-1.el7.elrepo.x86_64\n```\n\n## Ubuntu16.04\n\n``` bash\n打开 http://kernel.ubuntu.com/~kernel-ppa/mainline/ 并选择列表中选择你需要的版本（以4.16.3为例）。\n接下来，根据你的系统架构下载 如下.deb 文件：\nBuild for amd64 succeeded (see BUILD.LOG.amd64):\n  linux-headers-4.16.3-041603_4.16.3-041603.201804190730_all.deb\n  linux-headers-4.16.3-041603-generic_4.16.3-041603.201804190730_amd64.deb\n  linux-image-4.16.3-041603-generic_4.16.3-041603.201804190730_amd64.deb\n#安装后重启即可\n$ sudo dpkg -i *.deb\n```\n"
  },
  {
    "path": "docs/guide/kubedns.md",
    "content": "# 集群 DNS\n\nDNS 是 k8s 集群首要部署的组件，它为集群中的其他 pods 提供域名解析服务；主要可以解析 `集群服务名 SVC` 和 `Pod hostname`；目前建议部署 `coredns`。\n\nNodeLocal DNSCache在集群的上运行一个dnsCache daemonset来提高clusterDNS性能和可靠性。在K8S集群上的一些测试表明：相比于纯coredns方案，nodelocaldns + coredns方案能够大幅降低DNS查询timeout的频次，提升服务稳定性。参考官方文档：https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/\n\n### 部署 dns\n\n配置文件参考 `https://github.com/kubernetes/kubernetes` 项目目录 `kubernetes/cluster/addons/dns`\n\n+ 安装\n\n目前 kubeasz 已经自动集成安装 coredns 和 nodelocaldns 组件，配置模板位于`roles/cluster-addon/templates/`目录。\n\n``` bash\n# 默认已经集成安装，假设集群名为xxxx\nezctl setup xxxx all\n\n# 如果需要分步安装\nezctl setup xxxx 07\n\n# 如果需要手动安装\nkubectl apply -f /etc/kubeasz/clusters/xxxx/yml/coredns.yaml\nkubectl apply -f /etc/kubeasz/clusters/xxxx/yml/nodelocaldns.yaml\n```\n\n### 验证 dns服务\n\n新建一个测试nginx服务\n\n`kubectl run nginx --image=nginx --expose --port=80`\n\n确认nginx服务\n\n``` bash\nkubectl get pod|grep nginx\nnginx-7cbc4b4d9c-fl46v   1/1       Running   0          1m\nkubectl get svc|grep nginx\nnginx        ClusterIP   10.68.33.167   <none>        80/TCP    1m\n```\n\n测试pod alpine\n\n``` bash\nkubectl run test --rm -it --image=alpine /bin/sh\nIf you don't see a command prompt, try pressing enter.\n\n/ # cat /etc/resolv.conf\nnameserver 10.68.0.2\nsearch default.svc.cluster.local. svc.cluster.local. cluster.local.\noptions ndots:5\n\n# 测试集群内部服务解析\n/ # nslookup nginx.default.svc.cluster.local\nServer:    10.68.0.2\nAddress 1: 10.68.0.2 kube-dns.kube-system.svc.cluster.local\n\nName:      nginx\nAddress 1: 10.68.33.167 nginx.default.svc.cluster.local\n\n/ # nslookup kubernetes.default.svc.cluster.local\nServer:    10.68.0.2\nAddress 1: 10.68.0.2 kube-dns.kube-system.svc.cluster.local\n\nName:      kubernetes\nAddress 1: 10.68.0.1 kubernetes.default.svc.cluster.local\n\n# 测试外部域名的解析，默认集成node的dns解析\n/ # nslookup www.baidu.com\nServer:    10.68.0.2\nAddress 1: 10.68.0.2 kube-dns.kube-system.svc.cluster.local\n\nName:      www.baidu.com\nAddress 1: 180.97.33.108\nAddress 2: 180.97.33.107\n/ #\n```\n\n- Note1: 如果你使用`calico`网络组件，安装完集群后，直接安装dns组件，可能会出现如下BUG，分析是因为calico分配pod地址时候会从网段的第一个地址（网络地址）开始，详见提交的 [ISSUE #1710](https://github.com/projectcalico/calico/issues/1710)，临时解决办法为手动删除POD，重新创建后获取后面的IP地址\n\n```\n# BUG出现现象\n$ kubectl get pod --all-namespaces -o wide\nNAMESPACE     NAME                                       READY     STATUS             RESTARTS   AGE       IP              NODE\ndefault       busy-5cc98488d4-s894w                      1/1       Running            0          28m       172.20.24.193   192.168.97.24\nkube-system   calico-kube-controllers-6597d9c664-nq9hn   1/1       Running            0          1h        192.168.97.24   192.168.97.24\nkube-system   calico-node-f8gnf                          2/2       Running            0          1h        192.168.97.24   192.168.97.24\nkube-system   kube-dns-69bf9d5cc9-c68mw                  0/3       CrashLoopBackOff   27         31m       172.20.24.192   192.168.97.24\n\n# 解决办法，删除pod，自动重建\n$ kubectl delete pod -n kube-system kube-dns-69bf9d5cc9-c68mw\n```\n\n- Note2: 使用``` kubectl run test -it --rm --image=busybox /bin/sh``` 进行解析测试可能会失败, busybox内的nslookup程序有bug, 详见 https://github.com/kubernetes/dns/issues/109\n"
  },
  {
    "path": "docs/guide/kubesphere.md",
    "content": "# 在 Kubernetes 安装 KubeSphere 容器平台\n\n## 什么是 KubeSphere\n\n[KubeSphere](https://github.com/kubesphere/kubesphere) 是在 [Kubernetes](https://kubernetes.io) 之上构建的面向云原生应用的**开源容器平台**，支持多云与多集群管理，提供全栈的 IT 自动化运维能力，简化企业的 DevOps 工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用 (plug-and-play) 的集成。\n\nKubeSphere 作为一个**全栈的多租户容器平台**，不仅支持**安装和纳管原生 Kubernetes**，还设计了一套完整的管理界面，方便开发者与运维人员在一个**统一的平台**中安装与管理最常用的云原生工具，**从业务视角提供一致的用户体验来降低复杂性**。目前最新的 3.0 版本提供以下功能：\n\n|功能 |介绍 |\n| --- | ---|\n| Kubernetes 集群搭建与运维 | 支持在线 & 离线安装、升级与扩容 Kubernetes 集群，支持安装 “云原生全家桶” |\n| Kubernetes 资源可视化管理 | 比 Kubernetes 原生 Dashboard 功能更丰富的控制面板，支持向导式创建与管理 Kubernetes 资源 |\n| 基于 Jenkins 的 DevOps 系统 | 支持图形化与脚本两种方式构建 CI/CD 流水线，内置 Source/Binary to Image 等 CD 工具 |\n| 应用商店与应用生命周期管理 | 内置 Redis、MySQL 等十五个常用应用，基于 Helm 提供应用上传、审核、发布、部署、下架等操作 |\n| 基于 Istio 的微服务治理 (Service Mesh) | 提供可视化无代码侵入的**灰度发布、熔断机制、流量治理与流量拓扑、分布式链路追踪** |\n| 多租户管理 | 提供基于角色的细粒度多租户统一认证，支持**对接企业 LDAP/AD**，提供多层级的权限管理 |\n| 丰富的可观察性功能 | UI 提供集群/工作负载/Pod/容器等多维度的监控、事件/日志查询、告警与通知管理 |\n| 存储管理 | 支持对接 Ceph、GlusterFS、NFS，支持可视化管理 PVC、PV、StorageClass |\n| 网络管理 | 支持 Calico、Flannel，提供 Porter LB 帮助暴露物理环境 Kubernetes 集群的 LoadBalancer 服务 |\n| GPU support | 集群支持添加 GPU 与 vGPU，可运行 TensorFlow 等 ML 框架 |\n\n\n## 在 Kubernetes 与 Kubeasz 之上安装 KubeSphere\n\n作为一个轻量化容器平台，KubeSphere 可以安装在任何私有或托管的 Kubernetes、虚拟机、裸机、本地环境、公有云、混合云之上，并且所有功能组件都是可插拔的。当使用 Kubeasz 完成 Kubernetes 集群的安装后，可参考以下步骤在 Kubernetes 上安装 KubeSphere。\n\n**前提条件**\n\n> - Kubernetes 版本必须是：1.15.x、1.16.x、1.17.x 或 1.18.x；\n> - 您的机器满足最低硬件要求：CPU > 1 Core，可用内存 > 2 G；\n> - 安装之前，Kubernetes 集群已配置**默认**存储类型 (StorageClass)；\n> - 当使用 `--cluster-signing-cert-file` 和 `--cluster-signing-key-file` 参数启动时，在 `kube-apiserver` 中会激活 CSR 签名功能。请参见 [RKE 安装问题](https://github.com/kubesphere/kubesphere/issues/1925#issuecomment-591698309)；\n> - 有关在 Kubernetes 上安装 KubeSphere 的准备工作，请参见[准备工作](https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequisites/)。\n>\n\n1. 若待安装的环境满足以上条件，则可以执行以下命令部署 KubeSphere：\n\n   ```yaml\n   kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/kubesphere-installer.yaml\n   \n   kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/cluster-configuration.yaml\n   ```\n\n2. 等待安装成功（取决于您的网络状况，约十几至二十几分钟不等），运行以下命令查看安装日志：\n\n   ```bash\n   kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f\n   ```\n\n  ![](https://pek3b.qingstor.com/kubesphere-docs/png/20191005195724.png)\n\n3. 使用 `kubectl get pod --all-namespaces` 查看所有 Pod 是否在 KubeSphere 的相关命名空间中正常运行。如果是，请通过以下命令检查控制台的端口（默认为 `30880`）：\n\n   ```bash\n   kubectl get svc/ks-console -n kubesphere-system\n   ```\n\n4. 请确保在安全组中打开了端口 `30880`，并通过 NodePort `(IP:30880)` 使用默认帐户和密码 `(admin/P@88w0rd)` 访问 Web 控制台。\n\n5. 登录控制台后，您可以在**服务组件**中查看不同组件的状态。如果要使用相关服务，可能需要等待某些组件启动并运行。\n\n**Tips**：若要在 KubeSphere 中启用其他组件，请参见[启用可插拔组件](https://kubesphere.io/zh/docs/pluggable-components/)。开启安装前确认您的机器资源已符合[资源最低要求](https://kubesphere.io/zh/docs/pluggable-components/overview/)。\n\n## 延伸阅读\n\n- [安装 Kubeasz 与 KubeSphere](https://kubesphere.com.cn/forum/d/716-play-with-kubesphere-and-kubeasz)\n- [在 Linux 完整安装 KubeSphere 与 Kubernetes](https://kubesphere.io/zh/docs/installing-on-linux/introduction/intro/)\n- [KubeSphere 官网](https://kubesphere.io/zh/)\n- [常见问题](https://kubesphere.io/zh/docs/faq/)\n\n\n"
  },
  {
    "path": "docs/guide/log-pilot.md",
    "content": "# Log-Pilot Elasticsearch Kibana 日志解决方案\n\n该方案是社区方案`EFK`的升级版，它支持两种搜集形式，对应容器标准输出日志和容器内的日志文件；个人使用了一把，在原有`EFK`经验的基础上非常简单、方便，值得推荐；更多的关于`log-pilot`的介绍详见链接：\n\n- github 项目地址: https://github.com/AliyunContainerService/log-pilot\n- 阿里云介绍文档: https://help.aliyun.com/document_detail/86552.html\n- 介绍文档2: https://yq.aliyun.com/articles/674327\n\n## 安装步骤\n\n- 1.安装 ES 集群，同[EFK](efk.md)文档\n\n- 2.安装 Kibana，同[EFK](efk.md)文档\n\n- 3.安装 Log-Pilot\n\n``` bash\nkubectl apply -f /etc/kubeasz/manifests/efk/log-pilot/log-pilot-filebeat.yaml\n```\n\n- 4.创建示例应用，采集日志\n\n``` bash\n$ cat > tomcat.yaml << EOF\napiVersion: v1\nkind: Pod\nmetadata:\n  name: tomcat\nspec:\n  containers:\n  - name: tomcat\n    image: \"tomcat:7.0\"\n    env:\n    # 1、stdout为约定关键字，表示采集标准输出日志\n    # 2、配置标准输出日志采集到ES的catalina索引下\n    - name: aliyun_logs_catalina\n      value: \"stdout\"\n    # 1、配置采集容器内文件日志，支持通配符\n    # 2、配置该日志采集到ES的access索引下\n    - name: aliyun_logs_access\n      value: \"/usr/local/tomcat/logs/catalina.*.log\"\n    volumeMounts:\n      - name: tomcat-log\n        mountPath: /usr/local/tomcat/logs\n  volumes:\n    # 容器内文件日志路径需要配置emptyDir\n    - name: tomcat-log\n      emptyDir: {}\nEOF\n\n$ kubectl apply -f tomcat.yaml \n```\n\n- 5.在 kibana 创建 Index Pattern，验证日志已搜集，如上示例应用，应创建如下 index pattern\n  - catalina-*\n  - access-*\n"
  },
  {
    "path": "docs/guide/lvm.md",
    "content": "# LVM 操作\n\n以下是使用 parted 对 /dev/sdb 进行分区并配置 LVM 的完整操作流程，包含详细解释和注意事项。\n\n## 1. 磁盘分区 (使用 parted)\n\n``` bash\nsudo parted /dev/sdb\n# 在交互界面执行：\n(parted) mklabel gpt           # 创建 GPT 分区表（兼容大容量磁盘）\n(parted) mkpart lvm 0% 100%    # 创建占用整个磁盘的 LVM 分区\n(parted) set 1 lvm on          # 设置分区类型为 LVM\n(parted) print                 # 验证分区信息\n(parted) quit                  # 退出\n# 验证分区结果：应看到 sdb1 分区\nlsblk /dev/sdb\n```\n\n## 2. 创建物理卷 (PV)\n\n``` bash\nsudo pvcreate /dev/sdb1         # 将分区初始化为物理卷\nsudo pvs                        # 查看已创建的物理卷\n# 输出示例：\n  PV         VG Fmt  Attr PSize   PFree\n  /dev/sdb1     lvm2 ---  100.00g 100.00g\n```\n\n## 3. 创建卷组 (VG)\n\n``` bash\nsudo vgcreate vg_data /dev/sdb1  # 创建名为 vg_data 的卷组\nsudo vgs                         # 查看卷组信息\n# 参数说明：\n● vg_data：自定义卷组名称\n● -s 4M：可指定 PE 大小（默认 4MB）\n```\n\n## 4. 创建逻辑卷 (LV)\n\n```\nsudo lvcreate -n lv_app -L 50G vg_data  # 创建 50G 的逻辑卷\nsudo lvs                               # 查看逻辑卷\n可选参数：\n● -l 100%FREE：使用全部剩余空间\n● -i 3 -I 4：创建条带化卷（需多磁盘）\n```\n\n## 5. 创建文件系统\n\n```\nsudo mkfs.xfs /dev/vg_data/lv_app  # 创建 XFS 文件系统\n# 或使用 ext4：\n# sudo mkfs.ext4 /dev/vg_data/lv_app\n格式选择建议：\n● XFS：适合大文件/高并发\n● ext4：兼容性好\n```\n\n## 6. 挂载文件系统\n\n```\nsudo mkdir /data            \t     \t\t# 创建挂载点\nsudo mount /dev/vg_data/lv_app /data  \t\t# 临时挂载\ndf -hT /data                          \t\t# 验证挂载\n# 持久化挂载：\necho '/dev/mapper/vg_data-lv_app /data xfs defaults 0 0' | sudo tee -a /etc/fstab\nsudo mount -a                    # 测试 fstab 配置\n```\n- 建议使用uuid方式挂载\n```\n# 查看uuid\nsudo blkid /dev/mapper/vg_data-lv_app\n/dev/mapper/vg_data-lv_app: UUID=\"b8520e35-3a01-4ec7-b31a-3371f31c4de7\" BLOCK_SIZE=\"4096\" TYPE=\"xfs\"\n#\necho 'UUID=\"b8520e35-3a01-4ec7-b31a-3371f31c4de7\" /data xfs defaults 0 0' | sudo tee -a /etc/fstab\n```\n\n## 完整操作流程图\ngraph TD A[磁盘/dev/sdb] --> B[parted创建GPT分区] B --> C[pvcreate创建物理卷] C --> D[vgcreate创建卷组] D --> E[lvcreate创建逻辑卷] E --> F[mkfs创建文件系统] F --> G[mount挂载使用]\nmermaidgraph TD\n    A[磁盘/dev/sdb] --> B[parted创建GPT分区]\n    B --> C[pvcreate创建物理卷]\n    C --> D[vgcreate创建卷组]\n    D --> E[lvcreate创建逻辑卷]\n    E --> F[mkfs创建文件系统]\n    F --> G[mount挂载使用]\n\n关键命令速查表\n\n| 操作 | 命令 |\n|:---|:---|\n|查看块设备|lsblk|\n|验证分区表|parted /dev/sdb print|\n|扩展逻辑卷|lvextend -L +10G /dev/vg_data/lv_app|\n|扩展文件系统 (XFS)|xfs_growfs /data|\n|扩展文件系统 (ext4)|resize2fs /dev/vg_data/lv_app|\n|删除卷组|vgremove vg_data|\n\n注意事项\n● 数据备份：操作前确认磁盘无重要数据\n● 容量对齐：生产环境建议保持 1MB 对齐（parted 使用 % 单位自动对齐）\n● 在线扩展：XFS 支持在线扩容，但不支持缩小\n● RAID 整合：可在 LVM 层整合多个 PV 实现软 RAID\n● 快照功能：使用 lvcreate -s 创建快照卷实现备份\n通过以上步骤，您已成功将原始磁盘配置为可弹性管理的存储空间。后续可通过 LVM 的动态调整特性，实现无需卸载的存储扩容。\n"
  },
  {
    "path": "docs/guide/metallb.md",
    "content": "# metallb 网络负载均衡\n\n本文档已过期，以下内容仅做介绍，安装请参考最新官方文档\n\n`Metallb`是在自有硬件上（非公有云）实现 `Kubernetes Load-balancer`的工具，由`google`团队开源，值得推荐！项目[github主页](https://github.com/google/metallb)。\n\n## metallb 简介\n\n这里简单介绍下它的实现原理，具体可以参考[metallb官网](https://metallb.universe.tf/)，文档非常简洁、清晰。目前有如下的使用限制：\n\n- `Kubernetes v1.9.0`版本以上，暂不支持`ipvs`模式\n- 支持网络组件 (flannel/weave/romana), calico 部分支持\n- `layer2`和`bgp`两种模式，其中`bgp`模式需要外部网络设备支持`bgp`协议\n\n`metallb`主要实现了两个功能：地址分配和对外宣告\n\n- 地址分配：需要向网络管理员申请一段ip地址，如果是layer2模式需要这段地址与node节点地址同个网段（同一个二层）；如果是bgp模式没有这个限制。\n- 对外宣告：layer2模式使用arp协议，利用节点的mac额外宣告一个loadbalancer的ip（同mac多ip）；bgp模式下节点利用bgp协议与外部网络设备建立邻居，宣告loadbalancer的地址段给外部网络。\n\n"
  },
  {
    "path": "docs/guide/metrics-server.md",
    "content": "# Metrics Server\n\n从 v1.8 开始，资源使用情况的度量（如容器的 CPU 和内存使用）可以通过 Metrics API 获取；前提是集群中要部署 Metrics Server，它从Kubelet 公开的Summary API采集指标信息，关于更多的背景介绍请参考如下文档：  \n- Metrics Server[设计提案](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/metrics-server.md)\n\n大致是说它符合k8s的监控架构设计，受heapster项目启发，并且比heapster优势在于：访问不需要apiserver的代理机制，提供认证和授权等；很多集群内组件依赖它（HPA,scheduler,kubectl top），因此它应该在集群中默认运行；部分k8s集群的安装工具已经默认集成了Metrics Server的安装，以下概述下它的安装：\n\n- 1.metric-server是扩展的apiserver，依赖于[kube-aggregator](https://github.com/kubernetes/kube-aggregator)，因此需要在apiserver中开启相关参数。\n- 2.需要在集群中运行deployment处理请求\n\n从kubeasz 0.1.0 开始，metrics-server已经默认集成安装，请查看`/etc/kubeasz/clusters/xxxx/config.yml`中的设置\n- 参考：https://github.com/kubernetes-sigs/metrics-server\n\n## 前提\n\n- 1.设置apiserver相关[参数](../../roles/kube-master/templates/kube-apiserver.service.j2)\n``` bash\n... # 省略\n  --requestheader-client-ca-file={{ ca_dir }}/ca.pem \\\n  --requestheader-allowed-names=aggregator \\\n  --requestheader-extra-headers-prefix=X-Remote-Extra- \\\n  --requestheader-group-headers=X-Remote-Group \\\n  --requestheader-username-headers=X-Remote-User \\\n  --proxy-client-cert-file={{ ca_dir }}/aggregator-proxy.pem \\\n  --proxy-client-key-file={{ ca_dir }}/aggregator-proxy-key.pem \\\n  --enable-aggregator-routing=true \\\n```\n- 2.生成[aggregator proxy相关证书](../../roles/kube-master/tasks/main.yml)\n\n参考1：https://kubernetes.io/docs/tasks/access-kubernetes-api/configure-aggregation-layer/  \n参考2：https://kubernetes.io/docs/tasks/access-kubernetes-api/setup-extension-api-server/\n\n## 安装\n\n``` bash\n# 默认已经集成安装，假设集群名为xxxx\nezctl setup xxxx all\n\n# 如果需要分步安装\nezctl setup xxxx 07\n\n# 如果需要手动安装\nkubectl apply -f /etc/kubeasz/clusters/xxxx/yml/metrics-server.yaml\n```\n\n## 验证\n\n- 查看生成的新api：v1beta1.metrics.k8s.io\n``` bash\n$ kubectl get apiservice|grep metrics\nv1beta1.metrics.k8s.io                 1d\n```\n\n- 查看kubectl top命令（无需额外安装heapster）\n``` bash\n$ kubectl top node\nNAME           CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%   \n192.168.1.1   116m         2%        2342Mi          60%       \n192.168.1.2   79m          1%        1824Mi          47%       \n192.168.1.3   82m          2%        1897Mi          49%  \n$ kubectl top pod --all-namespaces \t# 输出略\n```\n\n- 验证基于metrics-server实现的基础hpa自动缩放，请参考[hpa.md](hpa.md)\n"
  },
  {
    "path": "docs/guide/networkpolicy.md",
    "content": "## Network Policy\n\n`Network Policy`提供了基于策略的网络控制，用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络，并通过策略控制它们之间的流量以及来自外部的流量；目前基于`linux iptables`实现，使用类似`nf_conntrack`检查记录网络流量`session`从而决定流量是否阻断；因此它是`状态检测防火墙`。\n\n- 网络插件要支持 Network Policy，如 Calico、Romana、Weave Net\n\n### 简单示例\n\n实验环境：k8s v1.9, calico 2.6.5\n\n首先部署测试用nginx服务\n\n``` bash\n$ kubectl run nginx --image=nginx --replicas=3 --port=80 --expose\n# 验证测试nginx服务\n$ kubectl get pod -o wide \nNAME                     READY     STATUS    RESTARTS   AGE       IP               NODE\nnginx-7587c6fdb6-p2fpz   1/1       Running   0          55m       172.20.125.2     10.0.96.7\nnginx-7587c6fdb6-pbw7c   1/1       Running   0          55m       172.20.124.2     10.0.96.6\nnginx-7587c6fdb6-v48db   1/1       Running   0          55m       172.20.121.195   10.0.96.4\n$ kubectl get svc nginx\nNAME      TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE\nnginx     ClusterIP   10.68.7.183   <none>        80/TCP    1h\n```\n默认情况下，其他pod可以访问nginx服务\n\n``` bash\n$ kubectl run busy1 --rm -it --image=busybox /bin/sh\nIf you don't see a command prompt, try pressing enter.\n/ # wget --spider --timeout=1 nginx\nConnecting to nginx (10.68.7.183:80)\n```\n创建`DefaultDeny Network Policy`后，其他Pod（包括namespace外部）不能访问nginx\n\n``` bash\n$ cat > default-deny.yaml << EOF\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: default-deny\nspec:\n  podSelector: {}\n  policyTypes:\n  - Ingress\nEOF\n$ kubectl create -f default-deny.yaml\nnetworkpolicy \"default-deny\" created\n$ kubectl run busy1 --rm -it --image=busybox /bin/sh\nIf you don't see a command prompt, try pressing enter.\n/ # wget --spider --timeout=1 nginx\nConnecting to nginx (10.68.7.183:80)\nwget: download timed out\n```\n创建一个允许带有access=true的Pod访问nginx的网络策略\n\n``` bash\n$ cat > nginx-policy.yaml << EOF\nkind: NetworkPolicy\napiVersion: networking.k8s.io/v1\nmetadata:\n  name: access-nginx\nspec:\n  podSelector:\n    matchLabels:\n      run: nginx\n  ingress:\n  - from:\n    - podSelector:\n        matchLabels:\n          access: \"true\"\nEOF\n$ kubectl create -f nginx-policy.yaml\nnetworkpolicy \"access-nginx\" created\n\n# 不带access=true标签的Pod还是无法访问nginx服务\n$ kubectl run busy1 --rm -it --image=busybox /bin/sh\nIf you don't see a command prompt, try pressing enter.\n/ # wget --spider --timeout=1 nginx\nConnecting to nginx (10.68.7.183:80)\nwget: download timed out\n\n# 而带有access=true标签的Pod可以访问nginx服务\n$ kubectl run busy2 --rm -it --labels=\"access=true\" --image=busybox /bin/sh\nIf you don't see a command prompt, try pressing enter.\n/ # wget --spider --timeout=1 nginx\nConnecting to nginx (10.68.7.183:80)\n```\n\n### 示例策略解读\n\n``` bash\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: test-network-policy\n  namespace: default\nspec:\n  podSelector:\n    matchLabels:\n      role: db\n  policyTypes:\n  - Ingress\n  - Egress\n  ingress:\n  - from:\n    - ipBlock:\n        cidr: 172.17.0.0/16\n        except:\n        - 172.17.1.0/24\n    - namespaceSelector:\n        matchLabels:\n          project: myproject\n    - podSelector:\n        matchLabels:\n          role: frontend\n    ports:\n    - protocol: TCP\n      port: 6379\n  egress:\n  - to:\n    - ipBlock:\n        cidr: 10.0.0.0/24\n    ports:\n    - protocol: TCP\n      port: 5978\n```\n- 策略作用的对象Pods：default命名空间下带有`role=db`标签的Pod\n  - 内向流量策略\n    - 允许属于`172.17.0.0/16`网段但不属于`172.17.1.0/24`的源地址访问该对象Pods的TCP 6379端口\n    - 允许带有project=myprojects标签的namespace中所有Pod访问该对象Pods的TCP 6379端口\n    - 允许default命名空间下带有role=frontend标签的Pod访问该对象Pods的TCP 6379端口\n    - 拒绝其他所有主动访问该对象Pods的网络流量\n  - 外向流量策略\n    - 允许该对象Pods主动访问目的地址属于`10.0.0.0/24`网段且目的端口为TCP 5978的流量\n    - 拒绝该对象Pods其他所有主动外向网络流量\n\n### 使用场景\n\n参考阅读[ahmetb/kubernetes-network-policy-recipes](https://github.com/ahmetb/kubernetes-network-policy-recipes) 该项目举例一些使用NetworkPolicy的场景，并有形象的配图\n\n#### 拒绝其他namespaces访问服务\n\n![deny_from_other_namespaces](https://github.com/ahmetb/kubernetes-network-policy-recipes/blob/master/img/4.gif)\n\n+ 场景1：你的k8s集群应用按照namespaces区分生产、测试环境，你要确保生产环境不会受到测试环境错误访问影响\n+ 场景2：你的k8s集群有多租户应用采用namespaces区分的，你要确保多租户之间的应用隔离\n\n在你需要隔离的命名空间创建如下策略:\n\n``` bash\nkind: NetworkPolicy\napiVersion: networking.k8s.io/v1\nmetadata:\n  namespace: your-ns\n  name: deny-other-namespaces\nspec:\n  podSelector:\n    matchLabels:\n  ingress:\n  - from:\n    - podSelector: {}\n```\n\n#### 允许外部访问服务\n\n+ 场景：暴露特定Pod的特定端口给外部访问\n\n![allow_from_external](https://github.com/ahmetb/kubernetes-network-policy-recipes/blob/master/img/8.gif)\n\n``` bash\n# 创建示例应用待暴露服务\n$ kubectl run web --image=nginx --labels=app=web --port 80 --expose\n\n# 创建网络策略\nkind: NetworkPolicy\napiVersion: networking.k8s.io/v1\nmetadata:\n  name: web-allow-external\nspec:\n  podSelector:\n    matchLabels:\n      app: web\n  ingress:\n  - from: []\n    ports:\n    - protocol: TCP\n      port: 80\n```\n"
  },
  {
    "path": "docs/guide/nfs-server.md",
    "content": "## 创建 NFS 服务器\n\nNFS 允许系统将其目录和文件共享给网络上的其他系统。通过 NFS，用户和应用程序可以访问远程系统上的文件，就象它们是本地文件一样。\n\n### 安装\nUbuntu 16.04 键入以下命令安装 NFS 服务器：\n\n``` bash\napt install nfs-kernel-server\n```\n\n### 配置\n编辑`/etc/exports`文件添加需要共享目录，每个目录的设置独占一行，编写格式如下：\n\n`NFS共享目录路径    客户机IP或者名称(参数1,参数2,...,参数n)`\n\n例如：\n\n``` bash\n/home *(ro,sync,insecure,no_root_squash)\n/share 192.168.1.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)\n```\n| 参数 | 说明 |\n| :- | :- |\n| ro | 只读访问 |\n| rw | 读写访问 |\n| sync | 所有数据在请求时写入共享 |\n| async | nfs在写入数据前可以响应请求 |\n| secure | nfs通过1024以下的安全TCP/IP端口发送 |\n| insecure | nfs通过1024以上的端口发送 |\n| wdelay | 如果多个用户要写入nfs目录，则归组写入（默认） |\n| no_wdelay | 如果多个用户要写入nfs目录，则立即写入，当使用async时，无需此设置 |\n| hide | 在nfs共享目录中不共享其子目录 |\n| no_hide | 共享nfs目录的子目录 |\n| subtree_check | 如果共享/usr/bin之类的子目录时，强制nfs检查父目录的权限（默认） |\n| no_subtree_check | 不检查父目录权限 |\n| all_squash | 共享文件的UID和GID映射匿名用户anonymous，适合公用目录 |\n| no_all_squash | 保留共享文件的UID和GID（默认） |\n| root_squash | root用户的所有请求映射成如anonymous用户一样的权限（默认） |\n| no_root_squash | root用户具有根目录的完全管理访问权限 |\n| anonuid=xxx | 指定nfs服务器/etc/passwd文件中匿名用户的UID |\n| anongid=xxx | 指定nfs服务器/etc/passwd文件中匿名用户的GID |\n\n+ 注1：尽量指定主机名或IP或IP段最小化授权可以访问NFS 挂载的资源的客户端；注意如果在k8s集群中配合nfs-client-provisioner使用的话，这里需要指定pod的IP段，否则nfs-client-provisioner pod无法启动，报错 mount.nfs: access denied by server while mounting\n+ 注2：经测试参数insecure必须要加，否则客户端挂载出错mount.nfs: access denied by server while mounting\n\n### 启动\n\n配置完成后，您可以在终端提示符后运行以下命令来启动 NFS 服务器：\n\n``` bash\nsystemctl start nfs-kernel-server.service\n```\n\n### 客户端挂载\n\nUbuntu 16.04，首先需要安装 `nfs-common` 包\n\n``` bash\napt install nfs-common\n```\nCentOS 7, 需要安装 `nfs-utils` 包\n\n``` bash\nyum install nfs-utils\n```\n\n使用 mount 命令来挂载其他机器共享的 NFS 目录。可以在终端提示符后输入以下类似的命令：\n\n``` bash\nmount example.hostname.com:/ubuntu /local/ubuntu\n```\n挂载点 /local/ubuntu 目录必须已经存在。而且在 /local/ubuntu 目录中没有文件或子目录。\n\n另一个挂载NFS 共享的方式就是在 /etc/fstab 文件中添加一行。该行必须指明 NFS 服务器的主机名、服务器输出的目录名以及挂载 NFS 共享的本机目录。\n\n以下是在 /etc/fstab 中的常用语法：\n\n``` bash\nexample.hostname.com:/ubuntu /local/ubuntu nfs rsize=8192,wsize=8192,timeo=14,intr\n```\n"
  },
  {
    "path": "docs/guide/prometheus.md",
    "content": "# Prometheus\n`prometheus`已经成为k8s集群上默认的监控解决方案，它的监控理念、数据结构设计其实相当精简，包括其非常灵活的查询语言；但是对于初学者来说，想要在k8s集群中实践搭建一套相对可用的部署却比较麻烦。本项目3.x采用的helm chart方式部署，使用的charts地址: https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack\n\n## 安装\n\nkubeasz 集成安装\n\n- 1.修改 /etc/kubeasz/clusters/xxxx/config.yml 中配置项 prom_install: \"yes\"\n- 2.下载镜像 /etc/kubeasz/ezdown -X prometheus\n- 3.安装 /etc/kubeasz/ezctl setup xxxx 07\n\n生成的charts自定义配置在/etc/kubeasz/clusters/xxxx/yml/prom-values.yaml\n\n注1：如果需要修改配置，修改roles/cluster-addon/templates/prometheus/values.yaml.j2 后重新执行安装命令\n\n注2：如果集群节点有增减，重新执行安装命令\n\n注3：涉及到很多相关镜像下载比较慢，另外部分k8s.gcr.io的镜像已经替换成easzlab的mirror镜像地址\n\n## 验证安装\n\n``` bash \n# 查看相关pod和svc\n$ kubectl get pod,svc -n monitor\nNAME                                                         READY   STATUS    RESTARTS   AGE\npod/alertmanager-prometheus-kube-prometheus-alertmanager-0   2/2     Running   0          160m\npod/prometheus-grafana-69f88948bc-7hnbp                      3/3     Running   0          160m\npod/prometheus-kube-prometheus-operator-f8f4758cb-bm6gs      1/1     Running   0          160m\npod/prometheus-kube-state-metrics-74b8f49c6c-f9wgg           1/1     Running   0          160m\npod/prometheus-prometheus-kube-prometheus-prometheus-0       2/2     Running   0          160m\npod/prometheus-prometheus-node-exporter-6nfb4                1/1     Running   0          160m\npod/prometheus-prometheus-node-exporter-q4qq2                1/1     Running   0          160m\n\nNAME                                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE\nservice/alertmanager-operated                     ClusterIP   None            <none>        9093/TCP,9094/TCP,9094/UDP   160m\nservice/prometheus-grafana                        NodePort    10.68.253.23    <none>        80:30903/TCP                 160m\nservice/prometheus-kube-prometheus-alertmanager   NodePort    10.68.125.191   <none>        9093:30902/TCP               160m\nservice/prometheus-kube-prometheus-operator       NodePort    10.68.161.218   <none>        443:30900/TCP                160m\nservice/prometheus-kube-prometheus-prometheus     NodePort    10.68.64.217    <none>        9090:30901/TCP               160m\nservice/prometheus-kube-state-metrics             ClusterIP   10.68.111.106   <none>        8080/TCP                     160m\nservice/prometheus-operated                       ClusterIP   None            <none>        9090/TCP                     160m\nservice/prometheus-prometheus-node-exporter       ClusterIP   10.68.252.83    <none>        9100/TCP                     160m\n```\n\n- 访问prometheus的web界面：`http://$NodeIP:30901`\n- 访问alertmanager的web界面：`http://$NodeIP:30902`\n- 访问grafana的web界面：`http://$NodeIP:30903` (默认用户密码 admin:Admin1234!)\n\n## 其他操作\n\n-- 以下内容没有更新测试\n\n### [可选] 配置钉钉告警\n\n- 创建钉钉群，获取群机器人 webhook 地址\n\n使用钉钉创建群聊以后可以方便设置群机器人，【群设置】-【群机器人】-【添加】-【自定义】-【添加】，然后按提示操作即可，参考 https://open.dingtalk.com/document/group/custom-robot-access\n\n上述配置好群机器人，获得这个机器人对应的Webhook地址，记录下来，后续配置钉钉告警插件要用，格式如下\n\n```\nhttps://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx\n```\n\n- 创建钉钉告警插件，参考:\n  - https://github.com/timonwong/prometheus-webhook-dingtalk\n  - http://theo.im/blog/2017/10/16/release-prometheus-alertmanager-webhook-for-dingtalk/\n\n``` bash\n# 编辑修改文件中 access_token=xxxxxx 为上一步你获得的机器人认证 token\n$ vi /etc/kubeasz/roles/cluster-addon/templates/prometheus/dingtalk-webhook.yaml\n# 运行插件\n$ kubectl apply -f /etc/kubeasz/roles/cluster-addon/templates/prometheus/dingtalk-webhook.yaml\n```\n\n- 修改 alertsmanager 告警配置，重新运行安装命令/etc/kubeasz/ezctl setup xxxx 07，成功后如上节测试告警发送\n\n``` bash\n# 修改 alertsmanager 告警配置\n$ vi /etc/kubeasz/roles/cluster-addon/templates/prometheus/values.yaml.j2 \n# 增加 receiver dingtalk，然后在 route 配置使用 receiver: dingtalk\n    receivers:\n    - name: dingtalk\n      webhook_configs:\n      - send_resolved: false\n        url: http://webhook-dingtalk.monitor.svc.cluster.local:8060/dingtalk/webhook1/send\n# ...\n```\n"
  },
  {
    "path": "docs/guide/rollingupdateWithZeroDowntime.md",
    "content": "## 1、前言\n在当下微服务架构盛行的时代，用户希望应用程序时时刻刻都是可用，为了满足不断变化的新业务，需要不断升级更新应用程序，有时可能需要频繁的发布版本。实现\"零停机\"、“零感知”的持续集成(Continuous Integration)和持续交付/部署(Continuous Delivery)应用程序，一直都是软件升级换代不得不面对的一个难题和痛点，也是一种追求的理想方式，也是DevOps诞生的目的。\n## 2、滚动发布\n把一次完整的发布过程，合理地分成多个批次，每次发布一个批次，**成功后**，再发布下一个批次，最终完成所有批次的发布。在整个滚动过程期间，保证始终有可用的副本在运行，从而平滑的发布新版本，实现**零停机(without an outage)**、用户**零感知**，是一种非常主流的发布方式。由于其自动化程度比较高，通常需要复杂的发布工具支撑，而k8s可以完美的胜任这个任务。 \n## 3、k8s滚动更新机制\n**k8s创建副本应用程序的最佳方法就是部署(Deployment)，部署自动创建副本集(ReplicaSet)，副本集可以精确地控制每次替换的Pod数量，从而可以很好的实现滚动更新**。具体来说，k8s每次使用一个新的副本控制器(replication controller)来替换已存在的副本控制器，从而始终使用一个新的Pod模板来替换旧的pod模板。\n>大致步骤如下：\n>1. 创建一个新的replication controller。\n>2. 增加或减少pod副本数量，直到满足当前批次期望的数量。\n>3. 删除旧的replication controller。\n\n## 4、演示\n>使用kubectl更新一个已部署的应用程序，并模拟回滚。为了方便分析，将应用程序的pod副本数量设置为10。\n``` bash\n$ kubectl run busy --image=busybox:1.28.4 sleep 36000000 --replicas=10\n```\n### 4.1. 发布微服务\n- 当前服务状态查看\n``` bash\n# 查看部署列表\nroot@kube-aio:~# kubectl get deploy busy\nNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\nbusy      10        10        10           10          5m\n\n# 查看正在运行的pod\nroot@kube-aio:~# kubectl get pod | grep busy\nbusy-794c95f5d7-56b6w        1/1       Running   0          5m\nbusy-794c95f5d7-8ddjr        1/1       Running   0          5m\nbusy-794c95f5d7-8zm8r        1/1       Running   0          5m\nbusy-794c95f5d7-9hjhp        1/1       Running   0          5m\nbusy-794c95f5d7-df2r2        1/1       Running   0          5m\nbusy-794c95f5d7-fsn94        1/1       Running   0          5m\nbusy-794c95f5d7-k4w8r        1/1       Running   0          5m\nbusy-794c95f5d7-lsmgb        1/1       Running   0          5m\nbusy-794c95f5d7-rg8kw        1/1       Running   0          5m\nbusy-794c95f5d7-xpxxt        1/1       Running   0          5m\n\n# 通过pod描述，查看应用程序的当前映像版本\nroot@kube-aio:~# kubectl describe pod busy-794c95f5d7-56b6w |grep Image\n    Image:         busybox:1.28.4\n    Image ID:      docker-pullable://busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47\n```\n- 升级镜像版本到1.29\n  - 为了更清晰看到更新过程，可另开一个窗口使用`$ watch kubectl get deployment busy`实时查看变化\n``` bash\n$ kubectl set image deployments/busy busy=busybox:1.29\n```\n### 4.2. 验证发布\n``` bash\n# 检查rollout状态\nroot@kube-aio:~# kubectl rollout status deployments/busy\ndeployment \"busy\" successfully rolled out\n\n# 检查pod详情\nroot@kube-aio:~# kubectl describe pod busy-665cdb7b-44jnt |grep Image\n    Image:         busybox:1.29\n    Image ID:      docker-pullable://busybox@sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd\n```\n从上面可以看到，镜像已经升级到1.29版本\n### 4.3. 回滚发布\n``` bash\n# 回滚发布\nroot@kube-aio:~# kubectl rollout undo deployments/busy\ndeployment.apps \"busy\" \n\n# 回滚完成\nroot@kube-aio:~# kubectl rollout status deployments/busy\ndeployment \"busy\" successfully rolled out\n\n# 镜像又回退到1.28.4 版本\nroot@kube-aio:~# kubectl describe pod busy-794c95f5d7-4x9bn |grep Image\n    Image:         busybox:1.28.4\n    Image ID:      docker-pullable://busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47\n```\n\n到目前为止，整个滚动发布工作就圆满完成了！！！\n**那么如果我们想回滚到指定版本呢？答案是k8s完美支持，并且还可以通过资源文件进行配置保留的历史版次量**。由于篇幅有限，感兴趣的朋友，可以自己下去实战，回滚命令如下：\n```javascript\nkubectl rollout undo deployment/busy --to-revision=<版次>\n```\n## 5、原理\nk8s精确地控制着整个发布过程，分批次有序地进行着滚动更新，直到把所有旧的副本全部更新到新版本。实际上，k8s是通过两个参数来精确地控制着每次滚动的pod数量：\n\n>* **`maxSurge` 滚动更新过程中运行操作期望副本数的最大pod数，可以为绝对数值(eg：5)，但不能为0；也可以为百分数(eg：10%)。**\n>* **`maxUnavailable`  滚动更新过程中不可用的最大pod数，可以为绝对数值(eg：5)，但不能为0；也可以为百分数(eg：10%)。**\n\n如果未指定这两个可选参数，则k8s会使用默认配置：  \n``` bash\nroot@kube-aio:~# kubectl get deploy busy -o yaml\napiVersion: apps/v1 \nkind: Deployment\nmetadata:\n  annotations:\n    deployment.kubernetes.io/revision: \"3\"\n  creationTimestamp: 2018-08-19T02:42:56Z\n  generation: 3\n  labels:\n    run: busy\n  name: busy\n  namespace: default\n  resourceVersion: \"199461\"\n  uid: 93fde307-a359-11e8-a93b-525400c61543\nspec:\n  progressDeadlineSeconds: 600\n  replicas: 10\n  revisionHistoryLimit: 10\n  selector:\n    matchLabels:\n      run: busy\n  strategy:\n    rollingUpdate:\n      maxSurge: 1\t# 滚动更新中最多超过预期值的 pod数\n      maxUnavailable: 1\t# 滚动更新中最多不可用的 pod数\n    type: RollingUpdate\n...\n```\n### 5.1. 浅析部署概况\n``` bash\n# 初始状态\nroot@kube-aio:~# kubectl get deploy busy\nNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\nbusy      10        10        10           10          1h\n\n# 再做一遍回退\nroot@kube-aio:~# kubectl rollout undo deploy busy\ndeployment.apps \"busy\" \n\n# 更新过程1\nroot@kube-aio:~# kubectl get deploy busy\nNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\nbusy      10        11        2            9           1h\n\n# 更新过程2\nroot@kube-aio:~# kubectl get deploy busy\nNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\nbusy      10        11        4            9           1h\n\n# 更新过程3\nroot@kube-aio:~# kubectl get deploy busy\nNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\nbusy      10        11        6            9           1h\n\n# 更新结束\nroot@kube-aio:~# kubectl get deploy busy\nNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\nbusy      10        10        10           10          1h\n```\n>* `DESIRED`    最终期望处于READY状态的副本数   \n>* `CURRENT`   当前的副本总数    \n>* `UP-TO-DATE`   当前完成更新的副本数   \n>* `AVAILABLE`   当前可用的副本数     \n\n当前的副本总数：10(DESIRED) + 1(maxSurge) = 11，所以CURRENT为11。\n当前可用的副本数：10(DESIRED) - 1(maxUnavailable) = 9，所以AVAILABLE为9。\n\n### 5.2. 浅析部署详情\n\n``` bash\nroot@kube-aio:~# kubectl describe deploy busy\nName:                   busy\nNamespace:              default\nCreationTimestamp:      Sun, 19 Aug 2018 12:27:19 +0800\nLabels:                 run=busy\nAnnotations:            deployment.kubernetes.io/revision=2\nSelector:               run=busy\nReplicas:               10 desired | 10 updated | 10 total | 10 available | 0 unavailable\nStrategyType:           RollingUpdate\nMinReadySeconds:        0\nRollingUpdateStrategy:  1 max unavailable, 1 max surge\nPod Template:\n  Labels:  run=busy\n  Containers:\n   busy:\n    Image:      busybox:1.29\n    Port:       <none>\n    Host Port:  <none>\n    Args:\n      sleep\n      3600000\n    Environment:  <none>\n    Mounts:       <none>\n  Volumes:        <none>\nConditions:\n  Type           Status  Reason\n  ----           ------  ------\n  Available      True    MinimumReplicasAvailable\n  Progressing    True    NewReplicaSetAvailable\nOldReplicaSets:  <none>\nNewReplicaSet:   busy-84cb46955d (10/10 replicas created)\nEvents:\n  Type    Reason             Age                 From                   Message\n  ----    ------             ----                ----                   -------\n  Normal  ScalingReplicaSet  1m                  deployment-controller  Scaled up replica set busy-9669c8599 to 10\n  Normal  ScalingReplicaSet  46s                 deployment-controller  Scaled up replica set busy-84cb46955d to 1\n  Normal  ScalingReplicaSet  46s                 deployment-controller  Scaled down replica set busy-9669c8599 to 9\n  Normal  ScalingReplicaSet  46s                 deployment-controller  Scaled up replica set busy-84cb46955d to 2\n  Normal  ScalingReplicaSet  43s                 deployment-controller  Scaled down replica set busy-9669c8599 to 8\n  Normal  ScalingReplicaSet  43s                 deployment-controller  Scaled up replica set busy-84cb46955d to 3\n  Normal  ScalingReplicaSet  43s                 deployment-controller  Scaled down replica set busy-9669c8599 to 7\n  Normal  ScalingReplicaSet  43s                 deployment-controller  Scaled up replica set busy-84cb46955d to 4\n  Normal  ScalingReplicaSet  40s                 deployment-controller  Scaled down replica set busy-9669c8599 to 6\n  Normal  ScalingReplicaSet  28s (x12 over 40s)  deployment-controller  (combined from similar events): Scaled down replica set busy-9669c8599 to 0\n```\n整个滚动过程是通过控制两个副本集来完成的，新的副本集：busy-84cb46955d；旧的副本集：busy-9669c8599 。\n理想状态下的滚动过程：\n>1. 创建新副本集，并为其分配1个新版本的pod。\n>2. 通知旧副本集，销毁1个旧版本的pod。\n>3. 当旧副本销毁成功后，通知新副本集，再新增1个新版本的pod；当新副本创建成功后，通知旧副本再减少1个pod。\n>只要销毁成功，新副本集就会创造新的pod，一直循环，直到旧的副本集pod数量为0。\n### 5.4 总结\n**`无论理想还是不理想，k8s最终都会使应用程序全部更新到期望状态，都会始终保持最大的副本总数和可用副本总数的不变性！！！`**\n\n[阅读原文](http://www.cnblogs.com/justmine/p/8688828.html)\n\n"
  },
  {
    "path": "docs/mixes/DoneList.md",
    "content": "## 前言\n\n`kubeasz`项目开始于`2017.11`，半年多时间以来，从最开始单一的ansible部署脚本朝着提供部署高可用 K8S集群的完整解决方案的目标不断前进，接下去项目的发展需要各位的共同参与和贡献，希望越做越好，为国内k8s学习、实践者提供更多帮助。  \n\n### 项目已完成部分 \n\n<table border=\"0\">\n    <tr>\n        <th>类型</th>\n        <th>描述</th>\n        <th>备注</th>\n    </tr>\n    <tr>\n        <td>集群部署</td>\n        <td>服务器基础安全加固与参数优化</td>\n        <td>已完成</td>\n    </tr>\n    <tr>\n        <td>基础服务</td>\n        <td>集群监控告警-prometheus</td>\n        <td>已完成基础，待优化</td>\n    </tr>\n    <tr>\n        <td>应用服务</td>\n        <td>jenkins集成</td>\n        <td>已完成</td>\n    </tr>\n    <tr>\n        <td>集群部署</td>\n        <td>kube-router网络插件</td>\n        <td>已完成</td>\n    </tr>\n    <tr>\n        <td>基础服务</td>\n        <td>metrics server</td>\n        <td>已完成</td>\n    </tr>\n    <tr>\n        <td>集群部署</td>\n        <td>ipvs代理模式跟进</td>\n        <td>已完成</td>\n    </tr>\n    <tr>\n        <td>集群部署</td>\n        <td>cilium网络插件</td>\n        <td>已完成</td>\n    </tr>\n    <tr>\n        <td>集群部署</td>\n        <td>集群内时间同步-Chrony</td>\n        <td>已完成</td>\n    </tr>\n</table>\n\n\n"
  },
  {
    "path": "docs/mixes/HowToContribute.md",
    "content": "# 为项目`kubeasz`提交`pull request`\n\n首先请核对下本地git config配置的用户名和邮箱与你github上的注册用户和邮箱一致，否则即使`pull request`被接受，贡献者列表中也看不到自己的名字，设置命令：\n\n``` bash\n$ git config --global user.email \"you@example.com\"\n$ git config --global user.name \"Your Name\"\n```\n\n- 1.登录github，在本项目页面点击`fork`到自己仓库\n- 2.clone 自己的仓库到本地：`git clone https://github.com/xxx/kubeasz.git`\n- 3.在 master 分支添加原始仓库为上游分支：`git remote add upstream https://github.com/easzlab/kubeasz.git`\n- 4.在本地新建开发分支：`git checkout -b dev`\n- 5.在开发分支修改代码并提交：`git add .`, `git commit -am 'xx变更说明'`\n- 6.切换至 master 分支，同步原始仓库：`git checkout master`， `git pull upstream master`\n- 7.切换至 dev 分支，合并本地 master 分支（已经和原始仓库同步），可能需要解冲突：`git checkout dev`, `git merge master`\n- 8.提交本地 dev 分支到自己的远程 dev 仓库：`git push origin dev`\n- 9.在github自己仓库页面，点击`Compare & pull request`给原始仓库发 pull request 请求\n- a.等待原作者回复（接受/拒绝）\n"
  },
  {
    "path": "docs/mixes/LICENSE",
    "content": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"{}\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n   Copyright 2017 jmgao\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "docs/mixes/conformance.md",
    "content": "# 关于K8S集群一致性认证\n\nCNCF 一致性认证项目(https://github.com/cncf/k8s-conformance) 可以很方便帮助k8s搭建者和用户确认集群各项功能符合预期，既符合k8s设计标准。\n\n# kubeasz 通过一致性测试\n\n自kubeasz 3.0.0 版本，k8s v1.20.2开始，正式通过cncf一致性认证，成为cncf 官方认证安装工具；后续k8s主要版本发布或者kubeasz有大版本更新，会优先确保通过集群一致性认证。\n\n- v1.34 [进行中]()\n- v1.33 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.33/kubeasz)\n- v1.32 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.32/kubeasz)\n- v1.31 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.31/kubeasz)\n- v1.30 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.30/kubeasz)\n- v1.29 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.29/kubeasz)\n- v1.28 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.28/kubeasz)\n- v1.27 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.27/kubeasz)\n- v1.26 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.26/kubeasz)\n- v1.25 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.25/kubeasz)\n- v1.24 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.24/kubeasz)\n- v1.23 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.23/kubeasz)\n- v1.22 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.22/kubeasz)\n- v1.21 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.21/kubeasz)\n- v1.20 [已认证](https://github.com/cncf/k8s-conformance/tree/master/v1.20/kubeasz)\n\n\n## Conformance Test\n\n按照测试文档，注意以下几点：\n\n1.解决qiang的问题，可以临时去国外公有云创建集群，然后运行测试项目。\n\n2.集群要保障资源，建议3个节点\n\n3.网络组件选择calico，其他组件可能有bug导致特定测试项失败\n\n\n# 附：测试流程\n\n## Node Provisioning\n\nProvision 3 nodes for your cluster (OS: Ubuntu 20.04)\n\n1 master node (4c16g)\n\n2 worker node (4c16g)\n\nfor a High-Availability Kubernetes Cluster, read [more](https://github.com/easzlab/kubeasz/blob/master/docs/setup/00-planning_and_overall_intro.md)\n\n## Install the cluster\n\n(1) Download 'kubeasz' code, the binaries and offline images\n\n```\nexport release=3.2.0\ncurl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown\nchmod +x ./ezdown\n./ezdown -D -m standard\n```\n\n(2) install an all-in-one cluster\n\n```\n./ezdown -S\nsource ~/.bashrc\ndk ezctl start-aio\n```\n\n(3) Add two worker nodes\n\n```\nssh-copy-id ${worker1_ip}\ndk ezctl add-node default ${worker1_ip}\n\nssh-copy-id ${worker2_ip}\ndk ezctl add-node default ${worker2_ip}\n```\n\n## Run Conformance Test\n\nThe standard tool for running these tests is\n[Sonobuoy](https://github.com/heptio/sonobuoy).  Sonobuoy is\nregularly built and kept up to date to execute against all\ncurrently supported versions of kubernetes.\n\nDownload a [binary release](https://github.com/heptio/sonobuoy/releases) of the CLI\n\nDeploy a Sonobuoy pod to your cluster with:\n\n```\n$ sonobuoy run --plugin-env=e2e.E2E_EXTRA_ARGS=\"--ginkgo.v\" --mode=certified-conformance \n```\n\n**NOTE:** You can run the command synchronously by adding the flag `--wait` but be aware that running the Conformance tests can take an hour or more.\n\nView actively running pods:\n\n```\n$ sonobuoy status\n```\n\nTo inspect the logs:\n\n```\n$ sonobuoy logs\n```\n\nOnce `sonobuoy status` shows the run as `completed`, copy the output directory from the main Sonobuoy pod to a local directory:\n\n```\n$ outfile=$(sonobuoy retrieve)\n```\n\nThis copies a single `.tar.gz` snapshot from the Sonobuoy pod into your local\n`.` directory. Extract the contents into `./results` with:\n\n```\nmkdir ./results; tar xzf $outfile -C ./results\n```\n\n**NOTE:** The two files required for submission are located in the tarball under **plugins/e2e/results/{e2e.log,junit.xml}**.\n\nTo clean up Kubernetes objects created by Sonobuoy, run:\n\n```\nsonobuoy delete\n```\n"
  },
  {
    "path": "docs/mixes/donate.md",
    "content": "# 捐赠\n\n如果觉得本项目对您有帮助，请小小鼓励下项目作者，谢谢！\n\n支付宝码(左)和微信钱包码(右)\n\n![支付宝](../pics/alipay.gif) ![微信钱包](../pics/wxpay.gif)\n\n"
  },
  {
    "path": "docs/op/ch_apiserver_cert.md",
    "content": "# 修改 APISERVER（MASTER）证书\n\n`kubeasz` 创建集群后，APISERVER（MASTER）证书默认 CN 包含如下`域名`和`IP`：参见`roles/kube-master/templates/kubernetes-csr.json.j2`\n\n```\n  \"hosts\": [\n    \"127.0.0.1\",\n{% if groups['ex_lb']|length > 0 %}\n    \"{{ hostvars[groups['ex_lb'][0]]['EX_APISERVER_VIP'] }}\",\n{% endif %}\n{% for host in groups['kube_master'] %}\n    \"{{ host }}\",\n{% endfor %}\n    \"{{ CLUSTER_KUBERNETES_SVC_IP }}\",\n{% for host in MASTER_CERT_HOSTS %}\n    \"{{ host }}\",\n{% endfor %}\n    \"kubernetes\",\n    \"kubernetes.default\",\n    \"kubernetes.default.svc\",\n    \"kubernetes.default.svc.cluster\",\n    \"kubernetes.default.svc.cluster.local\"\n  ],\n```\n\n有的时候（比如apiserver地址通过边界防火墙的NAT转换成公网IP访问，或者需要添加公网域名访问）我们需要在 APISERVER（MASTER）证书中添加一些`域名`或者`IP`，可以方便操作如下：\n\n## 1.修改配置文件`/etc/kubeasz/clusters/${集群名}/config.yaml`\n\n``` bash\n# k8s 集群 master 节点证书配置，可以添加多个ip和域名（比如增加公网ip和域名）\nMASTER_CERT_HOSTS:\n  - \"10.1.1.1\"\n  - \"k8s.test.io\"\n  #- \"www.test.com\"\n```\n\n## 2.执行新证书生成并重启apiserver\n\n``` bash\n$ ezctl setup ${集群名} 04 -t change_cert,restart_master \n```\n"
  },
  {
    "path": "docs/op/cluster_restore.md",
    "content": "# K8S 集群备份与恢复\n\n虽然 K8S 集群可以配置成多主多节点的高可用的部署，还是有必要了解下集群的备份和容灾恢复能力；在高可用k8s集群中 etcd集群保存了整个集群的状态，因此这里的备份与恢复重点就是：\n\n- 从运行的etcd集群备份数据到磁盘文件\n- 从etcd备份文件恢复数据，从而使集群恢复到备份时状态\n\n## 备份与恢复操作说明\n\n- 1.首先搭建一个测试集群，部署几个测试deployment，验证集群各项正常后，进行一次备份(假设集群名为k8s-01)：\n\n``` bash\n$ ezctl backup k8s-01\n# 或者如下手动执行ansible命令\n# ansible-playbook -i clusters/k8s-01/hosts -e @clusters/k8s-01/config.yml  playbooks/94.backup.yml\n```\n\n执行完毕可以在部署主机的备份目录下检查备份情况，示例如下：\n\n```\n/etc/kubeasz/clusters/k8s-01/backup/\n├── snapshot_202106201205.db\n├── snapshot_202106211406.db\n└── snapshot.db\n```\n其中，snapshot.db始终为最近一次备份文件\n\n- 2.模拟误删除操作（略）\n\n- 3.恢复集群及验证\n\n可以在 `roles/cluster-restore/defaults/main.yml` 文件中配置需要恢复的 etcd备份版本（从上述备份目录中选取），默认使用最近一次备份；执行恢复后，需要一定时间等待 pod/svc 等资源恢复重建。\n\n``` bash\n$ ezctl restore k8s-01\n# 或者如下手动执行ansible命令\n# ansible-playbook -i clusters/k8s-01/hosts -e @clusters/k8s-01/config.yml  playbooks/95.restore.yml\n```\n如果集群主要组件（master/etcd/node）等出现不可恢复问题，可以尝试使用如下步骤 [清理]() --> [创建]() --> [恢复]()\n\n``` bash\n$ ezctl clean k8s-01\n# 或者如下手动执行ansible命令\n# ansible-playbook -i clusters/k8s-01/hosts -e @clusters/k8s-01/config.yml  playbooks/99.clean.yml\n$ ezctl setup k8s-01 01\n$ ezctl setup k8s-01 02\n$ ezctl setup k8s-01 03\n$ ezctl setup k8s-01 04\n$ ezctl setup k8s-01 05\n...\n$ ezctl restore k8s-01\n# ansible-playbook -i clusters/k8s-01/hosts -e @clusters/k8s-01/config.yml  playbooks/95.restore.yml\n```\n\n## 参考\n\n- https://etcd.io/docs/v3.4/op-guide/recovery/\n"
  },
  {
    "path": "docs/op/force_ch_certs.md",
    "content": "# 强制更新CA和所有证书\n\n- WARNNING: 此命令使用需要小心谨慎，确保了解功能背景和可能的结果；执行后，它会重新创建集群CA证书以及由它颁发的所有其他证书；一般适合于集群admin.conf不小心泄露，为了避免集群被非法访问，重新创建CA，从而使已泄漏的admin.conf失效。\n\n- 如果需要分发受限的kubeconfig，强烈建议使用[自定义权限和期限的kubeconfig](kcfg-adm.md)\n\n## 使用帮助\n\n确认需要强制更新后，在ansible 控制节点使用如下命令：(xxx 表示需要操作的集群名)\n\n``` bash\ndocker exec -it kubeasz ezctl kca-renew xxx\n# 或者使用 dk ezctl kca-renew xxx\n```\n\n上述命令执行后，按序进行以下的操作：详见`playbooks/96.update-certs.yml`\n\n- 重新生成CA证书，以及各种kubeconfig\n- 签发新etcd证书，并使用新证书重启etcd服务\n- 签发新kube-apiserver 证书，并重启kube-apiserver/kube-controller-manager/kube-scheduler 服务\n- 签发新kubelet 证书，并重启kubelet/kube-proxy 服务\n- 重启网络组件pod\n- 重启其他集群组件pod\n\n- **特别注意：** 如果集群中运行的业务负载pod需要访问apiserver，需要重启这些pod\n\n## 检查验证\n\n更新完毕，注意检查集群组件日志和容器pod日志，确认集群处于正常状态\n\n- 集群组件日志：使用journalctl -u xxxx.service -f 依次检查 etcd.service/kube-apiserver.service/kube-controller-manager.service/kube-scheduler.service/kubelet.service/kube-proxy.service\n- 容器pod日志：使用 kubectl logs 方式检查容器日志\n"
  },
  {
    "path": "docs/op/kcfg-adm.md",
    "content": "# 管理客户端kubeconfig \n\n默认 k8s集群安装成功后生成客户端kubeconfig，它拥有集群管理的所有权限（不要将这个admin权限、50年期限的kubeconfig流露出去）；而我们经常需要将限定权限、限定期限的kubeconfig 分发给普通用户；利用cfssl签发自定义用户证书和k8s灵活的rbac权限绑定机制，ezctl 工具封装了这个功能。\n\n## 使用帮助\n\n```\nezctl help kcfg-adm\nUsage: ezctl kcfg-adm <cluster> <args>\navailable <args>:\n    -A     to add a client kubeconfig with a newly created user\n    -D     to delete a client kubeconfig with the existed user\n    -L     to list all of the users\n    -e     to set expiry of the user certs in hours (ex. 24h, 8h, 240h)\n    -t     to set a user-type (admin or view)\n    -u     to set a user-name prefix\n\nexamples: ./ezctl kcfg-adm test-k8s -L\n          ./ezctl kcfg-adm default -A -e 240h -t admin -u jack\n          ./ezctl kcfg-adm default -D -u jim-202101162141\n```\n\n- 可以设置过期时间\n- 可以设置权限：管理员权限（admin）和只读权限（view）\n\n## 使用举例\n\n- 1.查看集群k8s-01当前自定义kubeconfig\n\n```\nezctl kcfg-adm k8s-01 -L\n2021-01-24 16:32:43 INFO list-kcfg k8s-01\n2021-01-24 16:32:43 INFO list-kcfg in cluster:k8s-01\n\nUSER                           TYPE            EXPIRY(+8h if in Asia/Shanghai)\n---------------------------------------------------------------------------------\n\n2021-01-24 16:32:43 INFO list-kcfg k8s-01 success\n```\n初始情况下列表为空\n\n- 2.增加集群k8s-01一个自定义用户kubeconfig，用户名user01，期限24h，只读权限\n\n```\nezctl kcfg-adm k8s-01 -A -u user01 -e 24h -t view\n2021-01-24 17:32:33 INFO add-kcfg k8s-01\n2021-01-24 17:32:33 INFO add-kcfg in cluster:k8s-01 with user:user01-202101241732\n\nPLAY [localhost] *****************************************************************************************************\n\n...（此处省略输出） \n\nTASK [deploy : debug] ************************************************************************************************\nok: [localhost] => {\n    \"msg\": \"查看user01-202101241732自定义kubeconfig：/etc/kubeasz/clusters/k8s-01/ssl/users/user01-202101241732.kubeconfig\"\n}\n\nPLAY RECAP ***********************************************************************************************************\nlocalhost                  : ok=12   changed=10   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\n\n2021-01-24 17:32:41 INFO add-kcfg k8s-01 success\n```\n生成的kubeconfig位于 /etc/kubeasz/clusters/k8s-01/ssl/users/user01-202101241732.kubeconfig\n\n- 3.再增加一个用户user02，期限240h，admin权限\n\n```\nezctl kcfg-adm k8s-01 -A -u user02 -e 240h -t admin\n2021-01-24 18:38:47 INFO add-kcfg k8s-01\n2021-01-24 18:38:47 INFO add-kcfg in cluster:k8s-01 with user:user02-202101241838\n\nPLAY [localhost] *****************************************************************************************************\n\n...（此处省略输出）\n\nTASK [deploy : debug] ************************************************************************************************\nok: [localhost] => {\n    \"msg\": \"查看user02-202101241838自定义kubeconfig：/etc/kubeasz/clusters/k8s-01/ssl/users/user02-202101241838.kubeconfig\"\n}\n\nPLAY RECAP ***********************************************************************************************************\nlocalhost                  : ok=12   changed=9    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\n\n2021-01-24 18:38:55 INFO add-kcfg k8s-01 success\n```\n\n- 4.再次查看集群k8s-01当前自定义kubeconfig\n\n```\nezctl kcfg-adm k8s-01 -L\n2021-01-24 18:40:30 INFO list-kcfg k8s-01\n2021-01-24 18:40:30 INFO list-kcfg in cluster:k8s-01\n\nUSER                           TYPE            EXPIRY(+8h if in Asia/Shanghai)\n---------------------------------------------------------------------------------\nuser02-202101241838            cluster-admin   2021-02-03T10:34:00Z\nuser01-202101241732            view            2021-01-25T09:28:00Z\n\n2021-01-24 18:40:31 INFO list-kcfg k8s-01 success\n```\n\n- 5.删除user01-202101241732 权限\n\n``` bash\nezctl kcfg-adm k8s-01 -D -u user01-202101241732\n2021-01-24 21:41:50 INFO del-kcfg k8s-01\n2021-01-24 21:41:50 INFO del-kcfg in cluster:k8s-01 with user:user01-202101241732\nclusterrolebinding.rbac.authorization.k8s.io \"crb-user01-202101241732\" deleted\n2021-01-24 21:41:50 INFO del-kcfg k8s-01 success\n\nezctl kcfg-adm k8s-01 -L\n2021-01-24 21:42:02 INFO list-kcfg k8s-01\n2021-01-24 21:42:02 INFO list-kcfg in cluster:k8s-01\n\nUSER                           TYPE            EXPIRY(+8h if in Asia/Shanghai)\n---------------------------------------------------------------------------------\nuser02-202101241838            cluster-admin   2021-02-03T10:34:00Z\n\n2021-01-24 21:42:02 INFO list-kcfg k8s-01 success\n```\n"
  },
  {
    "path": "docs/op/loadballance_ingress_nodeport.md",
    "content": "# 配置负载转发 ingress nodeport\n\n向集群外暴露 ingress-controller 本身的服务端口（80/443/8080）一般有以下三种方法：\n\n- 1.部署ingress-controller时使用`hostNetwork: true`，这样就可以直接使用上述端口，可能与host已listen端口冲突\n- 2.部署ingress-controller时使用`LoadBalancer`类型服务，需要集群支持`LoadBalancer`\n- 3.部署ingress-controller时使用`nodePort`类型服务，然后在集群外使用 haproxy/f5 等配置 virtual server 集群\n\n本文档讲解使用 haproxy 配置 ingress的 VS 集群，前提是配置了自建`ex_lb`节点\n\n## 1.配置 ex_lb 参数开启转发 ingress nodeport\n\n``` bash\n# 编辑 roles/ex-lb/defaults/main.yml，配置如下变量\nINGRESS_NODEPORT_LB: \"yes\"\nINGRESS_TLS_NODEPORT_LB: \"yes\"\n```\n\n## 2.重新配置启动LB节点服务\n\n``` bash\n$ ezctl setup ${集群名} ex-lb \n```\n\n## 3.验证 ex_lb 节点的 haproxy 服务配置 `/etc/haproxy/haproxy.cfg` 包含如下配置\n\n``` bash\n... 前文省略\nlisten kube_master\n        bind 0.0.0.0:8443\n        mode tcp\n        option tcplog\n        balance roundrobin\n        server 192.168.1.1 192.168.1.1:6443 check inter 2000 fall 2 rise 2 weight 1\n        server 192.168.1.2 192.168.1.2:6443 check inter 2000 fall 2 rise 2 weight 1\n\nlisten ingress-node\n        bind 0.0.0.0:80\n        mode tcp\n        option tcplog\n        balance roundrobin\n        server 192.168.1.3 192.168.1.3:23456 check inter 2000 fall 2 rise 2 weight 1\n        server 192.168.1.4 192.168.1.4:23456 check inter 2000 fall 2 rise 2 weight 1\n\nlisten ingress-node-tls\n        bind 0.0.0.0:443\n        mode tcp\n        option tcplog\n        balance roundrobin\n        server 192.168.1.3 192.168.1.3:23457 check inter 2000 fall 2 rise 2 weight 1\n        server 192.168.1.4 192.168.1.4:23457 check inter 2000 fall 2 rise 2 weight 1\n```\n\n验证成功后，我们可以方便的去做[配置ingress](../guide/ingress.md)和[配置https ingress](../guide/ingress-tls.md)实验了。\n"
  },
  {
    "path": "docs/op/op-etcd.md",
    "content": "# 管理 etcd 集群\n\nEtcd 集群支持在线改变集群成员节点，可以增加、修改、删除成员节点；不过改变成员数量仍旧需要满足集群成员多数同意原则（quorum），另外请记住集群成员数量变化的影响：\n\n- 注意：如果etcd 集群有故障节点，务必先删除故障节点，然后添加新节点，[参考FAQ](https://etcd.io/docs/v3.4.0/faq/)\n- 增加 etcd 集群节点, 提高集群稳定性\n- 增加 etcd 集群节点, 提高集群读性能（所有节点数据一致，客户端可以从任意节点读取数据）\n- 增加 etcd 集群节点, 降低集群写性能（所有节点数据一致，每一次写入会需要所有节点数据同步）\n\n## 备份 etcd 数据\n\n1. 手动在任意正常 etcd 节点上执行备份：\n\n``` bash\n# snapshot备份\n$ ETCDCTL_API=3 etcdctl snapshot save backup.db\n# 查看备份\n$ ETCDCTL_API=3 etcdctl --write-out=table snapshot status backup.db\n```\n\n2. 使用 kubeasz 备份\n_cluster_name_ 为 k8s-01\n\n``` bash \nezctl backup k8s-01\n```\n\n使用 crontab 定时备份示例(使用 容器化的 kubeasz，每日01:01 备份)\n```\n1 1 * * * /usr/bin/docker exec -i kubeasz ezctl backup k8s-01\n```\n\n备份文件在 \n\n```\n{{ base_dir }}/clusters/k8s-01/backup\n```\n\n## etcd 集群节点操作\n\n执行如下 (假设待操作节点为 192.168.1.11，集群名称test-k8s)：\n\n- 增加 etcd 节点：\n\n``` bash\n# ssh 免密码登录\n$ ssh-copy-id 192.168.1.11\n\n# 新增节点\n$ ezctl add-etcd test-k8s 192.168.1.11\n```\n\n- 删除 etcd 节点：`$ ezctl del-etcd test-k8s 192.168.1.11`\n\n具体操作流程参考 ezctl中 add-etcd/del-etcd 相关函数和playbooks/ 目录的操作剧本\n\n### 验证 etcd 集群\n\n``` bash\n# 登录任意etcd节点验证etcd集群状态\n$ export ETCDCTL_API=3 \n$ etcdctl member list\n\n# 验证所有etcd节点服务状态和日志\n$ systemctl status etcd\n$ journalctl -u etcd -f\n```\n\n## 参考\n\n- 官方文档 https://etcd.io/docs/v3.5/op-guide/runtime-configuration/ \n"
  },
  {
    "path": "docs/op/op-index.md",
    "content": "# 集群运维管理指南 operation guide\n\n- [管理 NODE 节点](op-node.md)\n- [管理 MASTER 节点](op-master.md)\n- [管理 ETCD 节点](op-etcd.md)\n- [升级 K8S 版本](upgrade.md)\n- [集群备份与恢复](cluster_restore.md)\n- [管理分发用户 kubeconfig](kcfg-adm.md)\n- [修改 APISERVER 证书](ch_apiserver_cert.md)\n- [强制更新CA和所有证书](force_ch_certs.md)\n- [配置负载转发 ingress nodeport](loadballance_ingress_nodeport.md)\n"
  },
  {
    "path": "docs/op/op-master.md",
    "content": "# 管理 kube_master 节点\n\n## 1.增加 kube_master 节点\n\n新增`kube_master`节点大致流程为：(参考ezctl 中add-master函数和playbooks/23.addmaster.yml)\n- [可选]新节点安装 chrony 时间同步\n- 新节点预处理 prepare\n- 新节点安装 container runtime \n- 新节点安装 kube_master 服务\n- 新节点安装 kube_node 服务\n- 新节点安装网络插件相关\n- 禁止业务 pod调度到新master节点\n- 更新 node 节点 haproxy 负载均衡并重启\n\n### 操作步骤\n\n执行如下 (假设待增加节点为 192.168.1.11, 集群名称test-k8s)：\n\n``` bash\n# ssh 免密码登录\n$ ssh-copy-id 192.168.1.11\n\n# 新增节点\n$ ezctl add-master test-k8s 192.168.1.11\n\n# 同理，重复上面步骤再新增节点并自定义nodename\n$ ezctl add-master test-k8s 192.168.1.12 k8s_nodename=master-03\n```\n\n### 验证\n\n``` bash\n# 在新节点master 服务状态\n$ systemctl status kube-apiserver \n$ systemctl status kube-controller-manager\n$ systemctl status kube-scheduler\n\n# 查看新master的服务日志\n$ journalctl -u kube-apiserver -f\n\n# 查看集群节点，可以看到新 master节点 Ready, 并且禁止了POD 调度功能\n$ kubectl get node\nNAME           STATUS                     ROLES     AGE       VERSION\n192.168.1.1    Ready,SchedulingDisabled   <none>    3h        v1.9.3\n192.168.1.2    Ready,SchedulingDisabled   <none>    3h        v1.9.3\n192.168.1.3    Ready                      <none>    3h        v1.9.3\n192.168.1.4    Ready                      <none>    3h        v1.9.3\n192.168.1.11   Ready,SchedulingDisabled   <none>    2h        v1.9.3\t# 新增 master节点\n```\n\n## 2.删除 kube_master 节点\n\n\n删除`kube_master`节点大致流程为：(参考ezctl 中del-master函数和playbooks/33.delmaster.yml)\n- 检测是否可以删除\n- 迁移节点 pod\n- 删除 master 相关服务及文件\n- 删除 node 相关服务及文件\n- 从集群删除 node 节点\n- 从 ansible hosts 移除节点\n- 在 ansible 控制端更新 kubeconfig\n- 更新 node 节点 haproxy 配置\n\n### 操作步骤\n\n``` bash\n$ ezctl del-master test-k8s 192.168.1.11  # 假设待删除节点 192.168.1.11\n```\n\n### 验证\n\n略\n\n"
  },
  {
    "path": "docs/op/op-node.md",
    "content": "# 管理 node 节点\n\n目录\n- 1.增加 kube_node 节点\n- 2.增加非标准ssh端口节点\n- 3.删除 kube_node 节点\n\n## 1.增加 kube_node 节点\n\n新增`kube_node`节点大致流程为：(参考ezctl 里面add-node函数 和 playbooks/22.addnode.yml)\n- [可选]新节点安装 chrony 时间同步\n- 新节点预处理 prepare\n- 新节点安装 container runtime\n- 新节点安装 kube_node 服务\n- 新节点安装网络插件相关\n\n### 操作步骤\n\n执行如下 (假设待增加节点为 192.168.1.11，k8s集群名为 test-k8s)：\n\n``` bash\n# ssh 免密码登录\n$ ssh-copy-id 192.168.1.11\n\n# 新增节点\n$ ezctl add-node test-k8s 192.168.1.11\n\n# 同理，重复上面步骤再新增节点并自定义nodename\n$ ezctl add-node test-k8s 192.168.1.12 k8s_nodename=worker-03\n```\n\n### 验证\n\n``` bash\n# 验证新节点状态\n$ kubectl get node\n\n# 验证新节点的网络插件calico 或flannel 的Pod 状态\n$ kubectl get pod -n kube-system\n\n# 验证新建pod能否调度到新节点，略\n```\n\n## 2.增加非标准ssh端口节点\n\n假设待添加节点192.168.2.1，ssh 端口 10022；然后执行 \n\n``` bash\n$ ssh-copy-id -p 10022 192.168.2.1\n$ ezctl add-node test-k8s 192.168.2.1 ansible_ssh_port=10022\n```\n\n- 注意：如果在添加节点时需要设置其他个性化变量，可以同理在后面不断添加\n\n\n## 3.删除 kube_node 节点\n\n删除 node 节点流程：(参考ezctl 里面del-node函数 和 playbooks/32.delnode.yml)\n- 检测是否可以删除\n- 迁移节点上的 pod\n- 删除 node 相关服务及文件\n- 从集群删除 node\n\n### 操作步骤\n\n``` bash\n$ ezctl del-node test-k8s 192.168.1.11 # 假设待删除节点为 192.168.1.11\n```\n\n### 验证\n\n略\n"
  },
  {
    "path": "docs/op/upgrade.md",
    "content": "## k8s 集群升级\n\n集群升级存在一定风险，请谨慎操作。 \n\n- 支持k8s相同大版本基础上升级任意小版本，比如当前安装集群为1.25.0，你可以方便的升级到任何1.25.x版本\n- 不建议跨大版本升级，一般大版本更新时k8s api有一些变动\n\n### 备份etcd数据\n\n- 自动备份\n\n`kubeasz`项目也可以如下方便执行备份（假设集群名为k8s-01），详情阅读文档[备份恢复](cluster_restore.md)\n\n```\ndk ezctl backup k8s-01\n```\n\n- 手动备份 etcd数据，在任意 etcd节点上执行：\n\n``` bash\n# snapshot备份\n$ ETCDCTL_API=3 etcdctl snapshot save backup.db\n# 查看备份\n$ ETCDCTL_API=3 etcdctl --write-out=table snapshot status backup.db\n```\n\n### k8s 升级小版本\n\n快速升级`k8s`小版本，比较常见如`Bug修复` `特性发布`时使用。\n\n- 首先去官网release下载待升级的k8s版本，例如`https://dl.k8s.io/v1.25.4/kubernetes-server-linux-amd64.tar.gz`\n- 解压下载的tar.gz文件，找到如下`kube*`开头的二进制，复制替换kubeasz控制端目录`/etc/kubeasz/bin`对应文件\n  - kube-apiserver\n  - kube-controller-manager\n  - kubectl\n  - kubelet\n  - kube-proxy\n  - kube-scheduler\n\n- 切换当前所在集群为升级集群, 在kubeasz控制端执行`dk ezctl checkout k8s-01`\n- 在kubeasz控制端执行`dk ezctl upgrade k8s-01` 即可完成k8s 升级，不会中断业务应用\n\n\n### 其他升级说明\n\n其他升级是指升级k8s组件包括：`etcd版本` `docker版本`，一般不需要用到，不建议升级，以下仅作说明。\n\n- 1.下载所有组件相关新的二进制解压并替换 `/etc/kubeasz/bin/` 目录下文件\n\n- 2.升级 etcd: `ansible-playbook -i clusters/k8s-01/hosts -e @clusters/k8s-01/config.yml -t upgrade_etcd playbooks/02.etcd.yml`\n\n- 3.升级 docker （建议使用k8s官方支持的docker稳定版本）\n  - 如果可以接受短暂业务中断，执行 `ansible-playbook -t upgrade_docker 03.docker.yml`\n  - 如果要求零中断升级，执行 `ansible-playbook -i clusters/k8s-01/hosts -e @clusters/k8s-01/config.yml -t download_docker playbooks/03.runtime.yml`，然后手动执行如下\n    - 待升级节点，先应用`kubectl cordon`和`kubectl drain`命令迁移业务pod\n    - 待升级节点执行 `systemctl restart docker`\n    - 恢复节点可调度 `kubectl uncordon`\n"
  },
  {
    "path": "docs/release-notes/kubeasz-3.6.0.md",
    "content": "## kubeasz 3.6.0 (Beginning of Summer)\n\n微雨过，小荷翻。榴花开欲然。kubeasz 3.6.0 发布：支持k8s v1.27版本，支持更多操作系统安装，以及组件更新和一些bugfix。\n\n### 版本更新\n\n- k8s: v1.27.1\n- cilium: v1.13.2\n- flannel: v0.21.4\n- harbor: v2.6.4\n- metrics-server: v0.6.3\n- k8s-dns-node-cache: 1.22.20\n- kube-prometheus-stack: 45.23.0\n\n### 调整项目分支更新规则\n\nk8s大版本对应kubeasz特定的大版本号，详见README.md 中版本对照表，当前积极更新的分支如下：\n\n- master：默认保持与最新分支同步，当前与v3.6同步\n- v3.6：对应k8s v1.27 版本，持续保持更新\n- v3.5：对应k8s v1.26 版本，主要使用cherry-pick方式合并后续版本中的重要commit\n- v3.4：对应k8s v1.25 版本，主要使用cherry-pick方式合并后续版本中的重要commit\n- v3.3：对应k8s v1.24 版本，主要使用cherry-pick方式合并后续版本中的重要commit\n\n### 支持更多操作系统安装\n\n本次增加测试支持大部分使用systemd的linux发行版，如果安装有问题先请查看(docs/setup/multi_os.md)；如果某个能够支持安装的系统没有在列表中，欢迎提PR 告知。\n\n- **Alibaba Linux** 2.1903, 3.2104([notes](docs/setup/multi_os.md#Alibaba))\n- **Alma Linux** 8, 9\n- **Anolis OS** 8.x RHCK, 8.x ANCK([notes](docs/setup/multi_os.md#Anolis))\n- **CentOS/RHEL** 7, 8, 9\n- **Debian** 10, 11([notes](docs/setup/multi_os.md#Debian))\n- **Fedora** 34, 35, 36, 37\n- **openSUSE** Leap 15.x([notes](docs/setup/multi_os.md#openSUSE))\n- **Rocky Linux** 8, 9\n- **Ubuntu** 16.04, 18.04, 20.04, 22.04\n\n### 重要更新\n\n- 重写`ezdown`脚本支持下载多系统软件包部分\n- 重写`role:prepare`支持离线安装多系统软件包部分\n- 简化harbor安装后集成使用，目前在containerd容器运行时中额外配置允许insecure仓库方式\n- 修复pod挂载 hostpath volume，删除pod会卡住问题 (#1259) by itswl\n- 增加设置limits for pids #1265 by AsonZhang\n\n### 其他\n\n- 增加项目`ISSUE`模版 \n- 修复chronyd 服务可能出现 enable失败问题 (#1254) by Roach57\n- 增加ezctl setup脚本执行时打印版本信息\n"
  },
  {
    "path": "docs/release-notes/kubeasz-3.6.1.md",
    "content": "## kubeasz 3.6.1\n\nkubeasz 3.6.1 发布：支持k8s v1.27版本，组件更新和一些bugfix。\n\n### 版本更新\n\n- k8s: v1.27.2\n- calico: v3.24.6\n- kube-ovn: v1.11.5\n- kube-router: v1.5.4\n\n### 增加应用部署插件 kubeapps\n\nKubeapps 是一个基于 Web 的应用程序，它可以在 Kubernetes 集群上进行一站式安装，并使用户能够部署、管理和升级应用\n程序。https://github.com/easzlab/kubeasz/blob/master/docs/guide/kubeapps.md\n\n### 重要更新\n\n- 重写`ezdown`脚本支持下载额外的应用容器镜像\n- 增加`local-path-provisioner`本地文件目录提供者\n- 设置允许kubelet并行拉取容器镜像\n\n### 其他\n\n- 增加kubectl-node-shell 脚本\n- 修复ansible connect local 是 python 解析器不确定问题\n- 修复typo #1273\n- 部分文档更新\n"
  },
  {
    "path": "docs/release-notes/kubeasz-3.6.2.md",
    "content": "## kubeasz 3.6.2\n\nkubeasz 3.6.2 发布：支持k8s v1.28版本，组件更新和一些bugfix。\n\n### 版本更新\n\n- k8s: v1.28.1\n- etcd: v3.5.9\n- containerd: 1.6.23\n- runc: v1.1.9\n- cni: v1.3.0\n- coredns: 1.11.1\n- cilium: 1.13.6\n- flannel: v0.22.2\n\n### 修改kubeasz支持k8s版本对应规则 \n\n原有模式每个k8s大版本都有推荐对应的kubeasz版本，这样做会导致kubeasz版本碎片化，追踪问题很麻烦，而且也影响普通用户安装体验。从kubeasz 3.6.2版本开始，默认最新版本kubeasz兼容支持安装最新的三个k8s大版本。具体安装说明如下：\n\n(如果/etc/kubeasz/bin 目录下已经有kube* 文件，需要先删除 rm -f /etc/kubeasz/bin/kube*)\n\n- 安装 k8s v1.28: 使用 kubeasz 3.6.2，执行./ezdown -D 默认下载即可\n- 安装 k8s v1.27: 使用 kubeasz 3.6.2，执行./ezdown -D -k v1.27.5 下载\n- 安装 k8s v1.26: 使用 kubeasz 3.6.2，执行./ezdown -D -k v1.26.8 下载\n- 安装 k8s v1.25: 使用 kubeasz 3.6.2，执行./ezdown -D -k v1.25.13 下载\n- 安装 k8s v1.24: 使用 kubeasz 3.6.2，执行./ezdown -D -k v1.24.17 下载\n\n\n### 重要更新\n\n- 增加支持containerd 可配置trusted insecure registries \n- 修复calico rr 模式的节点设置 #1308\n- 修复自定义节点名称设置 /etc/hosts方案\n- fix: kubelet failed when enabling kubeReserved or systemReserved\n\n### 其他\n\n- 修复：disable selinux on deploy host\n- helm部署redis-ha添加国内可访问镜像 by heyanyanchina123\n- 修复多集群管理时, 若当前ezctl配置不是升级集群,会导致升级失败 by learn0208\n- add ipvs配置打开strictARP #1298\n- revert for supporting k8s version <= 1.26\n- add kubetail, by WeiLai\n- update manifests:es-cluster/mysql-cluster\n"
  },
  {
    "path": "docs/release-notes/kubeasz-3.6.3.md",
    "content": "## kubeasz 3.6.3\n\nkubeasz 3.6.3 发布：支持k8s v1.29版本，组件更新和一些bugfix。\n\n### 版本更新\n\n- k8s: v1.29.0\n- etcd: v3.5.10\n- containerd: 1.6.26\n- runc: v1.1.10\n- calico: v3.26.4\n- cilium: 1.14.5\n\n### 修改kubeasz支持k8s版本对应规则 \n\n原有模式每个k8s大版本都有推荐对应的kubeasz版本，这样做会导致kubeasz版本碎片化，追踪问题很麻烦，而且也影响普通用户安装体验。从kubeasz 3.6.2版本开始，默认最新版本kubeasz兼容支持安装最新的三个k8s大版本。具体安装说明如下：\n\n(如果/etc/kubeasz/bin 目录下已经有kube* 文件，需要先删除 rm -f /etc/kubeasz/bin/kube*)\n\n- 安装 k8s v1.29: 使用 kubeasz 3.6.3，执行./ezdown -D 默认下载即可\n- 安装 k8s v1.28: 使用 kubeasz 3.6.2，执行./ezdown -D -k v1.28.5 下载\n- 安装 k8s v1.27: 使用 kubeasz 3.6.2，执行./ezdown -D -k v1.27.9 下载\n- 安装 k8s v1.26: 使用 kubeasz 3.6.2，执行./ezdown -D -k v1.26.12 下载\n\n### 重要更新\n\n- deprecated role: os-harden，因为扩大支持更多linux发行版，系统加固方式无法在各种系统上充分测试，感谢 #1338 issue 反馈问题 \n- adjust docker setup scripts\n- update harbor v2.8.4 and fix harbor setup\n- fix nodelocaldns yaml\n\n### 其他\n\n- docs update: add argocd guide \n- docs: fix the quickStart.md url in network-plugin\n"
  },
  {
    "path": "docs/release-notes/kubeasz-3.6.4.md",
    "content": "## kubeasz 3.6.4\n\nkubeasz 3.6.4 发布：支持k8s v1.30版本，组件更新和一些bugfix。\n\n### 版本更新\n\n- k8s: v1.30.1\n- etcd: v3.5.12\n- containerd: 1.7.17\n- runc: v1.1.12\n- calico: v3.26.4\n- cilium: 1.15.5\n- cni: v1.4.1\n- harbor: v2.10.2\n- metrics-server: v0.7.1\n\n### 重要更新\n\n- 安全更新：to solve CVE-2024-21626: update containerd, runc\n- 安装流程：role 'prepare' 阶段增加设置hostname，这样当网络组件为calico时不会因为主机名相同而出错；同时在example/config.yml 中增加配置开关`ENABLE_SETTING_HOSTNAME`\n- 操作系统：增加测试支持 Ubuntu 2404\n  - 已知在ubuntu 2404上使用网络插件calico v3.26.4不兼容，提示：ipset v7.11: Kernel and userspace incompatible\n  - 使用cilium 组件没有问题\n\n### 其他\n\n- 21376465de7f44d1ec997bde096afc7404ce45c5 fix: cilium ui images settings\n- c40548e0e33cab3c4e5742aacce11101ac0c7366 #1343, 恢复podPidsLimit=-1默认设置\n- \n"
  },
  {
    "path": "docs/release-notes/kubeasz-3.6.5.md",
    "content": "## kubeasz 3.6.5\n\nkubeasz 3.6.5 发布：支持k8s v1.31 版本，组件更新和一些bugfix。\n\n### 版本更新\n\n- k8s: v1.31.2\n- etcd: v3.5.16\n- containerd: 1.7.23\n- runc: v1.1.15\n- calico: v3.28.2\n- coredns: 1.11.3\n- dnsnodecache: 1.23.1\n- cilium: 1.16.3\n- flannel: v0.26.0\n- cni: v1.6.0\n- harbor: v2.11.1\n- metrics-server: v0.7.2\n- pause: 3.10\n\n### 更新\n\n- 修正centos9 下prepare脚本运行的问题 #1397 By GitHubAwan\n- style: trim trailing whitespace & add logger source line number #1413 By kelein\n- 操作系统：增加测试支持 Ubuntu 2404\n  - 修复在ubuntu 2404上使用网络插件calico ipSet兼容性问题（calico v3.28.2）\n\n### 其他\n\n- 修复calico hostname 设置\n- 更新部分文档\n- \n"
  },
  {
    "path": "docs/release-notes/kubeasz-3.6.6.md",
    "content": "## kubeasz 3.6.6\n\nkubeasz 3.6.6 发布：支持k8s v1.32 版本，组件更新和一些bugfix。\n\n### 版本更新\n\n- k8s: v1.32.3\n- etcd: v3.5.20\n- containerd: 2.0.4\n- runc: v1.2.6\n- calico: v3.28.3\n- coredns: 1.11.4\n- cni: v1.6.2\n- harbor: v2.12.2\n\n### 更新\n\n- 更新国内docker镜像仓库加速设置，解决ezdown脚本无法下载镜像问题；同步更新containerd 镜像仓库加速设置\n- 主要组件大版本更新：containerd 从 1.7.x 更新大版本 2.0.x，更新主要配置文件；runc 从 1.1.x 更新大版本 1.2.x\n- 安装逻辑更新：新增节点不再重复执行网络插件安装，避免部分网络插件自动重启业务pod，by gogeof\n- 安装逻辑更新：每次执行脚本 containerd 都会被重新安装，不管原先是否已经运行\n- 优化更新 ezctl 脚本从 ezdown 加载变量方式，by RadPaperDinosaur\n\n\n### 其他\n\n- 修复 CLUSTER_DNS_SVC_IP & CLUSTER_KUBERNETES_SVC_IP 地址生成规则，by yunpiao\n- 更新conformance文档\n- \n"
  },
  {
    "path": "docs/release-notes/kubeasz-3.6.7.md",
    "content": "## kubeasz 3.6.7\n\nkubeasz 3.6.7 发布：支持k8s v1.33 版本，组件更新和bugfix。\n\n### 版本更新\n\n- k8s: v1.33.1\n- etcd: v3.5.21\n- containerd: 2.1.1\n- runc: v1.2.6\n- calico: v3.28.4\n- cilium: 1.17.4\n- coredns: 1.12.1\n- cni: v1.7.1\n- dnsNodeCache: 1.25.0\n- harbor: v2.12.4\n- local-path-provisioner: v0.0.31\n- dashboard 7.12.0\n\n### 更新\n\n- 增加可选组件`kubeblocks`集成，增加多种数据库高可用方案\n- 重写脚本ezdown中关于镜像下载保存部分，清理冗余，增加错误错误处理\n- 修复添加/删除master节点时/etc/hosts问题 #1464\n- 修复使用静态编译的containerd二进制，并设置日志为warn级别，避免当容器使用exec类健康检查时产生过多日志\n- 修复./ezdown -D 偶发403报错 #1470\n- 修复cilium 组件原cilium_connectivity_check脚本执行条件\n\n### 文档更新\n\n- 更新一致性认证文档 conformance.md\n"
  },
  {
    "path": "docs/release-notes/kubeasz-3.6.8.md",
    "content": "## kubeasz 3.6.8\n\nkubeasz 3.6.8 发布：支持k8s v1.34 版本，组件更新和bugfix。\n\n### 版本更新\n\n- k8s: v1.34.1\n- etcd: v3.6.4\n- containerd: 2.1.4\n- runc: v1.3.1\n- coredns: 1.12.4\n- cni: v1.8.0\n- dnsNodeCache: 1.26.4\n- metrics: v0.8.0\n- flannel: v0.27.3\n- kubeblocks: 1.0.0\n- kube-prometheus-stack: 75.7.0\n\n### 重要更新\n\n- 调整系统内核设置 commit f9bdbeb4e3bd6b98a03a900d3e50ef29da6a590f, #1478\n- 新增支持 openEuler 22.03 LTS, 24.03 LTS\n- 优化节点只需运行一次 prepare task\n- 增加可选开启集群审计功能\n- 修复 calico mtu 设置 #1444\n- 修复 calico vxlan overlay 设置 #1492 \n- 更新 containerd 配置容器镜像仓库方式\n\n### 文档更新\n\n- 实验性混合架构部署文档 https://github.com/easzlab/kubeasz/blob/master/docs/setup/mix_arch.md\n- updat kernel_upgrade.md for centos7 by Zlanghu #1483\n\n感谢新增贡献者：\n\nvistamin #1444\nnewfzk #1477\nlearn0208 #1478\nZlanghu #1483\nnewfzk #1492\nTOT-JIN #1495\n"
  },
  {
    "path": "docs/setup/00-planning_and_overall_intro.md",
    "content": "## 00-集群规划和基础参数设定\n\n### HA architecture\n\n<img alt=\"ha-3x\" width=\"500\" height=\"380\" src=\"../pics/ha-3x.svg\">\n\n- 注意1：确保各节点时区设置一致、时间同步。 如果你的环境没有提供NTP 时间同步，推荐集成安装[chrony](../guide/chrony.md)\n- 注意2：确保在干净的系统上开始安装，不要使用曾经装过kubeadm或其他k8s发行版的环境\n- 注意3：建议操作系统升级到新的稳定内核，请结合阅读[内核升级文档](../guide/kernel_upgrade.md)\n- 注意4：在公有云上创建多主集群，请结合阅读[在公有云上部署 kubeasz](kubeasz_on_public_cloud.md)\n\n## 高可用集群所需节点配置如下\n\n|角色|数量|描述|\n|:-|:-|:-|\n|部署节点|1|运行ansible/ezctl命令，一般复用第一个master节点|\n|etcd节点|3|注意etcd集群需要1,3,5,...奇数个节点，一般复用master节点|\n|master节点|2|高可用集群至少2个master节点|\n|node节点|n|运行应用负载的节点，可根据需要提升机器配置/增加节点数|\n\n机器配置：\n- master节点：4c/8g内存/50g硬盘\n- worker节点：建议8c/32g内存/200g硬盘以上\n\n注意：默认配置下容器运行时和kubelet会占用/var的磁盘空间，如果磁盘分区特殊，可以设置config.yml中的容器运行时和kubelet数据目录：`CONTAINERD_STORAGE_DIR` `DOCKER_STORAGE_DIR` `KUBELET_ROOT_DIR`\n\n在 kubeasz 2x 版本，多节点高可用集群安装可以使用2种方式\n\n- 1.按照本文步骤先规划准备，预先配置节点信息后，直接安装多节点高可用集群\n- 2.先部署单节点集群 [AllinOne部署](quickStart.md)，然后通过 [节点添加](../op/op-index.md) 扩容成高可用集群\n\n## 部署步骤\n\n以下示例创建一个4节点的多主高可用集群，文档中命令默认都需要root权限运行。\n\n### 1.基础系统配置\n\n+ 2c/4g内存/40g硬盘（该配置仅测试用）\n+ 最小化安装`Ubuntu 16.04 server`或者`CentOS 7 Minimal`\n+ 配置基础网络、更新源、SSH登录等\n\n### 2.在每个节点安装依赖工具\n\n推荐使用ansible in docker 容器化方式运行，无需安装额外依赖。\n\n### 3.准备ssh免密登陆\n\n配置从部署节点能够ssh免密登陆所有节点，并且设置python软连接\n\n``` bash\n#$IP为所有节点地址包括自身，按照提示输入yes 和root密码\nssh-copy-id $IP \n```\n\n### 4.在部署节点编排k8s安装\n\n- 4.1 下载项目源码、二进制及离线镜像\n\n下载工具脚本ezdown，举例使用kubeasz版本3.5.0\n\n``` bash\nexport release=3.5.0\nwget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown\nchmod +x ./ezdown\n```\n\n下载kubeasz代码、二进制、默认容器镜像（更多关于ezdown的参数，运行./ezdown 查看）\n\n``` bash\n# 国内环境\n./ezdown -D\n# 海外环境\n#./ezdown -D -m standard\n```\n\n【可选】下载额外容器镜像（cilium,flannel,prometheus等）\n\n``` bash\n# 按需下载\n./ezdown -X flannel\n./ezdown -X prometheus\n...\n```\n\n【可选】下载离线系统包 (适用于无法使用yum/apt仓库情形)\n\n``` bash\n./ezdown -P\n```\n\n上述脚本运行成功后，所有文件（kubeasz代码、二进制、离线镜像）均已整理好放入目录`/etc/kubeasz`\n\n- 4.2 创建集群配置实例\n\n``` bash\n# 容器化运行kubeasz\n./ezdown -S\n\n# 创建新集群 k8s-01\ndocker exec -it kubeasz ezctl new k8s-01\n2021-01-19 10:48:23 DEBUG generate custom cluster files in /etc/kubeasz/clusters/k8s-01\n2021-01-19 10:48:23 DEBUG set version of common plugins\n2021-01-19 10:48:23 DEBUG cluster k8s-01: files successfully created.\n2021-01-19 10:48:23 INFO next steps 1: to config '/etc/kubeasz/clusters/k8s-01/hosts'\n2021-01-19 10:48:23 INFO next steps 2: to config '/etc/kubeasz/clusters/k8s-01/config.yml'\n```\n然后根据提示配置'/etc/kubeasz/clusters/k8s-01/hosts' 和 '/etc/kubeasz/clusters/k8s-01/config.yml'：根据前面节点规划修改hosts 文件和其他集群层面的主要配置选项；其他集群组件等配置项可以在config.yml 文件中修改。\n\n- 4.3 开始安装\n如果你对集群安装流程不熟悉，请阅读项目首页 **安装步骤** 讲解后分步安装，并对 **每步都进行验证**  \n\n``` bash\n#建议使用alias命令，查看~/.bashrc 文件应该包含：alias dk='docker exec -it kubeasz'\nsource ~/.bashrc\n\n# 一键安装，等价于执行docker exec -it kubeasz ezctl setup k8s-01 all\ndk ezctl setup k8s-01 all\n\n# 或者分步安装，具体使用 dk ezctl help setup 查看分步安装帮助信息\n# dk ezctl setup k8s-01 01\n# dk ezctl setup k8s-01 02\n# dk ezctl setup k8s-01 03\n# dk ezctl setup k8s-01 04\n...\n```\n\n更多ezctl使用帮助，请参考[这里](ezctl.md)\n\n[后一篇](01-CA_and_prerequisite.md)\n"
  },
  {
    "path": "docs/setup/01-CA_and_prerequisite.md",
    "content": "# 01-创建证书和环境准备\n\n本步骤主要完成: \n\n- (deprecated) role:os-harden，（未更新上游项目，未验证最新k8s集群安装，不建议启用）可选系统加固，符合linux安全基线，详见[upstream](https://github.com/dev-sec/ansible-collection-hardening/tree/master/roles/os_hardening)\n- (optional) role:chrony，[可选集群节点时间同步](../guide/chrony.md)\n- role:deploy，创建CA证书、集群组件访问apiserver所需的各种kubeconfig\n- role:prepare，系统基础环境配置、分发CA证书、kubectl客户端安装\n\n## deploy 角色\n\n主要任务讲解：roles/deploy/tasks/main.yml\n\n### 创建 CA 证书\n\nkubernetes 系统各组件需要使用 TLS 证书对通信进行加密，使用 CloudFlare 的 PKI 工具集生成自签名的 CA 证书，用来签名后续创建的其它 TLS 证书。[参考阅读](https://coreos.com/os/docs/latest/generate-self-signed-certificates.html)\n\n根据认证对象可以将证书分成三类：服务器证书`server cert`，客户端证书`client cert`，对等证书`peer cert`(既是`server cert`又是`client cert`)，在kubernetes 集群中需要的证书种类如下：\n\n+ `etcd` 节点需要标识自己服务的`server cert`，也需要`client cert`与`etcd`集群其他节点交互，当然可以分别指定2个证书，为方便这里使用一个对等证书\n+ `master` 节点需要标识 apiserver服务的`server cert`，也需要`client cert`连接`etcd`集群，这里也使用一个对等证书\n+ `kubectl` `calico` `kube-proxy` 只需要`client cert`，因此证书请求中 `hosts` 字段可以为空\n+ `kubelet` 需要标识自己服务的`server cert`，也需要`client cert`请求`apiserver`，也使用一个对等证书\n\n整个集群要使用统一的CA 证书，只需要在ansible控制端创建，然后分发给其他节点；为了保证安装的幂等性，如果已经存在CA 证书，就跳过创建CA 步骤\n\n#### 创建 CA 配置文件 [ca-config.json.j2](../../roles/deploy/templates/ca-config.json.j2)\n``` bash\n{\n  \"signing\": {\n    \"default\": {\n      \"expiry\": \"{{ CERT_EXPIRY }}\"\n    },\n    \"profiles\": {\n      \"kubernetes\": {\n        \"usages\": [\n            \"signing\",\n            \"key encipherment\",\n            \"server auth\",\n            \"client auth\"\n        ],\n        \"expiry\": \"{{ CERT_EXPIRY }}\"\n      },\n      \"kcfg\": {\n        \"usages\": [\n            \"signing\",\n            \"key encipherment\",\n            \"client auth\"\n        ],\n        \"expiry\": \"{{ CUSTOM_EXPIRY }}\"\n      }\n    }\n  }\n}\n```\n+ `signing`：表示该证书可用于签名其它证书；生成的 ca.pem 证书中 `CA=TRUE`；\n+ `server auth`：表示可以用该 CA 对 server 提供的证书进行验证；\n+ `client auth`：表示可以用该 CA 对 client 提供的证书进行验证；\n+ `profile kubernetes` 包含了`server auth`和`client auth`，所以可以签发三种不同类型证书；expiry 证书有效期，默认50年\n+ `profile kcfg` 在后面客户端kubeconfig证书管理中用到\n\n#### 创建 CA 证书签名请求 [ca-csr.json.j2](../../roles/deploy/templates/ca-csr.json.j2)\n``` bash\n{\n  \"CN\": \"kubernetes-ca\",\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ],\n  \"ca\": {\n    \"expiry\": \"876000h\"\n  }\n}\n```\n- `ca expiry` 指定ca证书的有效期，默认100年\n\n#### 生成CA 证书和私钥\n``` bash\ncfssl gencert -initca ca-csr.json | cfssljson -bare ca\n```\n\n### 生成 kubeconfig 配置文件\n\nkubectl使用~/.kube/config 配置文件与kube-apiserver进行交互，且拥有管理 K8S集群的完全权限，\n\n准备kubectl使用的admin 证书签名请求 [admin-csr.json.j2](../../roles/deploy/templates/admin-csr.json.j2)\n\n``` bash\n{\n  \"CN\": \"admin\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"system:masters\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n\n```\n+ kubectl 使用客户端证书可以不指定hosts 字段\n+ 证书请求中 `O` 指定该证书的 Group 为 `system:masters`，而 `RBAC` 预定义的 `ClusterRoleBinding` 将 Group `system:masters` 与 ClusterRole `cluster-admin` 绑定，这就赋予了kubectl**所有集群权限**\n\n``` bash\n$ kubectl describe clusterrolebinding cluster-admin\nName:         cluster-admin\nLabels:       kubernetes.io/bootstrapping=rbac-defaults\nAnnotations:  rbac.authorization.kubernetes.io/autoupdate=true\nRole:\n  Kind:  ClusterRole\n  Name:  cluster-admin\nSubjects:\n  Kind   Name            Namespace\n  ----   ----            ---------\n  Group  system:masters  \n```\n\n#### 生成 admin 用户证书\n\n```\ncfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin\n```\n\n#### 生成 ~/.kube/config 配置文件\n\n使用`kubectl config` 生成kubeconfig 自动保存到 ~/.kube/config，生成后 `cat ~/.kube/config`可以验证配置文件包含 kube-apiserver 地址、证书、用户名等信息。\n\n```\nkubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=127.0.0.1:8443\nkubectl config set-credentials admin --client-certificate=admin.pem --embed-certs=true --client-key=admin-key.pem\nkubectl config set-context kubernetes --cluster=kubernetes --user=admin\nkubectl config use-context kubernetes\n```\n\n### 生成 kube-proxy.kubeconfig 配置文件\n\n创建 kube-proxy 证书请求\n\n``` bash\n{\n  \"CN\": \"system:kube-proxy\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n```\n+ kube-proxy 使用客户端证书可以不指定hosts 字段\n+ CN 指定该证书的 User 为 system:kube-proxy，预定义的 ClusterRoleBinding system:node-proxier 将User system:kube-proxy 与 Role system:node-proxier 绑定，授予了调用 kube-apiserver Proxy 相关 API 的权限；\n\n``` bash\n$ kubectl describe clusterrolebinding system:node-proxier\nName:         system:node-proxier\nLabels:       kubernetes.io/bootstrapping=rbac-defaults\nAnnotations:  rbac.authorization.kubernetes.io/autoupdate=true\nRole:\n  Kind:  ClusterRole\n  Name:  system:node-proxier\nSubjects:\n  Kind  Name               Namespace\n  ----  ----               ---------\n  User  system:kube-proxy  \n```\n\n#### 生成 system:kube-proxy 用户证书\n\n```\ncfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy\n```\n\n#### 生成 kube-proxy.kubeconfig\n\n使用`kubectl config` 生成kubeconfig 自动保存到 kube-proxy.kubeconfig\n\n```\nkubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=127.0.0.1:8443 --kubeconfig=kube-proxy.kubeconfig\nkubectl config set-credentials kube-proxy --client-certificate=kube-proxy.pem --embed-certs=true --client-key=kube-proxy-key.pem --kubeconfig=kube-proxy.kubeconfig\nkubectl config set-context default --cluster=kubernetes --user=kube-proxy --kubeconfig=kube-proxy.kubeconfig\nkubectl config use-context default --kubeconfig=kube-proxy.kubeconfig\n```\n\n### 创建kube-controller-manager 和 kube-scheduler 组件的kubeconfig 文件\n\n过程与创建kube-proxy.kubeconfig 类似，略。\n\n## prepare 角色\n\n请在另外窗口打开[roles/prepare/tasks/main.yml](../../roles/prepare/tasks/main.yml) 文件，比较简单直观\n\n1. 设置基础操作系统软件和系统参数，请阅读脚本中的注释内容\n1. 创建一些基础文件目录、环境变量以及添加本地镜像仓库`easzlab.io.local`的域名解析\n1. 分发kubeconfig等配置文件\n\n\n[后一篇](02-install_etcd.md)\n"
  },
  {
    "path": "docs/setup/02-install_etcd.md",
    "content": "## 02-安装etcd集群\n\nkuberntes 集群使用 etcd 存储所有数据，是最重要的组件之一，注意 etcd集群需要奇数个节点(1,3,5...)，本文档使用3个节点做集群。\n\n请在另外窗口打开[roles/etcd/tasks/main.yml](../../roles/etcd/tasks/main.yml) 文件，对照看以下讲解内容。\n\n### 创建etcd证书\n\n注意：证书是在部署节点创建好之后推送到目标etcd节点上去的，以增加ca证书的安全性\n\n创建ectd证书请求 [etcd-csr.json.j2](../../roles/etcd/templates/etcd-csr.json.j2)\n\n``` bash\n{\n  \"CN\": \"etcd\",\n  \"hosts\": [\n{% for host in groups['etcd'] %}\n    \"{{ host }}\",\n{% endfor %}\n    \"127.0.0.1\"\n  ],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n```\n+ etcd使用对等证书，hosts 字段必须指定授权使用该证书的 etcd 节点 IP，这里枚举了所有ectd节点的地址\n\n###  创建etcd 服务文件 [etcd.service.j2](../../roles/etcd/templates/etcd.service.j2)\n\n``` bash\n[Unit]\nDescription=Etcd Server\nAfter=network.target\nAfter=network-online.target\nWants=network-online.target\nDocumentation=https://github.com/coreos\n\n[Service]\nType=notify\nWorkingDirectory={{ ETCD_DATA_DIR }}\nExecStart={{ bin_dir }}/etcd \\\n  --name=etcd-{{ inventory_hostname }} \\\n  --cert-file={{ ca_dir }}/etcd.pem \\\n  --key-file={{ ca_dir }}/etcd-key.pem \\\n  --peer-cert-file={{ ca_dir }}/etcd.pem \\\n  --peer-key-file={{ ca_dir }}/etcd-key.pem \\\n  --trusted-ca-file={{ ca_dir }}/ca.pem \\\n  --peer-trusted-ca-file={{ ca_dir }}/ca.pem \\\n  --initial-advertise-peer-urls=https://{{ inventory_hostname }}:2380 \\\n  --listen-peer-urls=https://{{ inventory_hostname }}:2380 \\\n  --listen-client-urls=https://{{ inventory_hostname }}:2379,http://127.0.0.1:2379 \\\n  --advertise-client-urls=https://{{ inventory_hostname }}:2379 \\\n  --initial-cluster-token=etcd-cluster-0 \\\n  --initial-cluster={{ ETCD_NODES }} \\\n  --initial-cluster-state={{ CLUSTER_STATE }} \\\n  --data-dir={{ ETCD_DATA_DIR }} \\\n  --wal-dir={{ ETCD_WAL_DIR }} \\\n  --snapshot-count=50000 \\\n  --auto-compaction-retention=1 \\\n  --auto-compaction-mode=periodic \\\n  --max-request-bytes=10485760 \\\n  --quota-backend-bytes=8589934592\nRestart=always\nRestartSec=15\nLimitNOFILE=65536\nOOMScoreAdjust=-999\n\n[Install]\nWantedBy=multi-user.target\n```\n\n+ 完整参数列表请使用 `etcd --help` 查询\n+ 注意etcd 即需要服务器证书也需要客户端证书，为方便使用一个peer 证书代替两个证书\n+ `--initial-cluster-state` 值为 `new` 时，`--name` 的参数值必须位于 `--initial-cluster` 列表中\n+ `--snapshot-count` `--auto-compaction-retention` 一些性能优化参数，请查阅etcd项目文档\n+ 设置`--data-dir` 和`--wal-dir` 使用不同磁盘目录，可以避免磁盘io竞争，提高性能，具体请参考etcd项目文档\n\n### 验证etcd集群状态\n\n+ systemctl status etcd 查看服务状态\n+ journalctl -u etcd 查看运行日志\n+ 在任一 etcd 集群节点上执行如下命令\n\n``` bash\n# 根据hosts中配置设置shell变量 $NODE_IPS\nexport NODE_IPS=\"192.168.1.1 192.168.1.2 192.168.1.3\"\nfor ip in ${NODE_IPS}; do\n  etcdctl \\\n  --endpoints=https://${ip}:2379  \\\n  --cacert=/etc/kubernetes/ssl/ca.pem \\\n  --cert=/etc/kubernetes/ssl/etcd.pem \\\n  --key=/etc/kubernetes/ssl/etcd-key.pem \\\n  endpoint health; done\n\n# 预期结果\nhttps://192.168.1.1:2379 is healthy: successfully committed proposal: took = 2.210885ms\nhttps://192.168.1.2:2379 is healthy: successfully committed proposal: took = 2.784043ms\nhttps://192.168.1.3:2379 is healthy: successfully committed proposal: took = 3.275709ms\n\nfor ip in ${NODE_IPS}; do\n  etcdctl \\\n  --endpoints=https://${ip}:2379  \\\n  --cacert=/etc/kubernetes/ssl/ca.pem \\\n  --cert=/etc/kubernetes/ssl/etcd.pem \\\n  --key=/etc/kubernetes/ssl/etcd-key.pem \\\n  --write-out=table endpoint status; done\n\n# 预期结果\n+----------------------------+------------------+---------+-----------------+---------+--------+-----------------------+--------+-----------+------------+-----------+------------+--------------------+--------+--------------------------+-------------------+\n|          ENDPOINT          |        ID        | VERSION | STORAGE VERSION | DB SIZE | IN USE | PERCENTAGE NOT IN USE | QUOTA  | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | DOWNGRADE TARGET VERSION | DOWNGRADE ENABLED |\n+----------------------------+------------------+---------+-----------------+---------+--------+-----------------------+--------+-----------+------------+-----------+------------+--------------------+--------+--------------------------+-------------------+\n| https://192.168.1.1:2379   | 5f64925bd78a482c |   3.6.4 |           3.6.0 |   38 MB |  28 MB |                   28% | 8.6 GB |      true |      false |       269 |    6582307 |            6582307 |        |                          |             false |\n+----------------------------+------------------+---------+-----------------+---------+--------+-----------------------+--------+-----------+------------+-----------+------------+--------------------+--------+--------------------------+-------------------+\n+----------------------------+-----------------+---------+-----------------+---------+--------+-----------------------+--------+-----------+------------+-----------+------------+--------------------+--------+--------------------------+-------------------+\n|          ENDPOINT          |       ID        | VERSION | STORAGE VERSION | DB SIZE | IN USE | PERCENTAGE NOT IN USE | QUOTA  | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | DOWNGRADE TARGET VERSION | DOWNGRADE ENABLED |\n+----------------------------+-----------------+---------+-----------------+---------+--------+-----------------------+--------+-----------+------------+-----------+------------+--------------------+--------+--------------------------+-------------------+\n| https://192.168.1.2:2379   | 18e1b1602639adb |   3.6.4 |           3.6.0 |   37 MB |  28 MB |                   25% | 8.6 GB |     false |      false |       269 |    6582307 |            6582307 |        |                          |             false |\n+----------------------------+-----------------+---------+-----------------+---------+--------+-----------------------+--------+-----------+------------+-----------+------------+--------------------+--------+--------------------------+-------------------+\n+----------------------------+------------------+---------+-----------------+---------+--------+-----------------------+--------+-----------+------------+-----------+------------+--------------------+--------+--------------------------+-------------------+\n|          ENDPOINT          |        ID        | VERSION | STORAGE VERSION | DB SIZE | IN USE | PERCENTAGE NOT IN USE | QUOTA  | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | DOWNGRADE TARGET VERSION | DOWNGRADE ENABLED |\n+----------------------------+------------------+---------+-----------------+---------+--------+-----------------------+--------+-----------+------------+-----------+------------+--------------------+--------+--------------------------+-------------------+\n| https://192.168.1.3:2379   | 3d375f7546465b4e |   3.6.4 |           3.6.0 |   37 MB |  28 MB |                   26% | 8.6 GB |     false |      false |       269 |    6582308 |            6582308 |        |                          |             false |\n+----------------------------+------------------+---------+-----------------+---------+--------+-----------------------+--------+-----------+------------+-----------+------------+--------------------+--------+--------------------------+-------------------+\n```\n\n- 所有节点可达：etcdctl endpoint health 对所有三个节点都返回 healthy。\n- 有且仅有一个领导者：etcdctl endpoint status 显示一个节点 is leader: true，另外两个节点 is leader: false。\n- Raft 任期一致：所有三个节点的 raft term 值完全相同。\n- Raft 索引同步：所有节点的 raft index 值相差不大（跟随者与领导者的差距在可接受范围内）。\n- 无活跃告警：etcdctl alarm list 返回空。\n- 节点间网络稳定：没有频繁的领导者切换（通过监控 etcd_server_leader_changes_seen_total 指标）。\n- 磁盘空间充足：没有 NOSPACE 告警，且磁盘使用率在安全阈值内（例如低于80%）。\n\n### 磁盘性能\n\n快速的磁盘是 etcd 部署性能和稳定性的最关键因素。\n\n磁盘速度慢会增加 etcd 请求延迟，并可能损害集群稳定性。由于 etcd 的共识协议依赖于将元数据持久地存储到日志中，因此大多数 etcd 集群成员必须将每个请求写入磁盘。此外，etcd 还会逐步将其状态检查点写入磁盘，以便截断此日志。如果这些写入耗时过长，心跳可能会超时并触发选举，从而损害集群的稳定性。通常，要判断磁盘速度是否足以满足 etcd 的要求，可以使用fio等基准测试工具。\n\netcd 对磁盘写入延迟非常敏感。通常需要 50 的顺序 IOPS（例如，7200 RPM 磁盘）。对于负载较重的集群，建议使用 500 的顺序 IOPS（例如，典型的本地 SSD 或高性能虚拟化块设备）。请注意，大多数云提供商发布的是并发 IOPS，而不是顺序 IOPS；发布的并发 IOPS 可能比顺序 IOPS 高出 10 倍。要测量实际的顺序 IOPS，我们建议使用磁盘基准测试工具，例如diskbench或fio。\n\n``` bash\n# 测试示例\nmkdir test-data\nfio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest\n```\n\n\n\n[后一篇](03-container_runtime.md)\n"
  },
  {
    "path": "docs/setup/03-container_runtime.md",
    "content": "# 03-安装容器运行时\n\n项目根据k8s版本提供不同的默认容器运行时：\n\n- k8s 版本 < 1.24 时，支持docker containerd 可选\n- k8s 版本 >= 1.24 时，仅支持 containerd\n\n## 安装containerd\n\n作为 CNCF 毕业项目，containerd 致力于提供简洁、可靠、可扩展的容器运行时；它被设计用来集成到 kubernetes 等系统使用，而不是像 docker 那样独立使用。\n\n- 安装指南 https://github.com/containerd/cri/blob/master/docs/installation.md\n- 客户端 circtl 使用指南 https://github.com/containerd/cri/blob/master/docs/crictl.md\n- man 文档 https://github.com/containerd/containerd/tree/master/docs/man\n\n## kubeasz 集成安装 containerd\n\n- 注意：k8s 1.24以后，项目已经设置默认容器运行时为 containerd，无需手动修改\n- 执行安装：分步安装`ezctl setup xxxx 03`，一键安装`ezctl setup xxxx all`\n\n## 命令对比\n\n|命令           |docker         |crictl（推荐） |ctr                    |\n|:-             |:-             |:-             |:-                     |\n|查看容器列表   |docker ps      |crictl ps      |ctr -n k8s.io c ls     |\n|查看容器详情   |docker inspect |crictl inspect |ctr -n k8s.io c info   |\n|查看容器日志   |docker logs    |crictl logs    |无                     |\n|容器内执行命令 |docker exec    |crictl exec    |无                     |\n|挂载容器       |docker attach  |crictl attach  |无                     |\n|容器资源使用   |docker stats   |crictl stats   |无                     |\n|创建容器       |docker create  |crictl create  |ctr -n k8s.io c create |\n|启动容器       |docker start   |crictl start   |ctr -n k8s.io run      |\n|停止容器       |docker stop    |crictl stop    |无                     |\n|删除容器       |docker rm      |crictl rm      |ctr -n k8s.io c del    |\n|查看镜像列表   |docker images  |crictl images  |ctr -n k8s.io i ls     |\n|查看镜像详情   |docker inspect |crictl inspecti|无                     |\n|拉取镜像       |docker pull    |crictl pull    |ctr -n k8s.io i pull   |\n|推送镜像       |docker push    |无             |ctr -n k8s.io i push   |\n|删除镜像       |docker rmi     |crictl rmi     |ctr -n k8s.io i rm     |\n|查看Pod列表    |无             |crictl pods    |无                     |\n|查看Pod详情    |无             |crictl inspectp|无                     |\n|启动Pod        |无             |crictl runp    |无                     |\n|停止Pod        |无             |crictl stopp   |无                     |\n\n\n[后一篇](04-install_kube_master.md)\n"
  },
  {
    "path": "docs/setup/04-install_kube_master.md",
    "content": "# 04-安装kube_master节点\n\n部署master节点主要包含三个组件`apiserver` `scheduler` `controller-manager`，其中：\n\n- apiserver提供集群管理的REST API接口，包括认证授权、数据校验以及集群状态变更等\n  - 只有API Server才直接操作etcd\n  - 其他模块通过API Server查询或修改数据\n  - 提供其他模块之间的数据交互和通信的枢纽\n- scheduler负责分配调度Pod到集群内的node节点\n  - 监听kube-apiserver，查询还未分配Node的Pod\n  - 根据调度策略为这些Pod分配节点\n- controller-manager由一系列的控制器组成，它通过apiserver监控整个集群的状态，并确保集群处于预期的工作状态\n\n## 高可用机制\n\n- apiserver 无状态服务，可以通过外部负载均衡实现高可用，如项目采用的两种高可用架构：HA-1x (#584)和 HA-2x (#585)\n- controller-manager 组件启动时会进行类似选举（leader）；当多副本存在时，如果原先leader挂掉，那么会选举出新的leader，从而保证高可用；\n- scheduler 类似选举机制\n\n## 安装流程\n\n``` bash\ncat playbooks/04.kube-master.yml\n- hosts: kube_master\n  roles:\n  - kube-lb        # 四层负载均衡，监听在127.0.0.1:6443，转发到真实master节点apiserver服务\n  - kube-master    #\n  - kube-node      # 因为网络、监控等daemonset组件，master节点也推荐安装kubelet和kube-proxy服务\n  ... \n```\n\n### 创建 kubernetes 证书签名请求\n\n``` bash\n{\n  \"CN\": \"kubernetes\",\n  \"hosts\": [\n    \"127.0.0.1\",\n{% if groups['ex_lb']|length > 0 %}\n    \"{{ hostvars[groups['ex_lb'][0]]['EX_APISERVER_VIP'] }}\",\n{% endif %}\n{% for host in groups['kube_master'] %}\n    \"{{ host }}\",\n{% endfor %}\n    \"{{ CLUSTER_KUBERNETES_SVC_IP }}\",\n{% for host in MASTER_CERT_HOSTS %}\n    \"{{ host }}\",\n{% endfor %}\n    \"kubernetes\",\n    \"kubernetes.default\",\n    \"kubernetes.default.svc\",\n    \"kubernetes.default.svc.cluster\",\n    \"kubernetes.default.svc.cluster.local\"\n  ],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n```\nkubernetes apiserver 使用对等证书，创建时hosts字段需要配置：\n- 如果配置 ex_lb，需要把 EX_APISERVER_VIP 也配置进去\n- 如果需要外部访问 apiserver，可选在config.yml配置 MASTER_CERT_HOSTS\n- `kubectl get svc` 将看到集群中由api-server 创建的默认服务 `kubernetes`，因此也要把 `kubernetes` 服务名和各个服务域名也添加进去\n\n### 创建apiserver的服务配置文件\n\n``` bash\n[Unit]\nDescription=Kubernetes API Server\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\nAfter=network.target\n\n[Service]\nExecStart={{ bin_dir }}/kube-apiserver \\\n  --allow-privileged=true \\\n  --anonymous-auth=false \\\n  --api-audiences=api,istio-ca \\\n  --authorization-mode=Node,RBAC \\\n  --bind-address={{ inventory_hostname }} \\\n  --client-ca-file={{ ca_dir }}/ca.pem \\\n  --endpoint-reconciler-type=lease \\\n  --etcd-cafile={{ ca_dir }}/ca.pem \\\n  --etcd-certfile={{ ca_dir }}/kubernetes.pem \\\n  --etcd-keyfile={{ ca_dir }}/kubernetes-key.pem \\\n  --etcd-servers={{ ETCD_ENDPOINTS }} \\\n  --kubelet-certificate-authority={{ ca_dir }}/ca.pem \\\n  --kubelet-client-certificate={{ ca_dir }}/kubernetes.pem \\\n  --kubelet-client-key={{ ca_dir }}/kubernetes-key.pem \\\n  --secure-port={{ SECURE_PORT }} \\\n  --service-account-issuer=https://kubernetes.default.svc \\\n  --service-account-signing-key-file={{ ca_dir }}/ca-key.pem \\\n  --service-account-key-file={{ ca_dir }}/ca.pem \\\n  --service-cluster-ip-range={{ SERVICE_CIDR }} \\\n  --service-node-port-range={{ NODE_PORT_RANGE }} \\\n  --tls-cert-file={{ ca_dir }}/kubernetes.pem \\\n  --tls-private-key-file={{ ca_dir }}/kubernetes-key.pem \\\n  --requestheader-client-ca-file={{ ca_dir }}/ca.pem \\\n  --requestheader-allowed-names= \\\n  --requestheader-extra-headers-prefix=X-Remote-Extra- \\\n  --requestheader-group-headers=X-Remote-Group \\\n  --requestheader-username-headers=X-Remote-User \\\n  --proxy-client-cert-file={{ ca_dir }}/aggregator-proxy.pem \\\n  --proxy-client-key-file={{ ca_dir }}/aggregator-proxy-key.pem \\\n  --enable-aggregator-routing=true \\\n  --v=2\nRestart=always\nRestartSec=5\nType=notify\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target\n```\n+ Kubernetes 对 API 访问需要依次经过认证、授权和准入控制(admission controll)，认证解决用户是谁的问题，授权解决用户能做什么的问题，Admission Control则是资源管理方面的作用。\n+ 关于authorization-mode=Node,RBAC v1.7+支持Node授权，配合NodeRestriction准入控制来限制kubelet仅可访问node、endpoint、pod、service以及secret、configmap、PV和PVC等相关的资源；需要注意的是v1.7中Node 授权是默认开启的，v1.8中需要显式配置开启，否则 Node无法正常工作\n+ 详细参数配置请参考`kube-apiserver --help`，关于认证、授权和准入控制请[阅读](https://github.com/feiskyer/kubernetes-handbook/blob/master/components/apiserver.md)\n+ 增加了访问kubelet使用的证书配置，防止匿名访问kubelet的安全漏洞，详见[漏洞说明](../mixes/01.fix_kubelet_annoymous_access.md)\n\n### 创建controller-manager 的服务文件\n\n``` bash\n[Unit]\nDescription=Kubernetes Controller Manager\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\n\n[Service]\nExecStart={{ bin_dir }}/kube-controller-manager \\\n  --allocate-node-cidrs=true \\\n  --authentication-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\\n  --authorization-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\\n  --bind-address=0.0.0.0 \\\n  --cluster-cidr={{ CLUSTER_CIDR }} \\\n  --cluster-name=kubernetes \\\n  --cluster-signing-cert-file={{ ca_dir }}/ca.pem \\\n  --cluster-signing-key-file={{ ca_dir }}/ca-key.pem \\\n  --kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\\n  --leader-elect=true \\\n  --node-cidr-mask-size={{ NODE_CIDR_LEN }} \\\n  --root-ca-file={{ ca_dir }}/ca.pem \\\n  --service-account-private-key-file={{ ca_dir }}/ca-key.pem \\\n  --service-cluster-ip-range={{ SERVICE_CIDR }} \\\n  --use-service-account-credentials=true \\\n  --v=2\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n```\n+ --cluster-cidr 指定 Cluster 中 Pod 的 CIDR 范围，该网段在各 Node 间必须路由可达(flannel/calico 等网络插件实现)\n+ --service-cluster-ip-range 参数指定 Cluster 中 Service 的CIDR范围，必须和 kube-apiserver 中的参数一致\n+ --cluster-signing-* 指定的证书和私钥文件用来签名为 TLS BootStrap 创建的证书和私钥\n+ --root-ca-file 用来对 kube-apiserver 证书进行校验，指定该参数后，才会在Pod 容器的 ServiceAccount 中放置该 CA 证书文件\n+ --leader-elect=true 使用多节点选主的方式选择主节点。只有主节点才会启动所有控制器，而其他从节点则仅执行选主算法\n\n### 创建scheduler 的服务文件\n\n``` bash\n[Unit]\nDescription=Kubernetes Scheduler\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\n\n[Service]\nExecStart={{ bin_dir }}/kube-scheduler \\\n  --authentication-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \\\n  --authorization-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \\\n  --bind-address=0.0.0.0 \\\n  --kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \\\n  --leader-elect=true \\\n  --v=2\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n```\n\n+ --leader-elect=true 部署多台机器组成的 master 集群时选举产生一个处于工作状态的 kube-controller-manager 进程\n\n### 在master 节点安装 node 服务: kubelet kube-proxy \n\n项目master 分支使用 DaemonSet 方式安装网络插件，如果master 节点不安装 kubelet 服务是无法安装网络插件的，如果 master 节点不安装网络插件，那么通过`apiserver` 方式无法访问 `dashboard` `kibana`等管理界面，[ISSUES #130](https://github.com/easzlab/kubeasz/issues/130)\n\n在master 节点也同时成为 node 节点后，默认业务 POD也会调度到 master节点；可以使用 `kubectl cordon`命令禁止业务 POD调度到 master节点。\n\n### master 集群的验证\n\n运行 `ansible-playbook 04.kube-master.yml` 成功后，验证 master节点的主要组件：\n\n``` bash\n# 查看进程状态\nsystemctl status kube-apiserver\nsystemctl status kube-controller-manager\nsystemctl status kube-scheduler\n# 查看进程运行日志\njournalctl -u kube-apiserver\njournalctl -u kube-controller-manager\njournalctl -u kube-scheduler\n```\n执行 `kubectl get componentstatus` 可以看到\n\n``` bash\nNAME                 STATUS    MESSAGE              ERROR\nscheduler            Healthy   ok                   \ncontroller-manager   Healthy   ok                   \netcd-0               Healthy   {\"health\": \"true\"}   \netcd-2               Healthy   {\"health\": \"true\"}   \netcd-1               Healthy   {\"health\": \"true\"} \n```\n\n[后一篇](05-install_kube_node.md)\n"
  },
  {
    "path": "docs/setup/05-install_kube_node.md",
    "content": "## 05-安装kube_node节点\n\n`kube_node` 是集群中运行工作负载的节点，前置条件需要先部署好`kube_master`节点，它需要部署如下组件：\n\n``` bash\ncat playbooks/05.kube-node.yml\n- hosts: kube_node\n  roles:\n  - { role: kube-lb, when: \"inventory_hostname not in groups['kube_master']\" }\n  - { role: kube-node, when: \"inventory_hostname not in groups['kube_master']\" }\n```\n\n+ kube-lb：由nginx裁剪编译的四层负载均衡，用于将请求转发到主节点的 apiserver服务\n+ kubelet：kube_node上最主要的组件\n+ kube-proxy： 发布应用服务与负载均衡\n\n### 创建cni 基础网络插件配置文件\n\n因为后续需要用 `DaemonSet Pod`方式运行k8s网络插件，所以kubelet.server服务必须开启cni相关参数，并且提供cni网络配置文件\n\n### 创建 kubelet 的服务文件\n\n+ 根据官方建议独立使用 kubelet 配置文件，详见roles/kube-node/templates/kubelet-config.yaml.j2\n+ 必须先创建工作目录 `/var/lib/kubelet`\n\n``` bash\n[Unit]\nDescription=Kubernetes Kubelet\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\n\n[Service]\nWorkingDirectory=/var/lib/kubelet\nExecStartPre=/bin/mount -o remount,rw '/sys/fs/cgroup'\n{% if KUBE_RESERVED_ENABLED == \"yes\" or SYS_RESERVED_ENABLED == \"yes\" %}\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpu/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuacct/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/systemd/podruntime.slice\n\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpu/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuacct/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/systemd/system.slice\n\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice\n{% endif %}\nExecStart={{ bin_dir }}/kubelet \\\n  --config=/var/lib/kubelet/config.yaml \\\n  --container-runtime-endpoint=unix:///run/containerd/containerd.sock \\\n  --hostname-override={{ K8S_NODENAME }} \\\n  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\\n  --root-dir={{ KUBELET_ROOT_DIR }} \\\n  --v=2\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n```\n+ --ExecStartPre=/bin/mkdir -p xxx 对于某些系统（centos7）cpuset和hugetlb 是默认没有初始化system.slice 的，需要手动创建，否则在启用--kube-reserved-cgroup 时会报错Failed to start ContainerManager Failed to enforce System Reserved Cgroup Limits\n+ 关于kubelet资源预留相关配置请参考 https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/\n\n### 创建 kube-proxy kubeconfig 文件\n\n该步骤已经在 deploy节点完成，[roles/deploy/tasks/main.yml](../../roles/deploy/tasks/main.yml)\n\n+ 生成的kube-proxy.kubeconfig 配置文件需要移动到/etc/kubernetes/目录，后续kube-proxy服务启动参数里面需要指定\n\n### 创建 kube-proxy服务文件\n\n``` bash\n[Unit]\nDescription=Kubernetes Kube-Proxy Server\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\nAfter=network.target\n\n[Service]\nWorkingDirectory=/var/lib/kube-proxy\nExecStart={{ bin_dir }}/kube-proxy \\\n  --config=/var/lib/kube-proxy/kube-proxy-config.yaml\nRestart=always\nRestartSec=5\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target\n```\n\n请注意 [kube-proxy-config](../../roles/kube-node/templates/kube-proxy-config.yaml.j2) 文件的注释说明\n\n### 验证 node 状态\n\n``` bash\nsystemctl status kubelet\t# 查看状态\nsystemctl status kube-proxy\njournalctl -u kubelet\t\t# 查看日志\njournalctl -u kube-proxy \n```\n运行 `kubectl get node` 可以看到类似\n\n``` bash\nNAME           STATUS    ROLES     AGE       VERSION\n192.168.1.42   Ready     <none>    2d        v1.9.0\n192.168.1.43   Ready     <none>    2d        v1.9.0\n192.168.1.44   Ready     <none>    2d        v1.9.0\n```\n\n\n[后一篇](06-install_network_plugin.md)\n"
  },
  {
    "path": "docs/setup/06-install_network_plugin.md",
    "content": "## 06-安装网络组件\n\n首先回顾下K8S网络设计原则，在配置集群网络插件或者实践K8S 应用/服务部署请牢记这些原则：\n\n- 1.每个Pod都拥有一个独立IP地址，Pod内所有容器共享一个网络命名空间\n- 2.集群内所有Pod都在一个直接连通的扁平网络中，可通过IP直接访问\n  - 所有容器之间无需NAT就可以直接互相访问\n  - 所有Node和所有容器之间无需NAT就可以直接互相访问\n  - 容器自己看到的IP跟其他容器看到的一样\n- 3.Service cluster IP只可在集群内部访问，外部请求需要通过NodePort、LoadBalance或者Ingress来访问\n\n`Container Network Interface (CNI)`是目前CNCF主推的网络模型，它由两部分组成：\n\n- CNI Plugin负责给容器配置网络，它包括两个基本的接口\n  - 配置网络: AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error)\n  - 清理网络: DelNetwork(net *NetworkConfig, rt *RuntimeConf) error\n- IPAM Plugin负责给容器分配IP地址\n\nKubernetes Pod的网络是这样创建的：\n- 0. 每个Pod除了创建时指定的容器外，都有一个kubelet启动时指定的`基础容器`，即`pause`容器 \n- 1. kubelet创建`基础容器`生成network namespace\n- 2. kubelet调用网络CNI driver，由它根据配置调用具体的CNI 插件\n- 3. CNI 插件给`基础容器`配置网络\n- 4. Pod 中其他的容器共享使用`基础容器`的网络\n\n本项目基于CNI driver 调用各种网络插件来配置kubernetes的网络，常用CNI插件有 `flannel` `calico` `cilium`等等，这些插件各有优势，也在互相借鉴学习优点，比如：在所有node节点都在一个二层网络时候，flannel提供hostgw实现，避免vxlan实现的udp封装开销，估计是目前最高效的；calico也针对L3 Fabric，推出了IPinIP的选项，利用了GRE隧道封装；因此这些插件都能适合很多实际应用场景。\n\n项目当前内置支持的网络插件有：`calico` `cilium` `flannel` `kube-ovn` `kube-router`\n\n### 安装讲解\n\n- [安装calico](network-plugin/calico.md)\n- [安装cilium](network-plugin/cilium.md)  \n- [安装flannel](network-plugin/flannel.md)\n- [安装kube-ovn](network-plugin/kube-ovn.md) 暂未更新\n- [安装kube-router](network-plugin/kube-router.md) 暂未更新\n\n### 参考\n- [kubernetes.io networking docs](https://kubernetes.io/docs/concepts/cluster-administration/networking/) \n- [feiskyer-kubernetes指南网络章节](https://github.com/feiskyer/kubernetes-handbook/blob/master/zh/network/network.md)\n\n\n[后一篇](07-install_cluster_addon.md)\n"
  },
  {
    "path": "docs/setup/07-install_cluster_addon.md",
    "content": "# 07-安装集群主要插件\n\n目前挑选一些常用、必要的插件自动集成到安装脚本之中:  \n\n## 集群默认安装\n\n- [coredns](../guide/kubedns.md)\n- [nodelocaldns](../guide/kubedns.md)\n- [metrics-server](../guide/metrics-server.md)\n- [dashboard](../guide/dashboard.md)\n\nkubeasz 默认安装上述基础插件，并支持离线方式安装(./ezdown -D 命令会自动下载组件镜像，并推送到本地镜像仓库easzlab.io.local:5000)\n\n## 集群可选安装\n\n- [prometheus](../guide/prometheus.md)\n- [network_check](network-plugin/network-check.md)\n- [nfs_provisioner]()\n\nkubeasz 默认不安装上述插件，可以在配置文件(clusters/xxx/config.yml)中开启，支持离线方式安装(./ezdown -X 会额外下载这些组件镜像，并推送到本地镜像仓库easzlab.io.local:5000)\n\n## 安装脚本\n\n详见`roles/cluster-addon/` 目录\n\n- 1.根据hosts文件中配置的`CLUSTER_DNS_SVC_IP` `CLUSTER_DNS_DOMAIN`等参数生成kubedns.yaml和coredns.yaml文件\n- 2.注册变量pod_info，pod_info用来判断现有集群是否已经运行各种插件\n- 3.根据pod_info和`配置开关`逐个进行/跳过插件安装\n\n## 下一步\n\n- [创建ex_lb节点组](ex-lb.md), 向集群外提供高可用apiserver\n- [创建集群持久化存储](08-cluster-storage.md)\n"
  },
  {
    "path": "docs/setup/08-cluster-storage.md",
    "content": "# K8S 集群存储 \n\n## 前言\n在kubernetes(k8s)中对于存储的资源抽象了两个概念，分别是PersistentVolume(PV)、PersistentVolumeClaim(PVC)。\n- PV是集群中的资源\n- PVC是对这些资源的请求。\n\n如上面所说PV和PVC都只是抽象的概念，在k8s中是通过插件的方式提供具体的存储实现。目前包含有NFS、iSCSI和云提供商指定的存储系统，更多的存储实现[参考官方文档](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes)。\n\n以下介绍两种`provisioner`, 可以提供静态或者动态的PV\n\n- [nfs-provisioner](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner): NFS存储目录供应者\n- [local-path-provisioner](https://github.com/rancher/local-path-provisioner): 本地存储目录供应者\n\n## NFS存储目录供应者\n\n首先我们需要一个NFS服务器，用于提供底层存储。通过文档[nfs-server](../guide/nfs-server.md)，我们可以创建一个NFS服务器。\n\n### 静态 PV\n- 创建静态 pv，指定容量，访问模式，回收策略，存储类等\n\n``` bash\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: pv-es-0\nspec:\n  capacity:\n    storage: 4Gi\n  accessModes:\n    - ReadWriteMany\n  volumeMode: Filesystem\n  persistentVolumeReclaimPolicy: Recycle\n  storageClassName: \"es-storage-class\"\n  nfs:\n    # 根据实际共享目录修改\n    path: /share/es0\n    # 根据实际 nfs服务器地址修改\n    server: 192.168.1.208\n```\n- 创建 pvc即可绑定使用上述 pv了，具体请看后文 test pod例子\n\n### 创建动态PV\n\n在一个工作k8s 集群中，`PVC`请求会很多，如果每次都需要管理员手动去创建对应的 `PV`资源，那就很不方便；因此 K8S还提供了多种 `provisioner`来动态创建 `PV`，不仅节省了管理员的时间，还可以根据`StorageClasses`封装不同类型的存储供 PVC 选用。\n\n项目中以nfs-client-provisioner为例 https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner\n\n- 1.编辑集群配置文件：clusters/${集群名}/config.yml\n\n``` bash\n... 省略\n# 在role:cluster-addon 中启用nfs-provisioner 安装\nnfs_provisioner_install: \"yes\"\t\t\t# 修改为yes\nnfs_provisioner_namespace: \"kube-system\"\nnfs_provisioner_ver: \"v4.0.1\"\nnfs_storage_class: \"managed-nfs-storage\"\t\nnfs_server: \"192.168.31.244\"\t\t\t# 修改为实际nfs server地址\nnfs_path: \"/data/nfs\"\t\t\t\t# 修改为实际的nfs共享目录\n\n```\n\n- 2.创建 nfs provisioner\n\n``` bash\n$ dk ezctl setup ${集群名} 07 \n\n# 执行成功后验证\n$ kubectl get pod --all-namespaces |grep nfs-client\nkube-system   nfs-client-provisioner-84ff87c669-ksw95      1/1     Running     0          21m\n```\n\n- 3.验证使用动态 PV\n\n在目录clusters/${集群名}/yml/nfs-provisioner/ 有个测试例子\n\n``` bash\n$ kubectl apply -f /etc/kubeasz/clusters/hello/yml/nfs-provisioner/test-pod.yaml\n\n# 验证测试pod\nkubectl get pod\nNAME       READY   STATUS      RESTARTS   AGE\ntest-pod   0/1     Completed   0          6h36m\n\n# 验证自动创建的pv 资源，\nkubectl get pv\nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGE\npvc-44d34a50-e00b-4f6c-8005-40f5cc54af18   2Mi        RWX            Delete           Bound    default/test-claim   managed-nfs-storage            6h36m\n\n# 验证PVC已经绑定成功：STATUS字段为 Bound\nkubectl get pvc\nNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE\ntest-claim   Bound    pvc-44d34a50-e00b-4f6c-8005-40f5cc54af18   2Mi        RWX            managed-nfs-storage   6h37m\n```\n\n另外，Pod启动完成后，在挂载的目录中创建一个`SUCCESS`文件。我们可以到NFS服务器去看下：\n\n```\n.\n└── default-test-claim-pvc-44d34a50-e00b-4f6c-8005-40f5cc54af18\n    └── SUCCESS\n```\n如上，可以发现挂载的时候，nfs-client根据PVC自动创建了一个目录，我们Pod中挂载的`/mnt`，实际引用的就是该目录，而我们在`/mnt`下创建的`SUCCESS`文件，也自动写入到了这里。\n\n后面当我们需要为上层应用提供持久化存储时，只需要提供`StorageClass`即可。很多应用都会根据`StorageClass`来创建他们的所需的PVC, 最后再把PVC挂载到他们的Deployment或StatefulSet中使用，比如：efk、jenkins等\n\n## 本地存储目录供应者\n\n当应用对于磁盘I/O性能要求高，比较适合本地文件目录存储，特别地可以本地挂载SSD磁盘（注意本地磁盘需要配置raid冗余策略）。Local Path Provisioner 可以方便地在k8s集群中使用本地文件目录存储。\n\n在kubeasz项目中集成安装\n\n- 1.编辑集群配置文件：clusters/${集群名}/config.yml\n\n``` bash\n... 省略\nlocal_path_provisioner_install: \"yes\" # 修改为yes\n# 设置默认本地存储路径\nlocal_path_provisioner_dir: \"/opt/local-path-provisioner\"\n```\n\n- 2.创建 local path provisioner\n\n``` bash\n$ dk ezctl setup ${集群名} 07\n\n# 执行成功后验证\n$ kubectl get pod --all-namespaces |grep provisioner\n```\n\n- 3.验证使用（略）\n"
  },
  {
    "path": "docs/setup/config_guide.md",
    "content": "# 个性化集群参数配置\n\n`kubeasz`创建集群主要在以下两个地方进行配置：(假设集群名xxxx)\n\n- clusters/xxxx/hosts 文件（模板在example/hosts.multi-node）：集群主要节点定义和主要参数配置、全局变量\n- clusters/xxxx/config.yml（模板在examples/config.yml）：其他参数配置或者部分组件附加参数\n\n## clusters/xxxx/hosts (ansible hosts)\n\n如[集群规划与安装概览](00-planning_and_overall_intro.md)中介绍，主要包括集群节点定义和集群范围的主要参数配置\n\n- 尽量保持配置简单灵活\n- 尽量保持配置项稳定\n\n常用设置项：\n\n- 修改容器运行时: CONTAINER_RUNTIME=\"containerd\"\n- 修改集群网络插件：CLUSTER_NETWORK=\"calico\"\n- 修改容器网络地址：CLUSTER_CIDR=\"192.168.0.0/16\"\n- 修改NodePort范围：NODE_PORT_RANGE=\"30000-32767\"\n\n## clusters/xxxx/config.yml\n\n主要包括集群某个具体组件的个性化配置，具体组件的配置项可能会不断增加；可以在不做任何配置更改情况下使用默认值创建集群\n\n根据实际需要配置 k8s 集群，常用举例\n\n- 配置使用离线安装系统包：INSTALL_SOURCE: \"offline\" （需要ezdown -P 下载离线系统软件）\n- 配置CA证书以及其签发证书的有效期\n- 配置 apiserver 支持公网域名：MASTER_CERT_HOSTS\n- 配置 cluster-addon 组件安装\n- ...\n"
  },
  {
    "path": "docs/setup/ex-lb.md",
    "content": "## EX-LB 负载均衡部署\n\n根据[HA 2x架构](00-planning_and_overall_intro.md)，k8s集群自身高可用已经不依赖于外部 lb 服务；但是有时我们要从外部访问 apiserver（比如 CI 流程），就需要 ex_lb 来请求多个 apiserver；\n\n还有一种情况是需要[负载转发到ingress服务](../op/loadballance_ingress_nodeport.md)，也需要部署ex_lb；\n\n**注意：当遇到公有云环境无法自建 ex_lb 服务时，可以配置对应的云负载均衡服务**\n\n### ex_lb 服务组件\n\n更新：kubeasz 3.0.2 重写了ex-lb服务安装，利用最小化依赖编译安装的二进制文件，不依赖于linux发行版；优点是可以统一版本和简化离线安装部署，并且理论上能够支持更多linux发行版\n\n\nex_lb 服务由 keepalived 和 l4lb 组成：\n- l4lb：是一个精简版（仅支持四层转发）的nginx编译二进制版本\n- keepalived：利用主备节点vrrp协议通信和虚拟地址，消除l4lb的单点故障；keepalived保持存活，它是基于VRRP协议保证所谓的高可用或热备的，这里用来预防l4lb的单点故障。\n\nkeepalived与l4lb配合，实现master的高可用过程如下：\n\n+ 1.keepalived利用vrrp协议生成一个虚拟地址(VIP)，正常情况下VIP存活在keepalive的主节点，当主节点故障时，VIP能够漂移到keepalived的备节点，保障VIP地址高可用性。\n+ 2.在keepalived的主备节点都配置相同l4lb负载配置，并且监听客户端请求在VIP的地址上，保障随时都有一个l4lb负载均衡在正常工作。并且keepalived启用对l4lb进程的存活检测，一旦主节点l4lb进程故障，VIP也能切换到备节点，从而让备节点的l4lb进行负载工作。\n+ 3.在l4lb的配置中配置多个后端真实kube-apiserver的endpoints，并启用存活监测后端kube-apiserver，如果一个kube-apiserver故障，l4lb会将其剔除负载池。\n\n#### 安装l4lb\n\n#### 配置l4lb (roles/ex-lb/templates/l4lb.conf.j2)\n\n配置由全局配置和三个upstream servers配置组成：\n- apiservers 用于转发至多个apiserver\n- ingress-nodes 用于转发至node节点的ingress http服务，[参阅](../op/loadballance_ingress_nodeport.md)\n- ingress-tls-nodes 用于转发至node节点的ingress https服务\n\n#### 安装keepalived\n\n#### 配置keepalived主节点 [keepalived-master.conf.j2](../../roles/ex-lb/templates/keepalived-master.conf.j2)\n\n``` bash\nglobal_defs {\n}\n\nvrrp_track_process check-l4lb {\n    process l4lb\n    weight -60\n    delay 3\n}\n\nvrrp_instance VI-01 {\n    state MASTER\n    priority 120\n    unicast_src_ip {{ inventory_hostname }}\n    unicast_peer {\n{% for h in groups['ex_lb'] %}{% if h != inventory_hostname %}\n        {{ h }}\n{% endif %}{% endfor %}\n    }\n    dont_track_primary\n    interface {{ LB_IF }}\n    virtual_router_id {{ ROUTER_ID }}\n    advert_int 3\n    track_process {\n        check-l4lb\n    }\n    virtual_ipaddress {\n        {{ EX_APISERVER_VIP }}\n    }\n}\n```\n+ vrrp_track_process 定义了监测l4lb进程是否存活，如果进程不存在，根据`weight -60`设置将主节点优先级降低60，这样原先备节点将变成主节点。\n+ vrrp_instance 定义了vrrp组，包括优先级、使用端口、router_id、心跳频率、检测脚本、虚拟地址VIP等\n+ 特别注意 `virtual_router_id` 标识了一个 VRRP组，在同网段下必须唯一，否则出现 `Keepalived_vrrp: bogus VRRP packet received on eth0 !!!`类似报错\n+ 配置 vrrp 协议通过单播发送\n\n#### 配置keepalived备节点 [keepalived-backup.conf.j2](../../roles/ex-lb/templates/keepalived-backup.conf.j2)\n\n+ 备节点的配置类似主节点，除了优先级和检测脚本，其他如 `virtual_router_id` `advert_int` `virtual_ipaddress`必须与主节点一致\n\n### 启动 keepalived 和 l4lb 后验证\n\n+ lb 节点验证\n\n``` bash\nsystemctl status l4lb \t# 检查进程状态\njournalctl -u l4lb\t\t# 检查进程日志是否有报错信息\nsystemctl status keepalived \t# 检查进程状态\njournalctl -u keepalived\t# 检查进程日志是否有报错信息\n```\n+ 在 keepalived 主节点\n\n``` bash\nip a\t\t\t\t# 检查 master的 VIP地址是否存在\n```\n### keepalived 主备切换演练\n\n1. 尝试关闭 keepalived主节点上的 l4lb进程，然后在keepalived 备节点上查看 master的 VIP地址是否能够漂移过来，并依次检查上一步中的验证项。\n1. 尝试直接关闭 keepalived 主节点系统，检查各验证项。\n\n"
  },
  {
    "path": "docs/setup/ezctl.md",
    "content": "# ezctl 命令行介绍\n\n## 为什么使用 ezctl\n\nkubeasz 项目使用ezctl 方便地创建和管理多个k8s 集群，ezctl 使用shell 脚本封装ansible-playbook 执行命令，它十分轻量、简单和易于扩展。\n\n### 使用帮助\n\n随时运行 ezctl 获取命令行提示信息，如下\n\n```\nUsage: ezctl COMMAND [args]\n-------------------------------------------------------------------------------------\nCluster setups:\n    list\t\t             to list all of the managed clusters\n    checkout    <cluster>            to switch default kubeconfig of the cluster\n    new         <cluster>            to start a new k8s deploy with name 'cluster'\n    setup       <cluster>  <step>    to setup a cluster, also supporting a step-by-step way\n    start       <cluster>            to start all of the k8s services stopped by 'ezctl stop'\n    stop        <cluster>            to stop all of the k8s services temporarily\n    upgrade     <cluster>            to upgrade the k8s cluster\n    destroy     <cluster>            to destroy the k8s cluster\n    backup      <cluster>            to backup the cluster state (etcd snapshot)\n    restore     <cluster>            to restore the cluster state from backups\n    start-aio\t\t             to quickly setup an all-in-one cluster with 'default' settings\n\nCluster ops:\n    add-etcd    <cluster>  <ip>      to add a etcd-node to the etcd cluster\n    add-master  <cluster>  <ip>      to add a master node to the k8s cluster\n    add-node    <cluster>  <ip>      to add a work node to the k8s cluster\n    del-etcd    <cluster>  <ip>      to delete a etcd-node from the etcd cluster\n    del-master  <cluster>  <ip>      to delete a master node from the k8s cluster\n    del-node    <cluster>  <ip>      to delete a work node from the k8s cluster\n\nExtra operation:\n    kcfg-adm    <cluster>  <args>    to manage client kubeconfig of the k8s cluster\n\nUse \"ezctl help <command>\" for more information about a given command.\n```\n\n- 命令集 1：集群安装相关操作\n  - 显示当前所有管理的集群\n  - 切换默认集群\n  - 创建新集群配置\n  - 安装新集群\n  - 启动临时停止的集群\n  - 临时停止某个集群（包括集群内运行的pod）\n  - 升级集群k8s组件版本\n  - 删除集群\n  - 备份集群（仅etcd数据，不包括pv数据和业务应用数据）\n  - 从备份中恢复集群\n  - 创建单机集群（类似 minikube）\n- 命令集 2：集群节点操作\n  - 增加 etcd 节点\n  - 增加主节点\n  - 增加工作节点\n  - 删除 etcd 节点\n  - 删除主节点\n  - 删除工作节点\n- 命令集3：额外操作\n  - 管理客户端kubeconfig\n\n#### 举例创建、安装新集群流程\n\n- 1.首先创建集群配置实例 \n\n``` bash\n~# ezctl new k8s-01\n2021-01-19 10:48:23 DEBUG generate custom cluster files in /etc/kubeasz/clusters/k8s-01\n2021-01-19 10:48:23 DEBUG set version of common plugins\n2021-01-19 10:48:23 DEBUG cluster k8s-01: files successfully created.\n2021-01-19 10:48:23 INFO next steps 1: to config '/etc/kubeasz/clusters/k8s-01/hosts'\n2021-01-19 10:48:23 INFO next steps 2: to config '/etc/kubeasz/clusters/k8s-01/config.yml'\n```\n然后根据提示配置'/etc/kubeasz/clusters/k8s-01/hosts' 和 '/etc/kubeasz/clusters/k8s-01/config.yml'；为方便测试我们在hosts里面设置单节点集群（etcd/kube_master/kube_node配置同一个节点，注意节点需先设置ssh免密码登陆）, config.yml 使用默认配置即可。\n\n- 2.然后开始安装集群\n\n``` bash\n# 一键安装\nezctl setup k8s-01 all\n\n# 或者分步安装，具体使用 ezctl help setup 查看分步安装帮助信息\n# ezctl setup k8s-01 01\n# ezctl setup k8s-01 02\n# ezctl setup k8s-01 03\n# ezctl setup k8s-01 04\n... \n```\n\n- 3.重复步骤1，2可以创建、管理多个k8s集群（建议ezctl使用独立的部署节点）\n\nezctl 创建管理的多集群拓扑如下\n\n```\n+----------------+               +-----------------+\n|ezctl 1.1.1.1   |               |cluster-aio:     |\n+--+---+---+-----+               |                 |\n   |   |   |                     |master 4.4.4.4   |\n   |   |   +-------------------->+etcd   4.4.4.4   |\n   |   |                         |node   4.4.4.4   |\n   |   +--------------+          +-----------------+\n   |                  |\n   v                  v\n+--+------------+ +---+----------------------------+\n| cluster-1:    | | cluster-2:                     |\n|               | |                                |\n| master 2.2.2.1| | master 3.3.3.1/3.3.3.2         |\n| etcd   2.2.2.2| | etcd   3.3.3.1/3.3.3.2/3.3.3.3 |\n| node   2.2.2.3| | node   3.3.3.4/3.3.3.5/3.3.3.6 |\n+---------------+ +--------------------------------+\n```\n\nThat's it! 赶紧动手测试吧，欢迎通过 Issues 和 PRs 反馈您的意见和建议！\n"
  },
  {
    "path": "docs/setup/kubeasz_on_public_cloud.md",
    "content": "# 公有云上部署 kubeasz\n\n在公有云上使用`kubeasz`部署`k8s`集群需要注意以下几个常见问题。\n\n### 安全组\n\n注意虚机的安全组规则配置，一般集群内部节点之间端口全部放开即可；\n\n### 网络组件\n\n一般公有云对网络限制较多，跨节点 pod 通讯需要使用 OVERLAY 添加报头；默认配置详见example/config.yml\n\n- flannel 使用 vxlan 模式：`FLANNEL_BACKEND: \"vxlan\"`\n- calico 开启 ipinip：`CALICO_IPV4POOL_IPIP: \"Always\"`\n- kube-router 开启 ipinip：`OVERLAY_TYPE: \"full\"`\n\n### 节点公网访问\n\n可以在安装时每个节点绑定`弹性公网地址`(EIP)，装完集群解绑；也可以开通NAT网关，或者利用iptables自建上网网关等方式\n\n### 负载均衡\n\n一般云厂商会限制使用`keepalived+haproxy`自建负载均衡，你可以根据云厂商文档使用云负载均衡（内网）四层TCP负载模式；\n\n- kubeasz 2x 版本已无需依赖外部负载均衡实现apiserver的高可用，详见 [2x架构](https://github.com/easzlab/kubeasz/blob/dev2/docs/setup/00-planning_and_overall_intro.md#ha-architecture)\n- kubeasz 1x 及以前版本需要负载均衡实现apiserver高可用，详见 [1x架构](https://github.com/easzlab/kubeasz/blob/dev1/docs/setup/00-planning_and_overall_intro.md#ha-architecture)\n\n### 时间同步\n\n一般云厂商提供的虚机都已默认安装时间同步服务，无需自行安装。 \n\n### 访问 APISERVER\n\n在公有云上安装完集群后，需要在公网访问集群 apiserver，而我们在安装前可能没有规划公网IP或者公网域名；而 apiserver 肯定需要 https 方式访问，在证书创建时需要加入公网ip/域名；可以参考这里[修改 APISERVER（MASTER）证书](../op/ch_apiserver_cert.md)\n\n## 在公有云上部署多主高可用集群\n\n处理好以上讨论的常见问题后，在公有云上使用 kubeasz 安装集群与自有环境没有差异。\n\n- 使用 kubeasz 2x 版本安装单节点、单主多节点、多主多节点 k8s 集群，云上云下的预期安装体验完全一致\n"
  },
  {
    "path": "docs/setup/mix_arch.md",
    "content": "# 混合架构集群部署\n\n混合架构集群本文是指集群中既有linux amd64架构机器，也有linux arm64架构机器；这里只记录一个简单的操作说明，实际操作注意风险。\n\n## 部署思路\n\n1. 先选定一台amd64架构的机器做“amd64部署机”，使用它先部署amd64架构的集群\n2. 选一台arm64架构的机器做“arm64部署机”，复制amd64部署机的/etc/kubeasz目录文件（除去目录中的bin、down子目录），然后重新下载arm64架构的二进制和镜像，然后添加arm64节点到原有集群即可\n\n## 操作步骤\n\n1. 假设已经正常部署了amd64架构的三节点集群\n2. 在“amd64部署机” 目录 /etc/kubeasz 中移除子目录 bin 和 down，然后把整体/etc/kubeasz 目录复制到“arm64部署机”\n\n```\n# 登录amd64部署机\ncd /etc/kubeasz; mv bin down /tmp/; scp -r /etc/kubeasz root@{_ip_arm64}:/etc/\n# 复制完成后找回 bin 和 down 子目录\nmv /tmp/bin /etc/kubeasz/; mv /tmp/down /etc/kubeasz/\n```\n3. 登录“arm64部署机”，执行下载，其他准备工作\n\n```\ncd /etc/kubeasz\n# 下载基础部分\n./ezdown -D\n# 下载额外部分（如有）\n./ezdown -X ...\n# 运行部署容器\n./ezdown -S\n# 配置机器ssh免密码登录，集群所有节点都免密，包括待新增arm64节点\nssh-copy-id xx.xx.xx.xx\nssh-copy-id ...\n# 复制kubeconfig\nmkdir /root/.kube/; cp clusters/default/kubectl.kubeconfig /root/.kube/config\n```\n4. 添加arm64新节点到集群\n\n```\nsource ~/.bashrc\n# 添加新节点 x.x.x.x\ndk ezctl add-node default x.x.x.x\n```\n5. 验证\n\n```\n$ kubectl get node -owide\nNAME           STATUS   ROLES    AGE    VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME\nk8s-x.x.x-19   Ready    master   5d8h   v1.33.1   x.x.x.19   <none>        Ubuntu 20.04.4 LTS   5.4.0-122-generic    containerd://2.1.1\nk8s-x.x.x-90   Ready    node     5d8h   v1.33.1   x.x.x.90   <none>        Ubuntu 22.04.5 LTS   5.15.0-134-generic   containerd://2.1.1\nk8s-x.x.x-91   Ready    node     5d8h   v1.33.1   x.x.x.91   <none>        Ubuntu 22.04.5 LTS   5.15.0-134-generic   containerd://2.1.1\nk8s-x.x.x-93   Ready    node     79s    v1.33.1   x.x.x.93   <none>        Ubuntu 22.04.5 LTS   5.15.0-140-generic   containerd://2.1.1\n\n$ kubectl describe node|grep beta.kubernetes.io/arch\nLabels:             beta.kubernetes.io/arch=amd64\nLabels:             beta.kubernetes.io/arch=amd64\nLabels:             beta.kubernetes.io/arch=amd64\nLabels:             beta.kubernetes.io/arch=arm64\n```\n\n## 小结\n通过以上步骤，成功实现了在amd64集群中添加arm64节点；充分展示kubeasz 项目部署集群的灵活性和可配置性；部署过程中ansible执行的过程性输出内容，以近乎白盒的方式展示每一个细节；假如出错有详细的说明，帮助定位，并且随时可以修改执行脚本，安装的幂等性保证随时可以重新安装以修复错误。`Hack it, and have fun!`\n\n"
  },
  {
    "path": "docs/setup/multi_os.md",
    "content": "# 操作系统说明\n\n目前发现部分使用新内核的linux发行版，k8s 安装使用 cgroup v2版本时，有时候安装会失败，需要删除/清理集群后重新安装。已报告可能发生于 Alma Linux 9, Rocky Linux 9, Fedora 37；建议如下步骤处理：\n\n- 1.确认系统使用的cgroup v2版本\n```\nstat -fc %T /sys/fs/cgroup/ \ncgroup2fs\n```\n- 2.初次安装时kubelet可能启动失败，日志报错类似：err=\"openat2 /sys/fs/cgroup/kubepods.slice/cpu.weight: no such file or directory\"\n\n- 3.建议删除集群然后重新安装，一般能够成功\n```\n# 删除集群\ndk ezctl destroy xxxx\n\n# 重启\nreboot\n\n# 启动后重新安装\ndk ezctl setup xxxx all\n```\n\n## Debian\n\n- Debian 11：默认可能没有安装iptables，使用kubeasz 安装前需要执行：\n\n``` bash \napt update\n\napt install iptables -y\n```\n\n## openEuler\n\n- openEuler 24.03 需要安装iptables\n\n``` bash\nyum install iptables -y\n```\n\n## openSUSE\n\n- openSUSE Leap 15.4：需要安装iptables\n\n``` bash\nzypper install iptables\nln -s /usr/sbin/iptables /sbin/iptables\n```\n"
  },
  {
    "path": "docs/setup/multi_platform.md",
    "content": "# 多架构支持\n\nkubeasz 3.4.1 以后支持多CPU架构，当前已支持linux amd64和linux arm64，更多架构支持根据后续需求来计划。\n\n## 使用方式\n\nkubeasz 多架构安装逻辑：根据部署机器（执行ezdown/ezctl命令的机器）的架构，会自动判断下载对应amd64/arm64的二进制文件和容器镜像，然后推送安装到整个集群。\n\n- 暂不支持自动部署混合架构集群，如有需要可以按[说明文档](mix_arch.md)手动操作。\n- harbor目前仅支持amd64安装\n\n## 架构支持备忘\n\n#### k8s核心组件本身提供多架构的二进制文件/容器镜像下载，项目调整了下载二进制文件的容器dockerfile\n\n- https://github.com/easzlab/dockerfile-kubeasz-k8s-bin\n\n#### kubeasz其他用到的二进制或镜像，重新调整了容器创建dockerfile\n\n- https://github.com/easzlab/dockerfile-kubeasz-ext-bin\n- https://github.com/easzlab/dockerfile-kubeasz-ext-build\n- https://github.com/easzlab/dockerfile-kubeasz-sys-pkg\n- https://github.com/easzlab/dockerfile-kubeasz-mirrored-images\n- https://github.com/easzlab/dockerfile-kubeasz\n- https://github.com/easzlab/dockerfile-ansible\n\n#### 其他组件(coredns/network plugin/dashboard/metrics-server等)一般都提供多架构的容器镜像，可以直接下载拉取\n\n\n"
  },
  {
    "path": "docs/setup/network-plugin/calico-bgp-rr.md",
    "content": "# calico 配置 BGP Route Reflectors\n\n`Calico`作为`k8s`的一个流行网络插件，它依赖`BGP`路由协议实现集群节点上的`POD`路由互通；而路由互通的前提是节点间建立 BGP Peer 连接。BGP 路由反射器（Route Reflectors，简称 RR）可以简化集群BGP Peer的连接方式，它是解决BGP扩展性问题的有效方式；具体来说：\n\n- 没有 RR 时，所有节点之间需要两两建立连接（IBGP全互联），节点数量增加将导致连接数剧增、资源占用剧增\n- 引入 RR 后，其他 BGP 路由器只需要与它建立连接并交换路由信息，节点数量增加连接数只是线性增加，节省系统资源\n\ncalico-node 版本 v3.3 开始支持内建路由反射器，非常方便，因此使用 calico 作为网络插件可以支持大规模节点数的`K8S`集群。\n\n- 建议集群节点数大于50时，应用BGP Route Reflectors 特性\n\n## 前提条件\n\nk8s 集群使用calico网络插件部署成功。本实验环境为按照kubeasz安装的2主2从集群，calico 版本 v3.19.4。\n\n```\n$ kubectl get node\nNAME           STATUS                     ROLES    AGE    VERSION\n192.168.1.1   Ready,SchedulingDisabled   master   178m   v1.13.1\n192.168.1.2   Ready,SchedulingDisabled   master   178m   v1.13.1\n192.168.1.3   Ready                      node     178m   v1.13.1\n192.168.1.4   Ready                      node     178m   v1.13.1\n$ kubectl get pod -n kube-system -o wide | grep calico\ncalico-kube-controllers-77487546bd-jqrlc   1/1     Running   0          179m   192.168.1.3   192.168.1.3   <none>           <none>\ncalico-node-67t5m                          2/2     Running   0          179m   192.168.1.1   192.168.1.1   <none>           <none>\ncalico-node-drmhq                          2/2     Running   0          179m   192.168.1.2   192.168.1.2   <none>           <none>\ncalico-node-rjtkv                          2/2     Running   0          179m   192.168.1.4   192.168.1.4   <none>           <none>\ncalico-node-xtspl                          2/2     Running   0          179m   192.168.1.3   192.168.1.3   <none>           <none>\n```\n查看当前集群中BGP连接情况：可以看到集群中4个节点两两建立了 BGP 连接\n\n```\n$ dk ansible -i /etc/kubeasz/clusters/xxx/hosts all -m shell -a '/opt/kube/bin/calicoctl node status'\n192.168.1.3 | SUCCESS | rc=0 >>\nCalico process is running.\n\nIPv4 BGP status\n+--------------+-------------------+-------+----------+-------------+\n| PEER ADDRESS |     PEER TYPE     | STATE |  SINCE   |    INFO     |\n+--------------+-------------------+-------+----------+-------------+\n| 192.168.1.1 | node-to-node mesh | up    | 03:08:20 | Established |\n| 192.168.1.2 | node-to-node mesh | up    | 03:08:18 | Established |\n| 192.168.1.4 | node-to-node mesh | up    | 03:08:19 | Established |\n+--------------+-------------------+-------+----------+-------------+\n\nIPv6 BGP status\nNo IPv6 peers found.\n\n192.168.1.2 | SUCCESS | rc=0 >>\nCalico process is running.\n\nIPv4 BGP status\n+--------------+-------------------+-------+----------+-------------+\n| PEER ADDRESS |     PEER TYPE     | STATE |  SINCE   |    INFO     |\n+--------------+-------------------+-------+----------+-------------+\n| 192.168.1.4 | node-to-node mesh | up    | 03:08:17 | Established |\n| 192.168.1.3 | node-to-node mesh | up    | 03:08:18 | Established |\n| 192.168.1.1 | node-to-node mesh | up    | 03:08:20 | Established |\n+--------------+-------------------+-------+----------+-------------+\n\nIPv6 BGP status\nNo IPv6 peers found.\n\n192.168.1.1 | SUCCESS | rc=0 >>\nCalico process is running.\n\nIPv4 BGP status\n+--------------+-------------------+-------+----------+-------------+\n| PEER ADDRESS |     PEER TYPE     | STATE |  SINCE   |    INFO     |\n+--------------+-------------------+-------+----------+-------------+\n| 192.168.1.2 | node-to-node mesh | up    | 03:08:21 | Established |\n| 192.168.1.3 | node-to-node mesh | up    | 03:08:21 | Established |\n| 192.168.1.4 | node-to-node mesh | up    | 03:08:21 | Established |\n+--------------+-------------------+-------+----------+-------------+\n\nIPv6 BGP status\nNo IPv6 peers found.\n\n192.168.1.4 | SUCCESS | rc=0 >>\nCalico process is running.\n\nIPv4 BGP status\n+--------------+-------------------+-------+----------+-------------+\n| PEER ADDRESS |     PEER TYPE     | STATE |  SINCE   |    INFO     |\n+--------------+-------------------+-------+----------+-------------+\n| 192.168.1.2 | node-to-node mesh | up    | 03:08:17 | Established |\n| 192.168.1.3 | node-to-node mesh | up    | 03:08:19 | Established |\n| 192.168.1.1 | node-to-node mesh | up    | 03:08:20 | Established |\n+--------------+-------------------+-------+----------+-------------+\n\nIPv6 BGP status\nNo IPv6 peers found.\n```\n\n## kubeasz 自动安装启用 route reflector\n\n- 修改`/etc/kubeasz/clusters/xxx/config.yml`文件，设置配置项`CALICO_RR_ENABLED: true` \n- 重新执行网络安装 `dk ezctl setup xxx 07`\n\n执行完成，检查bgp连接验证即可。\n\n### 附：手动安装route reflector 过程讲解\n\n- 选择并配置 Route Reflector 节点\n\n首先查看当前集群中的节点：\n\n```\n$ calicoctl get node -o wide\nNAME     ASN       IPV4              IPV6\nk8s401   (64512)   192.168.1.1/24\nk8s402   (64512)   192.168.1.2/24\nk8s403   (64512)   192.168.1.3/24\nk8s404   (64512)   192.168.1.4/24\n```\n\n可以在集群中选择1个或多个节点作为 rr 节点，这里先选择节点：k8s401\n\n``` bash\n#配置routeReflectorClusterID\ncalicoctl patch node k8s401 -p '{\"spec\": {\"bgp\": {\"routeReflectorClusterID\": \"244.0.0.1\"}}}'\n\n#配置node label\ncalicoctl patch node k8s401 -p '{\"metadata\": {\"labels\": {\"route-reflector\": \"true\"}}}'\n```\n\n- 配置 BGP node 与 Route Reflector 的连接建立规则\n\n``` bash\n$ cat << EOF | calicoctl create -f -\nkind: BGPPeer\napiVersion: projectcalico.org/v3\nmetadata:\n  name: peer-with-route-reflectors\nspec:\n  nodeSelector: all()\n  peerSelector: route-reflector == 'true'\nEOF\n```\n\n- 配置全局禁用全连接（BGP full mesh）\n\n```\n$ cat << EOF | calicoctl create -f -\napiVersion: projectcalico.org/v3\nkind: BGPConfiguration\nmetadata:\n  name: default\nspec:\n  logSeverityScreen: Info\n  nodeToNodeMeshEnabled: false\n  asNumber: 64512\nEOF\n```\n\n- 验证增加 rr 之后的bgp 连接情况\n\n``` \n$ dk ansible -i /etc/kubeasz/clusters/xxx/hosts all -m shell -a '/opt/kube/bin/calicoctl node status'\n192.168.1.4 | SUCCESS | rc=0 >>\nCalico process is running.\n\nIPv4 BGP status\n+--------------+-----------+-------+----------+-------------+\n| PEER ADDRESS |   PEER TYPE   | STATE |  SINCE   |    INFO     |\n+--------------+-----------+-------+----------+-------------+\n| 192.168.1.1 | node specific | up    | 11:02:55 | Established |\n+--------------+-----------+-------+----------+-------------+\n\nIPv6 BGP status\nNo IPv6 peers found.\n\n192.168.1.3 | SUCCESS | rc=0 >>\nCalico process is running.\n\nIPv4 BGP status\n+--------------+-----------+-------+----------+-------------+\n| PEER ADDRESS | PEER TYPE | STATE |  SINCE   |    INFO     |\n+--------------+-----------+-------+----------+-------------+\n| 192.168.1.1 | node specific | up    | 11:02:55 | Established |\n+--------------+-----------+-------+----------+-------------+\n\nIPv6 BGP status\nNo IPv6 peers found.\n\n192.168.1.1 | SUCCESS | rc=0 >>\nCalico process is running.\n\nIPv4 BGP status\n+--------------+---------------+-------+----------+-------------+\n| PEER ADDRESS |   PEER TYPE   | STATE |  SINCE   |    INFO     |\n+--------------+---------------+-------+----------+-------------+\n| 192.168.1.2 | node specific | up    | 11:02:55 | Established |\n| 192.168.1.3 | node specific | up    | 11:02:55 | Established |\n| 192.168.1.4 | node specific | up    | 11:02:55 | Established |\n+--------------+---------------+-------+----------+-------------+\n\nIPv6 BGP status\nNo IPv6 peers found.\n\n192.168.1.2 | SUCCESS | rc=0 >>\nCalico process is running.\n\nIPv4 BGP status\n+--------------+-----------+-------+----------+-------------+\n| PEER ADDRESS | PEER TYPE | STATE |  SINCE   |    INFO     |\n+--------------+-----------+-------+----------+-------------+\n| 192.168.1.1 | node specific | up    | 11:02:55 | Established |\n+--------------+-----------+-------+----------+-------------+\n\nIPv6 BGP status\nNo IPv6 peers found.\n```\n可以看到所有其他节点都与所选rr节点建立bgp连接。\n\n- 再增加一个 rr 节点(略)\n\n步骤同上，添加成功后可以看到所有其他节点都与两个rr节点建立bgp连接，两个rr节点之间也建立bgp连接。对于节点数较多的`K8S`集群建议配置2-3个 RR 节点。\n\n## 参考文档\n\n- 1.[Calico bgp 配置指南](https://projectcalico.docs.tigera.io/reference/resources/bgpconfig)\n- 2.[BGP路由反射器基础](https://www.sohu.com/a/140033025_761420)\n"
  },
  {
    "path": "docs/setup/network-plugin/calico.md",
    "content": "## 06-安装calico网络组件.md\n\ncalico 是k8s社区最流行的网络插件之一，也是k8s-conformance test 默认使用的网络插件，功能丰富，支持network policy；是当前kubeasz项目的默认网络插件。\n\n如果需要安装calico，请在`clusters/xxxx/hosts`文件中设置变量 `CLUSTER_NETWORK=\"calico\"`，参考[这里](../config_guide.md)\n\n``` bash\nroles/calico/\n├── tasks\n│   └── main.yml\n├── templates\n│   ├── calico-csr.json.j2\n│   ├── calicoctl.cfg.j2\n│   ├── calico-v3.15.yaml.j2\n│   ├── calico-v3.19.yaml.j2\n│   └── calico-v3.8.yaml.j2\n└── vars\n    └── main.yml\n```\n请在另外窗口打开`roles/calico/tasks/main.yml`文件，对照看以下讲解内容。\n\n### 创建calico 证书申请\n\n``` bash\n{\n  \"CN\": \"calico\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n```\ncalico 使用客户端证书，所以hosts字段可以为空；后续可以看到calico证书用在四个地方：\n\n- calico/node 这个docker 容器运行时访问 etcd 使用证书\n- cni 配置文件中，cni 插件需要访问 etcd 使用证书\n- calicoctl 操作集群网络时访问 etcd 使用证书\n- calico/kube-controllers 同步集群网络策略时访问 etcd 使用证书\n\n### 创建 calico DaemonSet yaml文件和rbac 文件\n\n请对照 roles/calico/templates/calico.yaml.j2文件注释和以下注意内容\n\n+ 详细配置参数请参考[calico官方文档](https://projectcalico.docs.tigera.io/reference/node/configuration)\n+ 配置ETCD_ENDPOINTS 、CA、证书等，所有{{ }}变量与ansible hosts文件中设置对应\n+ 配置集群POD网络 CALICO_IPV4POOL_CIDR={{ CLUSTER_CIDR }}\n+ 配置FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT 默认允许Pod到Node的网络流量，更多[felix配置选项](https://projectcalico.docs.tigera.io/reference/felix/configuration)\n\n### 安装calico 网络\n\n+ 安装前检查主机名不能有大写字母，只能由`小写字母` `-` `.` 组成 (name must consist of lower case alphanumeric characters, '-' or '.' (regex: [a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*))(calico-node v3.0.6以上已经解决主机大写字母问题)\n+ **安装前必须确保各节点主机名不重复** ，calico node name 由节点主机名决定，如果重复，那么重复节点在etcd中只存储一份配置，BGP 邻居也不会建立。\n+ 安装之前必须确保`kube_master`和`kube_node`节点已经成功部署\n+ 轮询等待calico 网络插件安装完成，删除之前kube_node安装时默认cni网络配置\n\n### [可选]配置calicoctl工具 [calicoctl.cfg.j2](roles/calico/templates/calicoctl.cfg.j2)\n\n``` bash\napiVersion: projectcalico.org/v3\nkind: CalicoAPIConfig\nmetadata:\nspec:\n  datastoreType: \"etcdv3\"\n  etcdEndpoints: {{ ETCD_ENDPOINTS }}\n  etcdKeyFile: /etc/calico/ssl/calico-key.pem\n  etcdCertFile: /etc/calico/ssl/calico.pem\n  etcdCACertFile: {{ ca_dir }}/ca.pem\n```\n\n### 验证calico网络\n\n执行calico安装成功后可以验证如下：(需要等待镜像下载完成，有时候即便上一步已经配置了docker国内加速，还是可能比较慢，请确认以下容器运行起来以后，再执行后续验证步骤)\n\n``` bash\nkubectl get pod --all-namespaces\nNAMESPACE     NAME                                       READY     STATUS    RESTARTS   AGE\nkube-system   calico-kube-controllers-5c6b98d9df-xj2n4   1/1       Running   0          1m\nkube-system   calico-node-4hr52                          2/2       Running   0          1m\nkube-system   calico-node-8ctc2                          2/2       Running   0          1m\nkube-system   calico-node-9t8md                          2/2       Running   0          1m\n```\n\n**查看网卡和路由信息**\n\n先在集群创建几个测试pod:  `kubectl run test --image=busybox --replicas=3 sleep 30000`\n\n``` bash\n# 查看网卡信息\nip a\n```\n\n+ 可以看到包含类似cali1cxxx的网卡，是calico为测试pod生成的\n+ tunl0网卡现在不用管，是默认生成的，当开启IPIP 特性时使用的隧道\n\n``` bash\n# 查看路由\nroute -n\nKernel IP routing table\nDestination     Gateway         Genmask         Flags Metric Ref    Use Iface\n0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 ens3\n192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens3\n172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0\n172.20.3.64     192.168.1.34    255.255.255.192 UG    0      0        0 ens3\n172.20.33.128   0.0.0.0         255.255.255.192 U     0      0        0 *\n172.20.33.129   0.0.0.0         255.255.255.255 UH    0      0        0 caliccc295a6d4f\n172.20.104.0    192.168.1.35    255.255.255.192 UG    0      0        0 ens3\n172.20.166.128  192.168.1.63    255.255.255.192 UG    0      0        0 ens3\n```\n\n**查看所有calico节点状态**\n\n``` bash\ncalicoctl node status\nCalico process is running.\n\nIPv4 BGP status\n+--------------+-------------------+-------+----------+-------------+\n| PEER ADDRESS |     PEER TYPE     | STATE |  SINCE   |    INFO     |\n+--------------+-------------------+-------+----------+-------------+\n| 192.168.1.34 | node-to-node mesh | up    | 12:34:00 | Established |\n| 192.168.1.35 | node-to-node mesh | up    | 12:34:00 | Established |\n| 192.168.1.63 | node-to-node mesh | up    | 12:34:01 | Established |\n+--------------+-------------------+-------+----------+-------------+\n```\n\n**BGP 协议是通过TCP 连接来建立邻居的，因此可以用netstat 命令验证 BGP Peer**\n\n``` bash\nnetstat -antlp|grep ESTABLISHED|grep 179\ntcp        0      0 192.168.1.66:179        192.168.1.35:41316      ESTABLISHED 28479/bird      \ntcp        0      0 192.168.1.66:179        192.168.1.34:40243      ESTABLISHED 28479/bird      \ntcp        0      0 192.168.1.66:179        192.168.1.63:48979      ESTABLISHED 28479/bird\n```\n\n**查看etcd中calico相关信息**\n\n因为这里calico网络使用etcd存储数据，所以可以在etcd集群中查看数据\n\n+ calico 3.x 版本默认使用 etcd v3存储，**登录集群的一个etcd 节点**，查看命令：\n\n``` bash\n# 查看所有calico相关数据\nETCDCTL_API=3 etcdctl --endpoints=\"http://127.0.0.1:2379\" get --prefix /calico\n# 查看 calico网络为各节点分配的网段\nETCDCTL_API=3 etcdctl --endpoints=\"http://127.0.0.1:2379\" get --prefix /calico/ipam/v2/host\n```\n\n\n## 下一步：[设置 BGP Route Reflector](calico-bgp-rr.md)\n"
  },
  {
    "path": "docs/setup/network-plugin/cilium-example.md",
    "content": "## 开始使用 cilium\n\n以下为简要翻译 `cilium doc`上的一个应用示例[原文](https://docs.cilium.io/en/stable/gettingstarted/http/)，部署在单节点k8s 环境的实践。\n\n### 部署示例应用\n\n官方文档用几个`pod/svc` 抽象一个有趣的应用场景（星战迷）：星战中帝国方建造了被称为“终极武器”的“死星”，它是一个卫星大小的战斗空间站，它的核心是使用凯伯晶体（Kyber Crystal）的超级激光炮，剧中它的首秀就以完全火力摧毁了“杰达圣城”（Jedha）。下面将用运行于 k8s上的 pod/svc/cilium 等模拟“死星“的一个“飞船登陆”系统安全策略设计。\n\n- deploy/deathstar：作为控制整个“死星”的飞船登陆管理系统，它暴露一个SVC，提供HTTP REST 接口给飞船请求登陆使用；\n- pod/tiefighter：作为“帝国”方的常规战斗飞船，它会调用上述 HTTP 接口，请求登陆“死星”；\n- pod/xwing：作为“盟军”方的飞行舰，它也尝试调用 HTTP 接口，请求登陆“死星”；\n\n<img alt=\"cilium_http_gsg\" width=\"400\" height=\"300\" src=\"https://docs.cilium.io/en/stable/_images/cilium_http_gsg.png\">\n\n根据文件[http-sw-app.yaml](../../../roles/cilium/files/star_war_example/http-sw-app.yaml) 创建 `$ kubectl create -f http-sw-app.yaml` 后，验证如下：\n\n``` bash\n$ kubectl get pods,svc\nNAME                             READY     STATUS    RESTARTS   AGE\npod/deathstar-5fc7c7795d-djf2q   1/1       Running   0          4h\npod/deathstar-5fc7c7795d-hrgst   1/1       Running   0          4h\npod/tiefighter                   1/1       Running   0          4h\npod/xwing                        1/1       Running   0          4h\n\nNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE\nservice/deathstar    ClusterIP   10.68.242.130   <none>        80/TCP    4h\nservice/kubernetes   ClusterIP   10.68.0.1       <none>        443/TCP   5h\n```\n每个 POD 在 `cilium` 中都表示为 `Endpoint`，初始每个 `Endpoint` 的”进出安全策略“状态均为 `Disabled`，如下：(已省略部分无关 POD 信息)\n\n``` bash\n$ kubectl exec -n kube-system cilium-6t5vx -- cilium endpoint list\nENDPOINT   POLICY (ingress)   POLICY (egress)   IDENTITY   LABELS (source:key[=value])                                    IPv6                  IPv4           STATUS   \n           ENFORCEMENT        ENFORCEMENT                                                                                                                      \n643        Disabled           Disabled          31371      k8s:class=deathstar                                            f00d::ac14:0:0:283    172.20.0.246   ready   \n                                                           k8s:io.cilium.k8s.policy.serviceaccount=default                                                             \n                                                           k8s:io.kubernetes.pod.namespace=default                                                                     \n                                                           k8s:org=empire                                                                                              \n1011       Disabled           Disabled          31371      k8s:class=deathstar                                            f00d::ac14:0:0:3f3    172.20.0.63    ready   \n                                                           k8s:io.cilium.k8s.policy.serviceaccount=default                                                             \n                                                           k8s:io.kubernetes.pod.namespace=default                                                                     \n                                                           k8s:org=empire                                                                                              \n32030      Disabled           Disabled          5350       k8s:class=tiefighter                                           f00d::ac14:0:0:7d1e   172.20.0.201   ready   \n                                                           k8s:io.cilium.k8s.policy.serviceaccount=default                                                             \n                                                           k8s:io.kubernetes.pod.namespace=default                                                                     \n                                                           k8s:org=empire                                                                                              \n45943      Disabled           Disabled          14309      k8s:class=xwing                                                f00d::ac14:0:0:b377   172.20.0.189   ready   \n                                                           k8s:io.cilium.k8s.policy.serviceaccount=default                                                             \n                                                           k8s:io.kubernetes.pod.namespace=default                                                                     \n                                                           k8s:org=alliance                                                                                            \n52035      Disabled           Disabled          4          reserved:health                                                f00d::ac14:0:0:cb43   172.20.0.92    ready   \n```\n\n### 检查初始状态\n\n当然“死星”应该只允许“帝国”的飞船着陆，因为没有应用任何策略，所以初始状态下“帝国”和“联盟”的飞船都可以登陆，如下测试：\n\n``` bash\n$ kubectl exec xwing -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing\nShip landed # 成功着陆\n$ kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing\nShip landed # 成功着陆\n```\n\n### 应用 L3/L4 策略\n\n现在我们应用策略，仅让带有标签 `org=empire`的飞船登陆“死星”；那么带有标签 `org=alliance`的“联盟”飞船将禁止登陆；这个就是我们熟悉的传统L3/L4 防火墙策略，并跟踪连接（会话）状态；\n\n<img alt=\"cilium_http_l3_l4_gsg\" width=\"400\" height=\"300\" src=\"https://docs.cilium.io/en/stable/_images/cilium_http_l3_l4_gsg.png\">\n\n根据文件[sw_l3_l4_policy.yaml](../../../roles/cilium/files/star_war_example/sw_l3_l4_policy.yaml) 创建 `$ kubectl apply -f sw_l3_l4_policy.yaml` 后，验证如下：\n\n``` bash\n$ kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing\nShip landed # 成功着陆\n\n$ kubectl exec xwing -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing\n# 失败超时\n```\n\n### 查看安全策略\n\n再次执行 `cilium endpoint list`，可以看到标签带`deathstar`的 POD 已经应用了 `Ingress`方向的策略：\n\n``` bash\n# kubectl exec -n kube-system cilium-6t5vx -- cilium endpoint list\nENDPOINT   POLICY (ingress)   POLICY (egress)   IDENTITY   LABELS (source:key[=value])                                    IPv6                  IPv4           STATUS   \n           ENFORCEMENT        ENFORCEMENT                                                                                                                      \n643        Enabled            Disabled          31371      k8s:class=deathstar                                            f00d::ac14:0:0:283    172.20.0.246   ready   \n                                                           k8s:io.cilium.k8s.policy.serviceaccount=default                                                             \n                                                           k8s:io.kubernetes.pod.namespace=default                                                                     \n                                                           k8s:org=empire                                                                                              \n1011       Enabled            Disabled          31371      k8s:class=deathstar                                            f00d::ac14:0:0:3f3    172.20.0.63    ready   \n                                                           k8s:io.cilium.k8s.policy.serviceaccount=default                                                             \n                                                           k8s:io.kubernetes.pod.namespace=default                                                                     \n                                                           k8s:org=empire                                                                                              \n32030      Disabled           Disabled          5350       k8s:class=tiefighter                                           f00d::ac14:0:0:7d1e   172.20.0.201   ready   \n                                                           k8s:io.cilium.k8s.policy.serviceaccount=default                                                             \n                                                           k8s:io.kubernetes.pod.namespace=default                                                                     \n                                                           k8s:org=empire                                                                                              \n45943      Disabled           Disabled          14309      k8s:class=xwing                                                f00d::ac14:0:0:b377   172.20.0.189   ready   \n                                                           k8s:io.cilium.k8s.policy.serviceaccount=default                                                             \n                                                           k8s:io.kubernetes.pod.namespace=default                                                                     \n                                                           k8s:org=alliance                                                                                            \n52035      Disabled           Disabled          4          reserved:health                                                f00d::ac14:0:0:cb43   172.20.0.92    ready   \n```\n\n查看具体策略内容 `kubectl describe cnp rule1`\n\n### L7 安全策略\n\n上述的策略可以进行简单的安全防护了，但是“死星”的这个系统还有很多复杂的功能；比如它还提供了一个内部维护接口，如果被不合理调用将带来严重灾难性后果，也许“联盟”勇士劫持了一架“帝国”飞船正在进行这个任务（虽然我们内心希望他能够成功摧毁“死星”）。不幸的是“死星”系统设计者考虑到这个风险，它有办法严格限制每架飞船能够请求的权限。\n\n没有限制飞船请求权限时，如下运行：\n\n``` bash\n$ kubectl exec tiefighter -- curl -s -XPUT deathstar.default.svc.cluster.local/v1/exhaust-port\nPanic: deathstar exploded\n\ngoroutine 1 [running]:\nmain.HandleGarbage(0x2080c3f50, 0x2, 0x4, 0x425c0, 0x5, 0xa)\n        /code/src/github.com/empire/deathstar/\n        temp/main.go:9 +0x64\nmain.main()\n        /code/src/github.com/empire/deathstar/\n        temp/main.go:5 +0x85\n```\n\n<img alt=\"cilium_http_l3_l4_l7_gsg\" width=\"400\" height=\"300\" src=\"https://docs.cilium.io/en/stable/_images/cilium_http_l3_l4_l7_gsg.png\">\n\n限制L7 的安全策略，根据文件[sw_l3_l4_l7_policy.yaml](../../../roles/cilium/files/star_war_example/sw_l3_l4_l7_policy.yaml) 创建 `$ kubectl apply -f sw_l3_l4_l7_policy.yaml` 后，验证如下：\n\n``` bash\n$ kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing\nShip landed\n$ kubectl exec tiefighter -- curl -s -XPUT deathstar.default.svc.cluster.local/v1/exhaust-port\nAccess denied\n```\n\n我们同样可以使用 `kubectl desribe cnp`检查更新的策略，或者使用 `cilium` 命令行：\n\n``` bash\n$ kubectl exec -n kube-system cilium-6t5vx -- cilium policy get\n[\n  {\n    \"endpointSelector\": {\n      \"matchLabels\": {\n        \"any:class\": \"deathstar\",\n        \"any:org\": \"empire\",\n        \"k8s:io.kubernetes.pod.namespace\": \"default\"\n      }\n    },\n    \"ingress\": [\n      {\n        \"fromEndpoints\": [\n          {\n            \"matchLabels\": {\n              \"any:org\": \"empire\",\n              \"k8s:io.kubernetes.pod.namespace\": \"default\"\n            }\n          }\n        ],\n        \"toPorts\": [\n          {\n            \"ports\": [\n              {\n                \"port\": \"80\",\n                \"protocol\": \"TCP\"\n              }\n            ],\n            \"rules\": {\n              \"http\": [\n                {\n                  \"path\": \"/v1/request-landing\",\n                  \"method\": \"POST\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ],\n    \"labels\": [\n      {\n        \"key\": \"io.cilium.k8s.policy.name\",\n        \"value\": \"rule1\",\n        \"source\": \"k8s\"\n      },\n      {\n        \"key\": \"io.cilium.k8s.policy.namespace\",\n        \"value\": \"default\",\n        \"source\": \"k8s\"\n      }\n    ]\n  }\n]\nRevision: 267\n```\n我们看到 `cilium` 可以实现 `7层 HTTP `协议的请求方法（GET/PUT/POST等）、路径（/v1/request-landing）等等安全策略；另外，它还可以防护其他应用（如：Kafka, gRPC, Elasticsearch），可以去官网文档示例学习！\n\n## 参考资料\n\n- [cilium github](https://github.com/cilium/cilium)\n- [cilium doc](http://docs.cilium.io)\n"
  },
  {
    "path": "docs/setup/network-plugin/cilium.md",
    "content": "# 06-安装cilium网络组件\n\n`cilium` 是一个革新的网络与安全组件；基于 linux 内核新技术--`BPF`，它可以透明、零侵入地实现服务间安全策略与可视化，主要优势如下：\n\n- 支持L3/L4, L7(如：HTTP/gRPC/Kafka)的安全策略\n- 支持基于安全ID而不是地址+端口的传统防火墙策略\n- 支持基于Overlay或Native Routing的扁平多节点pod网络\n  - Overlay VXLAN 方式类似于 flannel 的VXLAN后端\n- 高性能负载均衡，支持DSR\n- 支持事件、策略跟踪和监控集成\n\ncilium 项目文档比较完整，建议仔细阅读[官网文档]()\n\n## kubeasz 集成安装 cilium\n\nkubeasz 3.3.1 更新重写了cilium 安装流程，使用helm charts 方式，配置文件在 roles/cilium/templates/values.yaml.j2，请阅读原charts中values.yaml 文件后自定义修改。\n\n- https://docs.cilium.io/en/stable/installation/k8s-install-helm/#k8s-install-helm\n- 相关镜像已经离线打包并推送到本地镜像仓库，通过 `ezdown -X` 命令下载cilium等额外镜像\n\n### 0.检查系统内核版本\n\n- Linux kernel >= 4.9.17，如需升级请阅读文档[升级内核](guide/kernel_upgrade.md)\n- etcd >= 3.1.0 or consul >= 0.6.4\n\n### 1.选择cilium网络后安装\n\n- 参考[快速指南](../quickStart.md)，设置`/etc/kubeasz/clusters/xxx/hosts`文件中变量 `CLUSTER_NETWORK=\"cilium\"` \n- 下载额外镜像 `./ezdown -X cilium 和 ./ezdown -X network-check`\n- 执行集群安装 `dk ezctl setup xxx all`\n\n注意默认设置未集成cilium_hubble，可以在`/etc/kubeasz/clusters/xxx/config.yml`配置启用后再开始安装。\n\n- cilium_connectivity_check：检查集群cilium网络是否工作正常，非常实用\n- cilium_hubble：很酷很实用的监控、策略追踪排查工具\n\nCilium CLI 和 Hubble CLI 二进制已经默认包含在kubeasz-ext-bin 1.2.0及之后的版本中 https://github.com/kubeasz/dockerfiles/blob/master/kubeasz-ext-bin/Dockerfile\n\n### 2.验证\n\n一键安装完成后如下，注意cilium_connectivity_check 中带`multi-node`的检查任务需要多节点集群才能完成\n\n```\nkubectl get pod -A\nNAMESPACE     NAME                                                    READY   STATUS    RESTARTS   AGE\ncilium-test   echo-a-5dd478f5d8-74xg5                                 1/1     Running   0          3m10s\ncilium-test   echo-b-78c79f6cdd-t9vk6                                 1/1     Running   0          3m10s\ncilium-test   echo-b-host-75c44b897-c8f5m                             1/1     Running   0          3m10s\ncilium-test   host-to-b-multi-node-clusterip-7895fd494c-92cb2         1/1     Running   0          2m59s\ncilium-test   host-to-b-multi-node-headless-74bbc877b5-ffxxx          1/1     Running   0          2m59s\ncilium-test   pod-to-a-allowed-cnp-598fc5c547-b885q                   1/1     Running   0          2m59s\ncilium-test   pod-to-a-b8b456c99-r6272                                1/1     Running   0          2m59s\ncilium-test   pod-to-a-denied-cnp-c78c44f5c-7xhkw                     1/1     Running   0          2m59s\ncilium-test   pod-to-b-intra-node-nodeport-6ccdb55779-j8gnd           1/1     Running   0          2m59s\ncilium-test   pod-to-b-multi-node-clusterip-55d8448b5c-5b4nj          1/1     Running   0          2m59s\ncilium-test   pod-to-b-multi-node-headless-5fbf655bb9-pszpr           1/1     Running   0          2m59s\ncilium-test   pod-to-b-multi-node-nodeport-65f5b95569-qglb7           1/1     Running   0          2m59s\ncilium-test   pod-to-external-1111-64496c754c-bvqlt                   1/1     Running   0          2m59s\ncilium-test   pod-to-external-fqdn-allow-baidu-cnp-6f96597855-c84zs   1/1     Running   0          2m59s\nkube-system   cilium-7trcs                                            1/1     Running   0          3m42s\nkube-system   cilium-hvclp                                            1/1     Running   0          3m42s\nkube-system   cilium-operator-8566689975-vcxpp                        1/1     Running   0          3m42s\nkube-system   cilium-pw2sv                                            1/1     Running   0          3m42s\nkube-system   cilium-qppnc                                            1/1     Running   0          3m42s\nkube-system   coredns-84b58f6b4-m8x7s                                 1/1     Running   0          3m20s\nkube-system   dashboard-metrics-scraper-864d79d497-92l2w              1/1     Running   0          3m14s\nkube-system   hubble-relay-655dc744d7-8d9n7                           1/1     Running   0          3m42s\nkube-system   hubble-ui-54599d7967-lfkvk                              2/2     Running   0          3m42s\nkube-system   kubernetes-dashboard-5fc74cf5c6-pqdvc                   1/1     Running   0          3m14s\nkube-system   metrics-server-69797698d4-2jbg8                         1/1     Running   0          3m17s\nkube-system   node-local-dns-5n8gc                                    1/1     Running   0          3m19s\nkube-system   node-local-dns-5pm2p                                    1/1     Running   0          3m19s\nkube-system   node-local-dns-9x229                                    1/1     Running   0          3m19s\nkube-system   node-local-dns-jz8lj                                    1/1     Running   0          3m19s\n```\n\n检查 cilium 节点状态\n\n```\ncilium status\n    /¯¯\\\n /¯¯\\__/¯¯\\    Cilium:         OK\n \\__/¯¯\\__/    Operator:       OK\n /¯¯\\__/¯¯\\    Hubble:         OK\n \\__/¯¯\\__/    ClusterMesh:    disabled\n    \\__/\n\nDaemonSet         cilium             Desired: 4, Ready: 4/4, Available: 4/4\nDeployment        cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1\nDeployment        hubble-relay       Desired: 1, Ready: 1/1, Available: 1/1\nDeployment        hubble-ui          Desired: 1, Ready: 1/1, Available: 1/1\nContainers:       cilium             Running: 4\n                  cilium-operator    Running: 1\n                  hubble-relay       Running: 1\n                  hubble-ui          Running: 1\nCluster Pods:     17/17 managed by Cilium\nImage versions    hubble-relay       easzlab.io.local:5000/cilium/hubble-relay:v1.11.6: 1\n                  hubble-ui          easzlab.io.local:5000/cilium/hubble-ui:v0.9.0: 1\n                  hubble-ui          easzlab.io.local:5000/cilium/hubble-ui-backend:v0.9.0: 1\n                  cilium             easzlab.io.local:5000/cilium/cilium:v1.11.6: 4\n                  cilium-operator    easzlab.io.local:5000/cilium/operator-generic:v1.11.6: 1\n```\n\n## cilium network policy\n\ncilium network policy 提供了比k8s network policy更丰富的网络安全策略功能，有兴趣的请阅读官网文档，以下是一个有趣的小例子：\n\n- [星战死星登陆系统](cilium-example.md)\n"
  },
  {
    "path": "docs/setup/network-plugin/flannel.md",
    "content": "## 06-安装flannel网络组件.md\n\n`Flannel`是最早应用到k8s集群的网络插件之一，简单高效，且提供多个后端`backend`模式供选择；本文介绍以`DaemonSet Pod`方式集成到k8s集群，需要在所有master节点和node节点安装。\n\n### kubeasz 集成安装flannel\n\n- 参考[快速指南](../quickStart.md)，设置`/etc/kubeasz/clusters/xxx/hosts`文件中变量 `CLUSTER_NETWORK=\"flannel\"`\n- 下载额外镜像 `./ezdown -X flannel`\n- 执行集群安装 `dk ezctl setup xxx all`\n\n### 配置介绍\n\nFlannel CNI 插件的配置文件可以包含多个`plugin` 或由其调用其他`plugin`；`Flannel DaemonSet Pod`运行以后会生成`/run/flannel/subnet.env `文件，例如：\n\n``` bash\nFLANNEL_NETWORK=10.1.0.0/16\nFLANNEL_SUBNET=10.1.17.1/24\nFLANNEL_MTU=1472\nFLANNEL_IPMASQ=true\n```\n然后它利用这个文件信息去配置和调用`bridge`插件来生成容器网络，调用`host-local`来管理`IP`地址，例如：\n\n``` bash\n{\n\t\"name\": \"mynet\",\n\t\"type\": \"bridge\",\n\t\"mtu\": 1472,\n\t\"ipMasq\": false,\n\t\"isGateway\": true,\n\t\"ipam\": {\n\t\t\"type\": \"host-local\",\n\t\t\"subnet\": \"10.1.17.0/24\"\n\t}\n}\n```\n- 更多相关介绍请阅读：\n  - [flannel kubernetes 集成](https://github.com/coreos/flannel/blob/master/Documentation/kubernetes.md)\n  - [flannel cni 插件](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel)\n  - [更多 cni 插件](https://github.com/containernetworking/plugins)\n\n- `Flannel DaemonSet` yaml配置文件\n\n请阅读 `roles/flannel/templates/kube-flannel.yaml.j2` 内容，注意：\n\n+ 注意：本安装方式，flannel 通过 apiserver 接口读取 podCidr 信息，详见 https://github.com/coreos/flannel/issues/847；因此想要修改节点pod网段掩码，请在`clusters/xxxx/config.yml` 中修改`NODE_CIDR_LEN`配置项\n+ 配置相关RBAC 权限和 `service account`\n+ 配置`ConfigMap`包含 CNI配置和 flannel配置(指定backend等)，在文件中相关设置对应\n\n### 验证flannel网络\n\n执行flannel安装成功后可以验证如下：(需要等待镜像下载完成，有时候即便上一步已经配置了docker国内加速，还是可能比较慢，请确认以下容器运行起来以后，再执行后续验证步骤)\n\n``` bash\n# kubectl get pod --all-namespaces\nNAMESPACE     NAME                    READY     STATUS    RESTARTS   AGE\nkube-system   kube-flannel-ds-m8mzm   1/1       Running   0          3m\nkube-system   kube-flannel-ds-mnj6j   1/1       Running   0          3m\nkube-system   kube-flannel-ds-mxn6k   1/1       Running   0          3m\n```\n在集群创建几个测试pod:  `kubectl run test --image=busybox --replicas=3 sleep 30000`\n\n``` bash\n# kubectl get pod --all-namespaces -o wide|head -n 4\nNAMESPACE     NAME                    READY     STATUS    RESTARTS   AGE       IP             NODE\ndefault       busy-5956b54c8b-ld4gb   1/1       Running   0          9m        172.20.2.7     192.168.1.1\ndefault       busy-5956b54c8b-lj9l9   1/1       Running   0          9m        172.20.1.5     192.168.1.2\ndefault       busy-5956b54c8b-wwpkz   1/1       Running   0          9m        172.20.0.6     192.168.1.3\n\n# 查看路由\n# ip route\ndefault via 192.168.1.254 dev ens3 onlink \n192.168.1.0/24 dev ens3  proto kernel  scope link  src 192.168.1.1 \n172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown \n172.20.0.0/24 via 192.168.1.3 dev ens3 \n172.20.1.0/24 via 192.168.1.2 dev ens3 \n172.20.2.0/24 dev cni0  proto kernel  scope link  src 172.20.2.1 \n```\n在各节点上分别 ping 这三个POD IP地址，确保能通：\n\n``` bash\nping 172.20.2.7\nping 172.20.1.5\nping 172.20.0.6\n```\n\n"
  },
  {
    "path": "docs/setup/network-plugin/kube-ovn.md",
    "content": "## 06-安装kube-ovn网络组件.md\n\n(以下文档暂未更新，以插件官网文档为准)\n\n由灵雀云开源的网络组件 kube-ovn，将已被 openstack 社区采用的成熟网络虚拟化技术 ovs/ovn 引入 kubernetes 平台；为 kubernetes 网络打开了新的大门，令人耳目一新；强烈推荐大家试用该网络组件，反馈建议以帮助项目早日走向成熟。\n\n- 介绍 https://blog.csdn.net/alauda_andy/article/details/88886128\n- 项目地址 https://github.com/alauda/kube-ovn\n\n### 特性介绍\n\nkube-ovn 提供了针对企业应用场景下容器网络实用功能，并为实现更高级的网络管理控制提供了可能性；现有主要功能:\n\n- 1.Namespace 和子网的绑定，以及子网间的访问控制;\n- 2.静态IP分配;\n- 3.动态QoS;\n- 4.分布式和集中式网关;\n- 5.内嵌 LoadBalancer;\n- 6.Pod IP对外直接暴露\n- 7.流量镜像\n- 8.IPv6\n\n### kubeasz 集成安装 kube-ovn\n\nkube-ovn 的安装十分简单，详见项目的安装文档；基于 kubeasz，以下两步将安装一个集成了 kube-ovn 网络的 k8s 集群；\n\n- 在 ansible hosts 中设置变量 `CLUSTER_NETWORK=\"kube-ovn\"`\n- 执行安装 `ansible-playbook 90.setup.yml` 或者 `ezctl setup`\n\nkubeasz 项目为`kube-ovn`网络生成的 ansible role 如下：\n\n``` bash\nroles/kube-ovn\n├── defaults\n│   └── main.yml\t\t# kube-ovn 相关配置文件\n├── tasks\n│   └── main.yml\t\t# 安装执行文件\n└── templates\n    ├── crd.yaml.j2\t        # crd 模板\n    ├── kube-ovn.yaml.j2\t# kube-ovn yaml 模板\n    └── ovn.yaml.j2\t\t    # ovn yaml 模板\n    \n```\n\n安装成功后，可以验证所有 k8s 集群功能正常，查看集群的 pod 网络如下：\n\n```\n$ kubectl get pod --all-namespaces -o wide\nNAMESPACE     NAME                                    READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES\nkube-ovn      kube-ovn-cni-5php2                      1/1     Running   2          35h   192.168.1.43   192.168.1.43   <none>           <none>\nkube-ovn      kube-ovn-cni-7dwmx                      1/1     Running   2          35h   192.168.1.42   192.168.1.42   <none>           <none>\nkube-ovn      kube-ovn-cni-lhlvl                      1/1     Running   2          35h   192.168.1.41   192.168.1.41   <none>           <none>\nkube-ovn      kube-ovn-controller-57955db7b4-6x6hd    1/1     Running   0          35h   192.168.1.43   192.168.1.43   <none>           <none>\nkube-ovn      kube-ovn-controller-57955db7b4-chvz4    1/1     Running   0          35h   192.168.1.42   192.168.1.42   <none>           <none>\nkube-ovn      ovn-central-bb8747d77-tr5nz             1/1     Running   0          35h   192.168.1.41   192.168.1.41   <none>           <none>\nkube-ovn      ovs-ovn-2qhhr                           1/1     Running   0          35h   192.168.1.41   192.168.1.41   <none>           <none>\nkube-ovn      ovs-ovn-np8rn                           1/1     Running   0          35h   192.168.1.43   192.168.1.43   <none>           <none>\nkube-ovn      ovs-ovn-pkjw4                           1/1     Running   0          35h   192.168.1.42   192.168.1.42   <none>           <none>\nkube-system   coredns-55f46dd959-76qb5                1/1     Running   0          35h   10.16.0.12     192.168.1.42   <none>           <none>\nkube-system   coredns-55f46dd959-wn8kw                1/1     Running   0          35h   10.16.0.11     192.168.1.43   <none>           <none>\nkube-system   heapster-fdb7596d6-xmmrx                1/1     Running   0          35h   10.16.0.15     192.168.1.42   <none>           <none>\nkube-system   kubernetes-dashboard-68ddcc97fc-dwzbf   1/1     Running   0          35h   10.16.0.14     192.168.1.42   <none>           <none>\nkube-system   metrics-server-6c898b5b8b-zvct2         1/1     Running   0          35h   10.16.0.13     192.168.1.43   <none>           <none>\n```\n\n直观上 kube-ovn 与传统 k8s 网络（flannel/calico等）比较最大的不同是 pod 子网的分配：\n\n- 传统网络插件下，集群中 pod 一般是不同 node 节点分配不同的子网；然后通过 overlay 等技术打通不同 node 节点的 pod 子网；\n- kube-ovn 中 pod 网络根据其所在的 namespace 而定； namespace 在创建时可以根据 annotation 来配置它的子网/网关等参数；默认使用 10.16.0.0/16 的子网；\n\n### 测试 namespace 子网分配\n\n新建一个 subnet 并绑定 namespace 测试分配一个新的 pod 子网\n\n```\n# 创建一个 namespace: test-ns\n$ cat > test-ns.yaml << EOF\napiVersion: v1\nkind: Namespace\nmetadata:\n  annotations:\n  name: test-ns\nEOF\n$ kubectl apply -f test-ns.yaml\n\n# 创建一个 subnet: test-subnet 并绑定 namespace test-ns\n$ cat > test-subnet.yaml << EOF\napiVersion: kubeovn.io/v1\nkind: Subnet\nmetadata:\n  name: test-subnet\nspec:\n  protocol: IPv4\n  default: false\n  namespaces:\n  - test-ns\n  cidrBlock: 10.17.0.0/24\n  gateway: 10.17.0.1\n  excludeIps:\n  - 10.17.0.1..10.17.0.10\nEOF\n$ kubectl apply -f test-subnet.yaml\n\n# 在 test-ns 中创建 nginx 部署\n$ kubectl run -n test-ns nginx --image=nginx --replicas=2 --port=80 --expose\n\n# 在 default 中创建 busy 客户端\n$ kubectl run busy --image=busybox sleep 360000\n```\n\n创建成功后，查看 pod 地址的分配，可以看到确实 test-ns 中 pod 使用新的子网，而 default 中 pod 使用了默认子网，并验证 pod 之间的联通性（默认可通）\n\n```\n$ kubectl get pod --all-namespaces -o wide\nNAMESPACE     NAME                                    READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES\ndefault       busy-6c55ccddc5-qrm5j                   1/1     Running   0          31h   10.16.0.16     192.168.1.43   <none>           <none>\nkube-ovn      kube-ovn-cni-5php2                      1/1     Running   2          35h   192.168.1.43   192.168.1.43   <none>           <none>\nkube-ovn      kube-ovn-cni-7dwmx                      1/1     Running   2          35h   192.168.1.42   192.168.1.42   <none>           <none>\nkube-ovn      kube-ovn-cni-lhlvl                      1/1     Running   2          35h   192.168.1.41   192.168.1.41   <none>           <none>\nkube-ovn      kube-ovn-controller-57955db7b4-6x6hd    1/1     Running   0          35h   192.168.1.43   192.168.1.43   <none>           <none>\nkube-ovn      kube-ovn-controller-57955db7b4-chvz4    1/1     Running   0          35h   192.168.1.42   192.168.1.42   <none>           <none>\nkube-ovn      ovn-central-bb8747d77-tr5nz             1/1     Running   0          35h   192.168.1.41   192.168.1.41   <none>           <none>\nkube-ovn      ovs-ovn-2qhhr                           1/1     Running   0          35h   192.168.1.41   192.168.1.41   <none>           <none>\nkube-ovn      ovs-ovn-np8rn                           1/1     Running   0          35h   192.168.1.43   192.168.1.43   <none>           <none>\nkube-ovn      ovs-ovn-pkjw4                           1/1     Running   0          35h   192.168.1.42   192.168.1.42   <none>           <none>\nkube-system   coredns-55f46dd959-76qb5                1/1     Running   0          35h   10.16.0.12     192.168.1.42   <none>           <none>\nkube-system   coredns-55f46dd959-wn8kw                1/1     Running   0          35h   10.16.0.11     192.168.1.43   <none>           <none>\nkube-system   heapster-fdb7596d6-xmmrx                1/1     Running   0          35h   10.16.0.15     192.168.1.42   <none>           <none>\nkube-system   kubernetes-dashboard-68ddcc97fc-dwzbf   1/1     Running   0          35h   10.16.0.14     192.168.1.42   <none>           <none>\nkube-system   metrics-server-6c898b5b8b-zvct2         1/1     Running   0          35h   10.16.0.13     192.168.1.43   <none>           <none>\ntest-ns       nginx-755464dd6c-s6flj                  1/1     Running   0          31h   10.17.0.12     192.168.1.42   <none>           <none>\ntest-ns       nginx-755464dd6c-zct56                  1/1     Running   0          31h   10.17.0.11     192.168.1.43   <none>           <none>\n```\n\n- 更多的测试（pod网络QOS限速，namespace网络隔离等）请参考 kube-ovn 项目说明文档\n\n### 延伸阅读\n\n- [kube-ovn 官方文档](https://github.com/alauda/kube-ovn/tree/master/docs)\n- [从 Bridge 到 OVS，探索虚拟交换机](https://www.cnblogs.com/bakari/p/8097439.html)\n"
  },
  {
    "path": "docs/setup/network-plugin/kube-router.md",
    "content": "# kube-router 网络组件\n\n(以下文档暂未更新，以插件官网文档为准)\n\nkube-router是一个简单、高效的网络插件，它提供一揽子解决方案：  \n- 基于GoBGP 提供Pod 网络互联（Routing）\n- 使用ipsets优化的iptables 提供网络策略支持（Firewall/NetworkPolicy）\n- 基于IPVS/LVS 提供高性能服务代理（Service Proxy）(注：由于 k8s 新版本中 ipvs 已可用，因此这里不选择启用kube-router基于ipvs的service proxy)\n\n更多介绍请前往`https://github.com/cloudnativelabs/kube-router`\n\n## 配置\n\n本项目提供多种网络插件可选，如果需要安装kube-router，请在/etc/kubeasz/hosts文件中设置变量 `CLUSTER_NETWORK=\"kube-router\"`，更多设置请查看`roles/kube-router/defaults/main.yml`\n\n- kube-router需要在所有master节点和node节点安装\n\n## 安装\n\n- 单步安装已经集成：`ansible-playbook 90.setup.yml`\n- 分步安装请执行：`ansible-playbook 06.network.yml`\n\n## 验证\n\n- 1.pod间网络联通性：略\n\n- 2.host路由表\n\n``` bash\n# master上路由\nroot@master1:~$ ip route\n...\n172.20.1.0/24 via 192.168.1.2 dev ens3  proto 17 \n172.20.2.0/24 via 192.168.1.3 dev ens3  proto 17 \n...\n\n# node3上路由\nroot@node3:~$ ip route\n... \n172.20.0.0/24 via 192.168.1.1 dev ens3  proto 17 \n172.20.1.0/24 via 192.168.1.2 dev ens3  proto 17 \n172.20.2.0/24 dev kube-bridge  proto kernel  scope link  src 172.20.2.1 \n...\n```\n\n- 3.bgp连接状态\n\n``` bash\n# master上\nroot@master1:~$ netstat -antlp|grep router|grep LISH|grep 179\ntcp        0      0 192.168.1.1:179        192.168.1.3:58366      ESTABLISHED 26062/kube-router\ntcp        0      0 192.168.1.1:42537      192.168.1.2:179        ESTABLISHED 26062/kube-router\n\n# node3上\nroot@node3:~$ netstat -antlp|grep router|grep LISH|grep 179\ntcp        0      0 192.168.1.3:58366      192.168.1.1:179        ESTABLISHED 18897/kube-router\ntcp        0      0 192.168.1.3:179        192.168.1.2:43928      ESTABLISHED 18897/kube-router\n\n```\n\n- 4.NetworkPolicy有效性，验证参照[这里](../../guide/networkpolicy.md)\n\n- 5.ipset列表查看\n\n``` bash\n$ ipset list\n...\nName: kube-router-pod-subnets\nType: hash:net\nRevision: 6\nHeader: family inet hashsize 1024 maxelem 65536 timeout 0\nSize in memory: 672\nReferences: 2\nMembers:\n172.20.1.0/24 timeout 0\n172.20.2.0/24 timeout 0\n172.20.0.0/24 timeout 0\n\nName: kube-router-node-ips\nType: hash:ip\nRevision: 4\nHeader: family inet hashsize 1024 maxelem 65536 timeout 0\nSize in memory: 416\nReferences: 1\nMembers:\n192.168.1.1 timeout 0\n192.168.1.2 timeout 0\n192.168.1.3 timeout 0\n...\n```\n"
  },
  {
    "path": "docs/setup/network-plugin/network-check.md",
    "content": "# network-check\n\n网络测试组件，根据cilium connectivity-check 脚本修改而来；利用cronjob 定期检测集群各节点、容器、serviceip、nodeport等之间的网络联通性；可以方便的判断当前集群网络是否正常。\n\n目前检测如下：\n\n``` bash\nkubectl get cronjobs.batch -n network-test\nNAME                                  SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE\ntest01-pod-to-container               */5 * * * *   False     0        3m19s           6d3h\ntest02-pod-to-node-nodeport           */5 * * * *   False     0        3m19s           6d3h\ntest03-pod-to-multi-node-clusterip    */5 * * * *   False     1        6d3h            6d3h\ntest04-pod-to-multi-node-headless     */5 * * * *   False     1        6d3h            6d3h\ntest05-pod-to-multi-node-nodeport     */5 * * * *   False     1        6d3h            6d3h\ntest06-pod-to-external-1111           */5 * * * *   False     0        3m19s           6d3h\ntest07-pod-to-external-fqdn-baidu     */5 * * * *   False     0        3m19s           6d3h\ntest08-host-to-multi-node-clusterip   */5 * * * *   False     1        6d3h            6d3h\ntest09-host-to-multi-node-headless    */5 * * * *   False     1        6d3h            6d3h\n```\n\n+ 带`multi-node`的测试需要多节点集群才能运行，如果单节点集群，测试pod会处于`Pending`状态\n+ 带`external`的测试需要节点能够访问互联网，否则测试会失败\n\n## 启用网络检测\n\n- 下载额外容器镜像 `./ezdown -X network-check`\n\n- 配置集群，在配置文件`/etc/kubeasz/clusters/xxx/config.yml` (xxx为集群名) 修改如下选项\n\n```\n# network-check 自动安装\nnetwork_check_enabled: true\nnetwork_check_schedule: \"*/5 * * * *\"  # 检测频率，默认5分钟执行一次\n```\n\n- 安装网络检测插件 `docker exec -it kubeasz ezctl setup xxx 07`\n\n## 检查测试结果\n\n大约等待5分钟左右，查看运行结果，如果pod 状态为`Completed` 表示检测正常通过。\n\n```\nkubectl get pod -n network-test\nNAME                                                 READY   STATUS      RESTARTS   AGE\necho-server-58d7bb7f6-77ps6                          1/1     Running     0          6d4h\necho-server-host-cc87c966d-bk57t                     1/1     Running     0          6d4h\ntest01-pod-to-container-27606775-q6xlb               0/1     Completed   0          3m10s\ntest02-pod-to-node-nodeport-27606775-x2v5d           0/1     Completed   0          3m10s\ntest03-pod-to-multi-node-clusterip-27597895-cbq8d    0/1     Pending     0          6d4h\ntest04-pod-to-multi-node-headless-27597895-qzsgz     0/1     Pending     0          6d4h\ntest05-pod-to-multi-node-nodeport-27597895-kb5r7     0/1     Pending     0          6d4h\ntest06-pod-to-external-1111-27606775-p6v8s           0/1     Completed   0          3m10s\ntest07-pod-to-external-fqdn-baidu-27606775-qdfwd     0/1     Completed   0          3m10s\ntest08-host-to-multi-node-clusterip-27597895-qsgn9   0/1     Pending     0          6d4h\ntest09-host-to-multi-node-headless-27597895-hpkt5    0/1     Pending     0          6d4h\n```\n\n+ pod 状态为`Completed` 表示检测正常通过\n+ pod 状态为`Pending` 表示该检测需要多节点的k8s集群才会运行\n\n## 禁用网络检测\n\n如果集群已经开启网络检测，检测结果符合预期，并且不想继续循环检测时，只要删除对应namespace即可\n\n```\nkubectl delete ns network-test\n```\n"
  },
  {
    "path": "docs/setup/offline_install.md",
    "content": "# 离线安装集群\n\n使用kubeasz 离线安装 k8s集群需要下载四个部分：\n\n- kubeasz 项目代码\n- 二进制文件（k8s、etcd、containerd等组件）\n- 容器镜像文件（calico、coredns、metrics-server等容器镜像）\n- 系统软件安装包（ipset、libseccomp2等，仅无法使用本地yum/apt源时需要）\n\n## 离线文件准备\n\n在一台能够访问互联网的服务器上执行：\n\n- 下载工具脚本ezdown，举例使用kubeasz版本3.6.0\n\n``` bash\nexport release=3.6.0\nwget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown\nchmod +x ./ezdown\n```\n\n- 使用工具脚本下载（更多关于ezdown的参数，运行./ezdown 查看）\n\n下载kubeasz代码、二进制、默认容器镜像\n\n``` bash\n# 国内环境\n./ezdown -D\n```\n\n[可选]如果需要更多组件，请下载额外容器镜像（cilium,flannel,prometheus等）\n\n``` bash\n./ezdown -X flannel\n./ezdown -X prometheus\n...\n```\n\n下载离线系统包 (适用于无法使用yum/apt仓库情形)\n\n``` bash\n# 如果操作系统是ubuntu 22.04\n./ezdown -P ubuntu_22\n```\n\n上述脚本运行成功后，所有文件（kubeasz代码、二进制、离线镜像）均已整理好放入目录`/etc/kubeasz`\n\n- `/etc/kubeasz` 包含 kubeasz 版本为 ${release} 的发布代码\n- `/etc/kubeasz/bin` 包含 k8s/etcd/docker/cni 等二进制文件\n- `/etc/kubeasz/down` 包含集群安装时需要的离线容器镜像\n- `/etc/kubeasz/down/packages` 包含集群安装时需要的系统基础软件\n\n## 离线安装\n\n上述下载完成后，把`/etc/kubeasz`整个目录复制到目标离线服务器相同目录，然后在离线服务器/etc/kubeasz目录下执行：\n\n- 离线安装 docker，检查本地文件，正常会提示所有文件已经下载完成，并上传到本地私有镜像仓库\n\n```\n./ezdown -D\n./ezdown -X flannel\n./ezdown -X prometheus\n...\n```\n\n- 启动 kubeasz 容器\n\n```\n./ezdown -S\n```\n\n- 设置参数允许离线安装系统软件包\n\n```\nsed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: \"offline\"/g' /etc/kubeasz/example/config.yml \n```\n\n- 举例安装单节点集群，参考 https://github.com/easzlab/kubeasz/blob/master/docs/setup/quickStart.md\n\n``` bash\nsource ~/.bashrc\ndk ezctl start-aio\n# 或者执行 docker exec -it kubeasz ezctl start-aio\n```\n\n- 多节点集群，进入kubeasz 容器内 `docker exec -it kubeasz bash`，参考https://github.com/easzlab/kubeasz/blob/master/docs/setup/00-planning_and_overall_intro.md 进行集群规划和设置后使用./ezctl 命令安装\n\n"
  },
  {
    "path": "docs/setup/quickStart.md",
    "content": "## 快速指南\n\n本文档适用于kubeasz 3.3.1以上版本，部署单节点集群(aio)，作为快速体验k8s集群的测试环境。\n\n### 1.基础系统配置\n\n- 准备一台虚机配置内存4G/硬盘30G以上\n- 最小化安装`Ubuntu 22.04 server`\n- 配置基础网络、更新源、SSH登录等\n\n**注意:** 确保在干净的系统上开始安装，不能使用曾经装过kubeadm或其他k8s发行版的环境\n\n### 2.下载文件\n\n- 下载工具脚本ezdown，举例使用kubeasz版本3.6.7\n\n``` bash\nexport release=3.6.7\nwget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown\nchmod +x ./ezdown\n```\n\n- 使用工具脚本下载（更多关于ezdown的参数，运行./ezdown 查看）\n\n下载kubeasz代码、二进制、默认容器镜像\n\n``` bash\n# 国内环境\n./ezdown -D\n# 海外环境\n#./ezdown -D -m standard\n```\n\n【可选】下载额外容器镜像（cilium,flannel,prometheus等）\n\n``` bash\n# 按需下载\n./ezdown -X dashboard\n./ezdown -X prometheus\n...\n```\n\n【可选】下载离线系统包 (适用于无法使用yum/apt仓库情形)\n\n``` bash\n./ezdown -P\n```\n\n上述脚本运行成功后，所有文件（kubeasz代码、二进制、离线镜像）均已整理好放入目录`/etc/kubeasz`\n\n- `/etc/kubeasz` 包含 kubeasz 版本为 ${release} 的发布代码\n- `/etc/kubeasz/bin` 包含 k8s/etcd/docker/cni 等二进制文件\n- `/etc/kubeasz/down` 包含集群安装时需要的离线容器镜像\n- `/etc/kubeasz/down/packages` 包含集群安装时需要的系统基础软件\n\n### 3.安装集群\n\n- 容器化运行 kubeasz\n\n```\n./ezdown -S\n```\n\n- 使用默认配置安装 aio 集群\n\n```\ndocker exec -it kubeasz ezctl start-aio\n# 如果安装失败，查看日志排除后，使用如下命令重新安装aio集群\n# docker exec -it kubeasz ezctl setup default all\n```\n\n### 4.验证安装\n\n``` bash\n$ source ~/.bashrc\n$ kubectl version         # 验证集群版本     \n$ kubectl get node        # 验证节点就绪 (Ready) 状态\n$ kubectl get pod -A      # 验证集群pod状态，默认已安装网络插件、coredns、metrics-server等\n$ kubectl get svc -A      # 验证集群服务状态\n```\n\n- 登录 `dashboard`可以查看和管理集群，更多内容请查阅[dashboard文档](../guide/dashboard.md)\n\n### 5.清理\n\n以上步骤创建的K8S开发测试环境请尽情折腾，碰到错误尽量通过查看日志、上网搜索、提交`issues`等方式解决；当然你也可以清理集群后重新创建。\n\n在宿主机上，按照如下步骤清理\n\n- 清理集群 `docker exec -it kubeasz ezctl destroy default`\n- 重启节点，以确保清理残留的虚拟网卡、路由等信息\n"
  },
  {
    "path": "example/config.yml",
    "content": "############################\n# prepare\n############################\n# 可选离线安装系统软件包 (offline|online)\nINSTALL_SOURCE: \"online\"\n\n# 可选进行系统安全加固 github.com/dev-sec/ansible-collection-hardening\n# (deprecated) 未更新上游项目，未验证最新k8s集群安装，不建议启用\nOS_HARDEN: false\n\n\n############################\n# role:deploy\n############################\n# default: ca will expire in 100 years\n# default: certs issued by the ca will expire in 50 years\nCA_EXPIRY: \"876000h\"\nCERT_EXPIRY: \"438000h\"\n\n# force to recreate CA and other certs, not suggested to set 'true'\nCHANGE_CA: false\n\n# kubeconfig 配置参数\nCLUSTER_NAME: \"cluster1\"\nCONTEXT_NAME: \"context-{{ CLUSTER_NAME }}\"\n\n# k8s version\nK8S_VER: \"__k8s_ver__\"\n\n# set unique 'k8s_nodename' for each node, if not set(default:'') ip add will be used\n# CAUTION: 'k8s_nodename' must consist of lower case alphanumeric characters, '-' or '.',\n# and must start and end with an alphanumeric character (e.g. 'example.com'),\n# regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*'\nK8S_NODENAME: \"{%- if k8s_nodename != '' -%} \\\n                    {{ k8s_nodename|replace('_', '-')|lower }} \\\n               {%- else -%} \\\n                    k8s-{{ inventory_hostname|replace('.', '-') }} \\\n               {%- endif -%}\"\n\n# use 'K8S_NODENAME' to set hostname\nENABLE_SETTING_HOSTNAME: true\n\n\n############################\n# role:etcd\n############################\n# 设置不同的wal目录，可以避免磁盘io竞争，提高性能\nETCD_DATA_DIR: \"/var/lib/etcd\"\nETCD_WAL_DIR: \"\"\n\n\n############################\n# role:runtime [containerd,docker]\n############################\n# [.]启用拉取加速镜像仓库\nENABLE_MIRROR_REGISTRY: true\n\n# [.]添加信任的私有仓库\n# 必须按照如下示例格式，协议头'http://'和'https://'不能省略\nINSECURE_REG:\n  - \"http://easzlab.io.local:5000\"\n  - \"https://reg.yourcompany.com\"\n\n# [.]基础容器镜像\nSANDBOX_IMAGE: \"easzlab.io.local:5000/easzlab/pause:__pause__\"\n\n# [containerd] root 存储目录，默认：/var/lib/containerd\nCONTAINERD_ROOT_DIR: \"/var/lib/containerd\"\n\n# [containerd] state 存储目录，默认：/run/containerd\nCONTAINERD_STATE_DIR: \"/run/containerd\"\n\n# [containerd] config 目录，默认：/etc/containerd\nCONTAINERD_CONFIG_DIR: \"/etc/containerd\"\n\n# [containerd] systemd service 名称，默认：containerd.service\nCONTAINERD_SERVICE_NAME: \"containerd.service\"\n\n# [docker]容器存储目录\nDOCKER_STORAGE_DIR: \"/var/lib/docker\"\n\n# [docker]开启Restful API\nDOCKER_ENABLE_REMOTE_API: false\n\n\n############################\n# role:kube-master\n############################\n# k8s 集群 master 节点证书配置，可以添加多个ip和域名（比如增加公网ip和域名）\nMASTER_CERT_HOSTS:\n  - \"10.1.1.1\"\n  - \"k8s.easzlab.io\"\n  #- \"www.test.com\"\n\n# node 节点上 pod 网段掩码长度（决定每个节点最多能分配的pod ip地址）\n# 如果flannel 使用 --kube-subnet-mgr 参数，那么它将读取该设置为每个节点分配pod网段\n# https://github.com/coreos/flannel/issues/847\nNODE_CIDR_LEN: 24\n\n# 是否启用集群audit功能\nENABLE_CLUSTER_AUDIT: false\n\n############################\n# role:kube-node\n############################\n# Kubelet 根目录\nKUBELET_ROOT_DIR: \"/var/lib/kubelet\"\n\n# node节点最大pod 数\nMAX_PODS: 110\n\n# 配置为kube组件（kubelet,kube-proxy,dockerd等）预留的资源量\n# 数值设置详见templates/kubelet-config.yaml.j2\nKUBE_RESERVED_ENABLED: \"no\"\n\n# k8s 官方不建议草率开启 system-reserved, 除非你基于长期监控，了解系统的资源占用状况；\n# 并且随着系统运行时间，需要适当增加资源预留，数值设置详见templates/kubelet-config.yaml.j2\n# 系统预留设置基于 4c/8g 虚机，最小化安装系统服务，如果使用高性能物理机可以适当增加预留\n# 另外，集群安装时候apiserver等资源占用会短时较大，建议至少预留1g内存\nSYS_RESERVED_ENABLED: \"no\"\n\n\n############################\n# role:network [flannel,calico,cilium,kube-ovn,kube-router]\n############################\n# ------------------------------------------- flannel\n# [flannel]设置flannel 后端\"host-gw\",\"vxlan\"等\nFLANNEL_BACKEND: \"vxlan\"\nDIRECT_ROUTING: false\n\n# [flannel] \nflannel_ver: \"__flannel__\"\n\n# ------------------------------------------- calico\n# 模式可选项有: [Always, CrossSubnet, Never],跨子网可以配置为Always与CrossSubnet\n# CrossSubnet为隧道+BGP路由混合模式可以提升网络性能，同子网配置为Never即可.\n# 公有云建议使用always比较省事，其他的话需要修改各自公有云的网络配置，具体可以参考各个公有云说明\nCALICO_ENABLE_OVERLAY: \"Always\"\n\n# [calico]设置 calico-node使用的host IP，bgp邻居通过该地址建立，可手工指定也可以自动发现\nIP_AUTODETECTION_METHOD: \"can-reach={{ groups['kube_master'][0] }}\"\n\n# [calico]设置calico 网络 backend: bird, vxlan, none\n# 少数公有云（Azure）或者私有云不支持IPinIP封包，可以使用 vxlan 模式\nCALICO_NETWORKING_BACKEND: \"bird\"\n\n# [calico]设置calico 是否使用route reflectors\n# 如果集群规模超过50个节点，建议启用该特性\nCALICO_RR_ENABLED: false\n\n# CALICO_RR_NODES 配置route reflectors的节点，如果未设置默认使用集群master节点 \n# CALICO_RR_NODES: [\"192.168.1.1\", \"192.168.1.2\"]\nCALICO_RR_NODES: []\n\n# [calico]更新支持calico 版本: [\"3.19\", \"3.23\"]\ncalico_ver: \"__calico__\"\n\n# [calico]calico 主版本\ncalico_ver_main: \"{{ calico_ver.split('.')[0] }}.{{ calico_ver.split('.')[1] }}\"\n\n# ------------------------------------------- cilium\n# [cilium]镜像版本\ncilium_ver: \"__cilium__\"\ncilium_connectivity_check: false\ncilium_hubble_enabled: false\ncilium_hubble_ui_enabled: false\n\n# ------------------------------------------- kube-ovn\n# [kube-ovn]离线镜像tar包\nkube_ovn_ver: \"__kube_ovn__\"\n\n# ------------------------------------------- kube-router\n# [kube-router]公有云上存在限制，一般需要始终开启 ipinip；自有环境可以设置为 \"subnet\"\nOVERLAY_TYPE: \"full\"\n\n# [kube-router]NetworkPolicy 支持开关\nFIREWALL_ENABLE: true\n\n# [kube-router]kube-router 镜像版本\nkube_router_ver: \"__kube_router__\"\n\n\n############################\n# role:cluster-addon\n############################\n# coredns 自动安装\ndns_install: \"yes\"\ncorednsVer: \"__coredns__\"\nENABLE_LOCAL_DNS_CACHE: true\ndnsNodeCacheVer: \"__dns_node_cache__\"\n# 设置 local dns cache 地址\nLOCAL_DNS_CACHE: \"169.254.20.10\"\n\n# metric server 自动安装\nmetricsserver_install: \"yes\"\nmetricsVer: \"__metrics__\"\n\n# dashboard 自动安装\ndashboard_install: \"no\"\ndashboardVer: \"__dashboard__\"\n\n# local-storage (local-path-provisioner) 自动安装\nlocal_path_provisioner_install: \"no\"\nlocal_path_provisioner_ver: \"__local_path_provisioner__\"\nlocal_path_storage_class: \"local-path\"\n# 设置默认本地存储路径\nlocal_path_provisioner_dir: \"/opt/local-path-provisioner\"\n\n# nfs-provisioner 自动安装\nnfs_provisioner_install: \"no\"\nnfs_provisioner_namespace: \"kube-system\"\nnfs_provisioner_ver: \"__nfs_provisioner__\"\nnfs_storage_class: \"managed-nfs-storage\"\nnfs_server: \"192.168.1.10\"\nnfs_path: \"/data/nfs\"\n\n# openebs 自动安装\nopenebs_install: \"no\"\nopenebs_ver: \"__openebs_ver__\"\nopenebs_namespace: \"openebs\"\nopenebs_hostpath: \"/var/openebs/local\"\nopenebs_hostpath_storage_class: \"openebs-hostpath\"\nopenebs_lvm_storage_class: \"openebs-lvmpv\"\nopenebs_lvm_vg: \"vg_k8s\"\n\n# prometheus 自动安装\nprom_install: \"no\"\nprom_namespace: \"monitor\"\nprom_storage_class: \"\"\nprom_chart_ver: \"__prom_chart__\"\n\n# minio 自动安装\nminio_install: \"no\"\nminio_namespace: \"minio\"\nminio_storage_class: \"{{ openebs_lvm_storage_class }}\"\nminio_chart_ver: \"__minio_chart__\"\nminio_root_user: \"3aea61ca94177dx\"\nminio_root_password: \"0f3b19e46dd3aea61ca94177d\"\n# 单机版=1，集群版=4以上\nminio_pool_servers: 4\nminio_pool_size: 10Gi\n# 是否启用tls证书，如果未启用则使用http协议\nminio_tls_enabled: false\n# 是否使用权威证书，如果使用需要提前把证书放到目录 roles/cluster-addon/templates/minio/; 并且要求\n# 证书和私钥的名称分别为server.crt和server.key\nminio_with_global_cert: false\n\n# nacos 自动安装\nnacos_install: \"no\"\nnacos_namespace: \"nacos\"\nnacos_mysql_host: \"semisync-mysql-cluster-mysql\"\nnacos_mysql_db: \"nacos\"\nnacos_mysql_port: \"3306\"\nnacos_mysql_user: \"__dbuser__\"\nnacos_mysql_password: \"__yourpassword__\"\nnacos_storage_class: \"{{ openebs_lvm_storage_class }}\"\n\n# rocketmq 自动安装\nrocketmq_install: \"no\"\nrocketmq_namespace: \"rocketmq\"\nrocketmq_storage_class: \"{{ openebs_lvm_storage_class }}\"\n\n# network-check 自动安装\nnetwork_check_enabled: false \nnetwork_check_schedule: \"*/5 * * * *\"\n\n# kubeblocks 自动安装\nkubeblocks_ver: \"__kubeblocks_ver__\"\nkubeblocks_install: \"no\"\n\n# ingress-nginx 自动安装\n# ingress-nginx 只会部署到node with 标签：ingress-controller/provider=ingress-nginx\ningress_nginx_install: \"no\"\ningress_nginx_namespace: \"ingress-nginx\"\ningress_nginx_ver: \"__ingress_nginx_ver__\"\ningress_nginx_metrics_enabled: true  # 需要先部署prometheus\n\n# argocd 自动安装\nargocd_install: \"no\"\n\n\n############################\n# role:harbor\n############################\n# harbor version，完整版本号\nHARBOR_VER: \"__harbor__\"\nHARBOR_DOMAIN: \"harbor.easzlab.io.local\"\nHARBOR_PATH: /var/data\nHARBOR_TLS_PORT: 8443\nHARBOR_REGISTRY: \"{{ HARBOR_DOMAIN }}:{{ HARBOR_TLS_PORT }}\"\n\n# if set 'false', you need to put certs named harbor.pem and harbor-key.pem in directory 'down'\nHARBOR_SELF_SIGNED_CERT: true\n\n# install extra component\nHARBOR_WITH_TRIVY: false\n"
  },
  {
    "path": "example/hosts.allinone",
    "content": "# 'etcd' cluster should have odd member(s) (1,3,5,...)\n[etcd]\n192.168.1.1\n\n# master node(s), set unique 'k8s_nodename' for each node\n# CAUTION: 'k8s_nodename' must consist of lower case alphanumeric characters, '-' or '.',\n# and must start and end with an alphanumeric character\n[kube_master]\n192.168.1.1\n\n# work node(s), set unique 'k8s_nodename' for each node\n# CAUTION: 'k8s_nodename' must consist of lower case alphanumeric characters, '-' or '.',\n# and must start and end with an alphanumeric character\n[kube_node]\n192.168.1.1 k8s_nodename=''\n\n# [optional] harbor server, a private docker registry\n# 'NEW_INSTALL': 'true' to install a harbor server; 'false' to integrate with existed one\n[harbor]\n#192.168.1.8 NEW_INSTALL=false\n\n# [optional] loadbalance for accessing k8s from outside\n[ex_lb]\n#192.168.1.6 LB_ROLE=backup EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443\n#192.168.1.7 LB_ROLE=master EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443\n\n# [optional] ntp server for the cluster\n[chrony]\n#192.168.1.1\n\n[all:vars]\n# --------- Main Variables ---------------\n# Secure port for apiservers\nSECURE_PORT=\"6443\"\n\n# Cluster container-runtime supported: docker, containerd\n# if k8s version >= 1.24, docker is not supported\nCONTAINER_RUNTIME=\"containerd\"\n\n# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn\nCLUSTER_NETWORK=\"calico\"\n\n# Service proxy mode of kube-proxy: 'iptables' or 'ipvs'\nPROXY_MODE=\"ipvs\"\n\n# K8S Service CIDR, not overlap with node(host) networking\nSERVICE_CIDR=\"10.68.0.0/16\"\n\n# Cluster CIDR (Pod CIDR), not overlap with node(host) networking\nCLUSTER_CIDR=\"172.20.0.0/16\"\n\n# NodePort Range\nNODE_PORT_RANGE=\"30000-32767\"\n\n# Cluster DNS Domain\nCLUSTER_DNS_DOMAIN=\"cluster.local\"\n\n# -------- Additional Variables (don't change the default value right now)---\n# Binaries Directory\nbin_dir=\"/opt/kube/bin\"\n\n# Deploy Directory (kubeasz workspace)\nbase_dir=\"/etc/kubeasz\"\n\n# Directory for a specific cluster\ncluster_dir=\"{{ base_dir }}/clusters/_cluster_name_\"\n\n# CA and other components cert/key Directory\nca_dir=\"/etc/kubernetes/ssl\"\n\n# Default 'k8s_nodename' is empty\nk8s_nodename=''\n\n# Default python interpreter\nansible_python_interpreter=/usr/bin/python3\n"
  },
  {
    "path": "example/hosts.multi-node",
    "content": "# 'etcd' cluster should have odd member(s) (1,3,5,...)\n[etcd]\n192.168.1.1\n192.168.1.2\n192.168.1.3\n\n# master node(s), set unique 'k8s_nodename' for each node\n# CAUTION: 'k8s_nodename' must consist of lower case alphanumeric characters, '-' or '.',\n# and must start and end with an alphanumeric character\n[kube_master]\n192.168.1.1 k8s_nodename='master-01'\n192.168.1.2 k8s_nodename='master-02'\n192.168.1.3 k8s_nodename='master-03'\n\n# work node(s), set unique 'k8s_nodename' for each node\n# CAUTION: 'k8s_nodename' must consist of lower case alphanumeric characters, '-' or '.',\n# and must start and end with an alphanumeric character\n[kube_node]\n192.168.1.4 k8s_nodename='worker-01'\n192.168.1.5 k8s_nodename='worker-02'\n\n# [optional] harbor server, a private docker registry\n# 'NEW_INSTALL': 'true' to install a harbor server; 'false' to integrate with existed one\n[harbor]\n#192.168.1.8 NEW_INSTALL=false\n\n# [optional] loadbalance for accessing k8s from outside\n[ex_lb]\n#192.168.1.6 LB_ROLE=backup EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443\n#192.168.1.7 LB_ROLE=master EX_APISERVER_VIP=192.168.1.250 EX_APISERVER_PORT=8443\n\n# [optional] ntp server for the cluster\n[chrony]\n#192.168.1.1\n\n[all:vars]\n# --------- Main Variables ---------------\n# Secure port for apiservers\nSECURE_PORT=\"6443\"\n\n# Cluster container-runtime supported: docker, containerd\n# if k8s version >= 1.24, docker is not supported\nCONTAINER_RUNTIME=\"containerd\"\n\n# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn\nCLUSTER_NETWORK=\"calico\"\n\n# Service proxy mode of kube-proxy: 'iptables' or 'ipvs'\nPROXY_MODE=\"ipvs\"\n\n# K8S Service CIDR, not overlap with node(host) networking\nSERVICE_CIDR=\"10.68.0.0/16\"\n\n# Cluster CIDR (Pod CIDR), not overlap with node(host) networking\nCLUSTER_CIDR=\"172.20.0.0/16\"\n\n# NodePort Range\nNODE_PORT_RANGE=\"30000-32767\"\n\n# Cluster DNS Domain\nCLUSTER_DNS_DOMAIN=\"cluster.local\"\n\n# -------- Additional Variables (don't change the default value right now) ---\n# Binaries Directory\nbin_dir=\"/opt/kube/bin\"\n\n# Deploy Directory (kubeasz workspace)\nbase_dir=\"/etc/kubeasz\"\n\n# Directory for a specific cluster\ncluster_dir=\"{{ base_dir }}/clusters/_cluster_name_\"\n\n# CA and other components cert/key Directory\nca_dir=\"/etc/kubernetes/ssl\"\n\n# Default 'k8s_nodename' is empty\nk8s_nodename=''\n\n# Default python interpreter\nansible_python_interpreter=/usr/bin/python3\n"
  },
  {
    "path": "ezctl",
    "content": "#!/bin/bash\n#  Create & manage k8s clusters\n#  shellcheck disable=SC2155\n\nset -o nounset\nset -o errexit\n#set -o xtrace\n\nfunction usage() {\n    echo -e \"\\033[33mUsage:\\033[0m ezctl COMMAND [args]\"\n    cat <<EOF\n-------------------------------------------------------------------------------------\nCluster setups:\n    list\t\t             to list all of the managed clusters\n    checkout    <cluster>            to switch default kubeconfig of the cluster\n    new         <cluster>            to start a new k8s deploy with name 'cluster'\n    setup       <cluster>  <step>    to setup a cluster, also supporting a step-by-step way\n    start       <cluster>            to start all of the k8s services stopped by 'ezctl stop'\n    stop        <cluster>            to stop all of the k8s services temporarily\n    upgrade     <cluster>            to upgrade the k8s cluster\n    destroy     <cluster>            to destroy the k8s cluster\n    backup      <cluster>            to backup the cluster state (etcd snapshot)\n    restore     <cluster>            to restore the cluster state from backups\n    start-aio\t\t             to quickly setup an all-in-one cluster with default settings\n\nCluster ops:\n    add-etcd    <cluster>  <ip>      to add a etcd-node to the etcd cluster\n    add-master  <cluster>  <ip>      to add a master node to the k8s cluster\n    add-node    <cluster>  <ip>      to add a work node to the k8s cluster\n    del-etcd    <cluster>  <ip>      to delete a etcd-node from the etcd cluster\n    del-master  <cluster>  <ip>      to delete a master node from the k8s cluster\n    del-node    <cluster>  <ip>      to delete a work node from the k8s cluster\n\nExtra operation:\n    kca-renew   <cluster>            to force renew CA certs and all the other certs (with caution)\n    kcfg-adm    <cluster>  <args>    to manage client kubeconfig of the k8s cluster\n\nUse \"ezctl help <command>\" for more information about a given command.\nEOF\n}\n\nfunction logger() {\n    TIMESTAMP=$(date +'%Y-%m-%d %H:%M:%S')\n    local FNAME=$(basename \"${BASH_SOURCE[1]}\")\n    local SOURCE=\"\\033[36m[$FNAME:${BASH_LINENO[0]}]\\033[0m\"\n    case \"$1\" in\n        debug)\n            echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[36mDEBUG $2\\033[0m\"\n            ;;\n        info)\n            echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[32mINFO $2\\033[0m\"\n            ;;\n        warn)\n            echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[33mWARN $2\\033[0m\"\n            ;;\n        error)\n            echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[31mERROR $2\\033[0m\"\n            ;;\n        *) ;;\n    esac\n}\n\nfunction help-info() {\n    case \"$1\" in\n        (setup)\n\t    usage-setup\n            ;;\n        (add-etcd)\n            echo -e \"read more > 'https://github.com/easzlab/kubeasz/blob/master/docs/op/op-etcd.md'\"\n            ;;\n        (add-master)\n            echo -e \"read more > 'https://github.com/easzlab/kubeasz/blob/master/docs/op/op-master.md'\"\n            ;;\n        (add-node)\n            echo -e \"read more > 'https://github.com/easzlab/kubeasz/blob/master/docs/op/op-node.md'\"\n            ;;\n        (del-etcd)\n            echo -e \"read more > 'https://github.com/easzlab/kubeasz/blob/master/docs/op/op-etcd.md'\"\n            ;;\n        (del-master)\n            echo -e \"read more > 'https://github.com/easzlab/kubeasz/blob/master/docs/op/op-master.md'\"\n            ;;\n        (del-node)\n            echo -e \"read more > 'https://github.com/easzlab/kubeasz/blob/master/docs/op/op-node.md'\"\n            ;;\n        (kca-renew)\n\t    echo -e \"WARNNING: this command should be used with caution\"\n\t    echo -e \"force to recreate CA certs and all of the others certs used in the cluster\"\n\t    echo -e \"it should be used only when the admin.conf leaked\"\n            ;;\n        (kcfg-adm)\n\t    usage-kcfg-adm\n            ;;\n        (*)\n            echo -e \"todo: help info $1\"\n            ;;\n    esac\n}\n\nfunction usage-kcfg-adm(){\n  echo -e \"\\033[33mUsage:\\033[0m ezctl kcfg-adm <cluster> <args>\"\n  cat <<EOF\navailable <args>:\n    -A     to add a client kubeconfig with a newly created user\n    -D     to delete a client kubeconfig with the existed user\n    -L     to list all of the users\n    -e     to set expiry of the user certs in hours (ex. 24h, 8h, 240h)\n    -t     to set a user-type (admin or view)\n    -u     to set a user-name prefix\n\nexamples: ./ezctl kcfg-adm test-k8s -L\n          ./ezctl kcfg-adm default -A -e 240h -t admin -u jack\n          ./ezctl kcfg-adm default -D -u jim-202101162141\nEOF\n}\n\nfunction usage-setup(){\n  echo -e \"\\033[33mUsage:\\033[0m ezctl setup <cluster> <step>\"\n  cat <<EOF\navailable steps:\n    01  prepare            to prepare CA/certs & kubeconfig & other system settings\n    02  etcd               to setup the etcd cluster\n    03  container-runtime  to setup the container runtime(docker or containerd)\n    04  kube-master        to setup the master nodes\n    05  kube-node          to setup the worker nodes\n    06  network            to setup the network plugin\n    07  cluster-addon      to setup other useful plugins\n    90  all                to run 01~07 all at once\n    10  ex-lb              to install external loadbalance for accessing k8s from outside\n    11  harbor             to install a new harbor server or to integrate with an existed one\n\nexamples: ./ezctl setup test-k8s 01  (or ./ezctl setup test-k8s prepare)\n\t  ./ezctl setup test-k8s 02  (or ./ezctl setup test-k8s etcd)\n          ./ezctl setup test-k8s all\n          ./ezctl setup test-k8s 04 -t restart_master\nEOF\n}\n\n### Cluster setups functions ##############################\n\nfunction new() {\n    # check if already existed\n    [[ -d \"clusters/$1\" ]] && { logger error \"cluster:$1 already existed, if cluster:$1 setup failed, try 'rm -rf $BASE/clusters/$1' first!\"; exit 1; }\n\n    logger debug \"generate custom cluster files in $BASE/clusters/$1\"\n    mkdir -p \"clusters/$1\"\n    cp example/hosts.multi-node \"clusters/$1/hosts\"\n    sed -i \"s/_cluster_name_/$1/g\" \"clusters/$1/hosts\"\n    cp example/config.yml \"clusters/$1/config.yml\"\n\n    logger debug \"set versions\"\n    # these variables were imported with eval and have the same name in ezdown\n    eval $(sed '/V.[rR]=.*\\./!d' ezdown)\n    k8sVer=$(echo \"$K8S_BIN_VER\"|sed 's/v//g')\n    registryMirror=true\n\n    grep registry-mirrors /etc/docker/daemon.json > /dev/null 2>&1 || { logger debug \"disable registry mirrors\"; registryMirror=false; }\n\n    sed -i -e \"s/__k8s_ver__/$k8sVer/g\" \\\n       -e \"s/__flannel__/$flannelVer/g\" \\\n\t   -e \"s/__calico__/$calicoVer/g\" \\\n\t   -e \"s/__cilium__/$ciliumVer/g\" \\\n\t   -e \"s/__kube_ovn__/$kubeOvnVer/g\" \\\n\t   -e \"s/__kube_router__/$kubeRouterVer/g\" \\\n\t   -e \"s/__coredns__/$corednsVer/g\" \\\n\t   -e \"s/__pause__/$pauseVer/g\" \\\n\t   -e \"s/__dns_node_cache__/$dnsNodeCacheVer/g\" \\\n\t   -e \"s/__dashboard__/$dashboardVer/g\" \\\n\t   -e \"s/__local_path_provisioner__/$localpathProvisionerVer/g\" \\\n\t   -e \"s/__nfs_provisioner__/$nfsProvisionerVer/g\" \\\n\t   -e \"s/__openebs_ver__/$openebsVer/g\" \\\n\t   -e \"s/__prom_chart__/$promChartVer/g\" \\\n\t   -e \"s/__minio_chart__/$minioOperatorVer/g\" \\\n\t   -e \"s/__kubeblocks_ver__/$kubeblocksVer/g\" \\\n\t   -e \"s/__ingress_nginx_ver__/$ingressNginxVer/g\" \\\n\t   -e \"s/__harbor__/$HARBOR_VER/g\" \\\n\t   -e \"s/^ENABLE_MIRROR_REGISTRY.*$/ENABLE_MIRROR_REGISTRY: $registryMirror/g\" \\\n\t   -e \"s/__metrics__/$metricsVer/g\" \"clusters/$1/config.yml\"\n\n\n    logger debug \"cluster $1: files successfully created.\"\n    logger info \"next steps 1: to config '$BASE/clusters/$1/hosts'\"\n    logger info \"next steps 2: to config '$BASE/clusters/$1/config.yml'\"\n}\n\nfunction setup() {\n    [[ -d \"clusters/$1\" ]] || { logger error \"invalid config, run 'ezctl new $1' first\"; return 1; }\n    [[ -f \"bin/kube-apiserver\" ]] || { logger error \"no binaries founded, run 'ezdown -D' fist\"; return 1; }\n\n    # for extending usage\n    EXTRA_ARGS=$(echo \"$*\"|sed \"s/$1 $2//g\"|sed \"s/^ *//g\")\n\n    PLAY_BOOK=\"dummy.yml\"\n    case \"$2\" in\n      (01|prepare)\n          PLAY_BOOK=\"01.prepare.yml\"\n          ;;\n      (02|etcd)\n          PLAY_BOOK=\"02.etcd.yml\"\n          ;;\n      (03|container-runtime)\n          PLAY_BOOK=\"03.runtime.yml\"\n          ;;\n      (04|kube-master)\n          PLAY_BOOK=\"04.kube-master.yml\"\n          ;;\n      (05|kube-node)\n          PLAY_BOOK=\"05.kube-node.yml\"\n          ;;\n      (06|network)\n          PLAY_BOOK=\"06.network.yml\"\n          ;;\n      (07|cluster-addon)\n          PLAY_BOOK=\"07.cluster-addon.yml\"\n          ;;\n      (90|all)\n          PLAY_BOOK=\"90.setup.yml\"\n          ;;\n      (10|ex-lb)\n          PLAY_BOOK=\"10.ex-lb.yml\"\n          ;;\n      (11|harbor)\n          PLAY_BOOK=\"11.harbor.yml\"\n          ;;\n      (*)\n          usage-setup\n          exit 1\n          ;;\n    esac\n\n    COMMAND=\"ansible-playbook -i clusters/$1/hosts -e @clusters/$1/config.yml $EXTRA_ARGS playbooks/$PLAY_BOOK\"\n    echo \"$COMMAND\"\n\n    k8s_ver=$(bin/kube-apiserver --version|cut -d' ' -f2)\n    etcd_ver=v$(bin/etcd --version|grep 'etcd Version'|cut -d' ' -f3)\n    network_cni=$(grep CLUSTER_NETWORK \"clusters/$1/hosts\"|cut -d'\"' -f2|sed 's/-//g')\n    network_cni_ver=$(grep -i \"${network_cni}Ver\" ezdown|cut -d'=' -f2|head -n1)\n\n    cat <<EOF\n*** Component Version *********************\n*******************************************\n*   kubernetes: ${k8s_ver}\n*   etcd: ${etcd_ver}\n*   ${network_cni}: ${network_cni_ver}\n*******************************************\nEOF\n\n    logger info \"cluster:$1 setup step:$2 begins in 5s, press any key to abort:\\n\"\n    ! (read -r -t5 -n1) || { logger warn \"setup abort\"; return 1; }\n\n    ${COMMAND} || return 1\n}\n\nfunction cmd() {\n    [[ -d \"clusters/$1\" ]] || { logger error \"invalid config, run 'ezctl new $1' first\"; return 1; }\n\n    PLAY_BOOK=\"dummy.yml\"\n    case \"$2\" in\n      (start)\n          PLAY_BOOK=\"91.start.yml\"\n          ;;\n      (stop)\n          PLAY_BOOK=\"92.stop.yml\"\n          ;;\n      (upgrade)\n          PLAY_BOOK=\"93.upgrade.yml\"\n          ;;\n      (backup)\n          PLAY_BOOK=\"94.backup.yml\"\n          ;;\n      (restore)\n          PLAY_BOOK=\"95.restore.yml\"\n          ;;\n      (destroy)\n          PLAY_BOOK=\"99.clean.yml\"\n          ;;\n      (*)\n          usage\n          exit 1\n          ;;\n    esac\n\n    COMMAND=\"ansible-playbook -i clusters/$1/hosts -e @clusters/$1/config.yml playbooks/$PLAY_BOOK\"\n    echo \"$COMMAND\"\n\n    logger info \"cluster:$1 $2 begins in 5s, press any key to abort:\\n\"\n    ! (read -r -t5 -n1) || { logger warn \"$2 abort\"; return 1; }\n\n    ${COMMAND} || return 1\n}\n\n\nfunction list() {\n    [[ -d ./clusters ]] || { logger error \"cluster not found, run 'ezctl new' first\"; return 1; }\n    [[ -f ~/.kube/config ]] || { logger error \"kubeconfig not found, run 'ezctl setup' first\"; return 1; }\n    which md5sum > /dev/null 2>&1 || { logger error \"md5sum not found\"; return 1; }\n\n    CLUSTERS=$(cd clusters && echo -- *)\n    CFG_MD5=$(sed '/server/d' ~/.kube/config|md5sum|cut -d' ' -f1)\n    cd \"$BASE\"\n\n    logger info \"list of managed clusters:\"\n    i=1; for c in $CLUSTERS;\n    do\n        if [[ -f \"clusters/$c/kubectl.kubeconfig\" ]];then\n            c_md5=$(sed '/server/d' \"clusters/$c/kubectl.kubeconfig\"|md5sum|cut -d' ' -f1)\n            if [[ \"$c_md5\" = \"$CFG_MD5\" ]];then\n                echo -e \"==> cluster $i:\\t$c (\\033[32mcurrent\\033[0m)\"\n            else\n                echo -e \"==> cluster $i:\\t$c\"\n            fi\n            ((i++))\n        fi\n    done\n}\n\n\nfunction checkout() {\n    [[ -d \"clusters/$1\" ]] || { logger error \"invalid config, run 'ezctl new $1' first\"; return 1; }\n    [[ -f \"clusters/$1/kubectl.kubeconfig\" ]] || { logger error \"invalid kubeconfig, run 'ezctl setup $1' first\"; return 1; }\n    logger info \"set default kubeconfig: cluster $1 (\\033[32mcurrent\\033[0m)\"\n    /bin/cp -f \"clusters/$1/kubectl.kubeconfig\" ~/.kube/config\n}\n\n### in-cluster operation functions ##############################\n\nfunction add-node() {\n    # check new node's address regexp\n    [[ $2 =~ ^(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})(\\.(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})){3}$ ]] || { logger error \"Invalid ip add:$2\"; return 1; }\n\n    # check if the new node already exsited\n    sed -n '/^\\[kube_master/,/^\\[harbor/p' \"$BASE/clusters/$1/hosts\"|grep -E \"^$2$|^$2 \" && { logger error \"node $2 already existed in $BASE/clusters/$1/hosts\"; return 2; }\n\n    logger info \"add $2 into 'kube_node' group\"\n    NODE_INFO=\"${@:2}\"\n    sed -i \"/\\[kube_node/a $NODE_INFO\" \"$BASE/clusters/$1/hosts\"\n\n    logger info \"start to add a work node:$2 into cluster:$1\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/22.addnode.yml\" -e \"NODE_TO_ADD=$2\" -e \"@clusters/$1/config.yml\"\n}\n\nfunction add-master() {\n    # check new master's address regexp\n    [[ $2 =~ ^(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})(\\.(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})){3}$ ]] || { logger error  \"Invalid ip add:$2\"; return 1; }\n\n    # check if the new master already exsited\n    sed -n '/^\\[kube_master/,/^\\[kube_node/p' \"$BASE/clusters/$1/hosts\"|grep -E \"^$2$|^$2 \" && { logger error \"master $2 already existed!\"; return 2; }\n\n    logger info \"add $2 into 'kube_master' group\"\n    MASTER_INFO=\"${@:2}\"\n    sed -i \"/\\[kube_master/a $MASTER_INFO\" \"$BASE/clusters/$1/hosts\"\n\n    logger info \"start to add a master node:$2 into cluster:$1\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/23.addmaster.yml\" -e \"NODE_TO_ADD=$2\" -e \"@clusters/$1/config.yml\"\n\n    logger info \"re-setting /etc/hosts for all nodes\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/90.setup.yml\" -t set_hosts -e \"@clusters/$1/config.yml\"\n\n    logger info \"reconfigure and restart 'kube-lb' service\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/90.setup.yml\" -t restart_kube-lb -e \"@clusters/$1/config.yml\"\n\n    logger info \"reconfigure and restart 'ex-lb' service\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/10.ex-lb.yml\" -t restart_lb -e \"@clusters/$1/config.yml\"\n}\n\nfunction add-etcd() {\n    # check new node's address regexp\n    [[ $2 =~ ^(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})(\\.(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})){3}$ ]] || { logger error  \"Invalid ip add:$2\"; return 1; }\n\n    # check if the new node already exsited\n    sed -n '/^\\[etcd/,/^\\[kube_master/p' \"$BASE/clusters/$1/hosts\"|grep -E \"^$2$|^$2 \" && { logger error \"etcd $2 already existed!\"; return 2; }\n\n    logger info \"add $2 into 'etcd' group\"\n    ETCD_INFO=\"${@:2}\"\n    sed -i \"/\\[etcd/a $ETCD_INFO\" \"$BASE/clusters/$1/hosts\"\n\n    logger info \"start to add a etcd node:$2 into cluster:$1\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/21.addetcd.yml\" -e \"NODE_TO_ADD=$2\" -e \"@clusters/$1/config.yml\"\n\n    logger info \"reconfig &restart the etcd cluster\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/02.etcd.yml\" -t restart_etcd -e \"@clusters/$1/config.yml\"\n\n    logger info \"restart apiservers to use the new etcd cluster\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/04.kube-master.yml\" -t restart_master -e \"@clusters/$1/config.yml\"\n}\n\nfunction del-etcd() {\n    # check node's address regexp\n    [[ $2 =~ ^(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})(\\.(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})){3}$ ]] || { logger error  \"Invalid ip add:$2\"; return 1; }\n\n    # check if the deleting node exsited\n    sed -n '/^\\[etcd/,/^\\[kube_master/p' \"$BASE/clusters/$1/hosts\"|grep -E \"^$2$|^$2 \" || { logger error \"etcd $2 not existed!\"; return 2; }\n\n    logger warn \"start to delete the etcd node:$2 from cluster:$1\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/31.deletcd.yml\" -e \"ETCD_TO_DEL=$2\" -e \"CLUSTER=$1\" -e \"@clusters/$1/config.yml\"\n\n    logger info \"reconfig &restart the etcd cluster\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/02.etcd.yml\" -t restart_etcd -e \"@clusters/$1/config.yml\"\n\n    logger info \"restart apiservers to use the new etcd cluster\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/04.kube-master.yml\" -t restart_master -e \"@clusters/$1/config.yml\"\n}\n\nfunction del-node() {\n    # check node's address regexp\n    [[ $2 =~ ^(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})(\\.(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})){3}$ ]] || { logger error \"Invalid ip add:$2\"; return 2; }\n\n    # check if the deleting node exsited\n    sed -n '/^\\[kube_master/,/^\\[harbor/p' \"$BASE/clusters/$1/hosts\"|grep -E \"^$2$|^$2 \" || { logger error \"node $2 not existed in $BASE/clusters/$1/hosts\"; return 2; }\n\n    logger warn \"start to delete the node:$2 from cluster:$1\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/32.delnode.yml\" -e \"NODE_TO_DEL=$2\" -e \"CLUSTER=$1\" -e \"@clusters/$1/config.yml\"\n}\n\nfunction del-master() {\n    # check node's address regexp\n    [[ $2 =~ ^(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})(\\.(2(5[0-5]{1}|[0-4][0-9]{1})|[0-1]?[0-9]{1,2})){3}$ ]] || { logger error \"Invalid ip add:$2\"; return 2; }\n\n    # check if the deleting master exsited\n    sed -n '/^\\[kube_master/,/^\\[kube_node/p' \"$BASE/clusters/$1/hosts\"|grep -E \"^$2$|^$2 \" || { logger error \"master $2 not existed!\"; return 2; }\n\n    NODE_NAME=$(bin/kubectl --kubeconfig=\"clusters/$1/kubectl.kubeconfig\" get node -owide|grep \" $2 \"|awk '{print $1}')\n\n    logger warn \"start to delete the master:$2 from cluster:$1\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/33.delmaster.yml\" -e \"NODE_TO_DEL=$2\" -e \"CLUSTER=$1\" -e \"@clusters/$1/config.yml\"\n\n    logger info \"reconfig kubeconfig in ansible manage node\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/roles/deploy/deploy.yml\" -t create_kctl_cfg -e \"@clusters/$1/config.yml\"\n\n    logger info \"reconfigure and restart 'kube-lb' service\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/90.setup.yml\" -t restart_kube-lb -e \"@clusters/$1/config.yml\"\n\n    logger info \"reconfigure and restart 'ex-lb' service\"\n    ansible-playbook -i \"$BASE/clusters/$1/hosts\" \"$BASE/playbooks/10.ex-lb.yml\" -t restart_lb -e \"@clusters/$1/config.yml\"\n\n    logger info \"delete the master-node: $NODE_NAME\"\n    bin/kubectl --kubeconfig=\"clusters/$1/kubectl.kubeconfig\" delete node \"$NODE_NAME\"\n}\n\n\nfunction start-aio(){\n    set +u\n    # Check ENV 'HOST_IP', exists if the CMD 'ezctl' running in a docker container\n    if [[ -z $HOST_IP ]];then\n        # ezctl runs in a host machine, get host's ip\n        HOST_IF=$(ip route|grep default|head -n1|cut -d' ' -f5)\n        HOST_IP=$(ip a|grep \"$HOST_IF$\"|head -n1|awk '{print $2}'|cut -d'/' -f1)\n    fi\n    set -u\n    logger info \"get local host ipadd: $HOST_IP\"\n\n    # allow ssh login using key locally\n    if [[ ! -e /root/.ssh/id_rsa ]]; then\n      logger debug \"generate ssh key pair\"\n      ssh-keygen -t rsa -b 2048 -N '' -f /root/.ssh/id_rsa > /dev/null\n      cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys\n      ssh-keyscan -t ecdsa -H \"$HOST_IP\" >> /root/.ssh/known_hosts\n    fi\n\n    new default\n    /bin/cp -f example/hosts.allinone \"clusters/default/hosts\"\n    sed -i \"s/_cluster_name_/default/g\" \"clusters/default/hosts\"\n    sed -i \"s/192.168.1.1/$HOST_IP/g\" \"clusters/default/hosts\"\n\n    setup default all\n}\n\n### Extra functions #############################################\nfunction renew-ca() {\n    [[ -d \"clusters/$1\" ]] || { logger error \"invalid cluster, run 'ezctl new $1' first\"; return 1; }\n\n    logger warn \"WARNNING: this script should be used with greate caution\"\n    logger warn \"WARNNING: it will recreate CA certs and all of the others certs used in the cluster\"\n\n    COMMAND=\"ansible-playbook -i clusters/$1/hosts -e @clusters/$1/config.yml -e CHANGE_CA=true playbooks/96.update-certs.yml -t force_change_certs\"\n    echo \"$COMMAND\"\n    logger info \"cluster:$1 process begins in 5s, press any key to abort:\\n\"\n    ! (read -r -t5 -n1) || { logger warn \"process abort\"; return 1; }\n\n    ${COMMAND} || return 1\n}\n\n\nEXPIRY=\"4800h\"        # default cert will expire in 200 days\nUSER_TYPE=\"admin\"     # admin/view, admin=clusterrole:cluster-admin view=clusterrole:view\nUSER_NAME=\"user\"\nfunction kcfg-adm() {\n    OPTIND=2\n    ACTION=\"\"\n    while getopts \"ADLe:t:u:\" OPTION; do\n        case $OPTION in\n          A)\n            ACTION=\"add-kcfg $1\"\n            ;;\n          D)\n            ACTION=\"del-kcfg $1\"\n            ;;\n          L)\n            ACTION=\"list-kcfg $1\"\n            ;;\n          e)\n            EXPIRY=\"$OPTARG\"\n\t    [[ $OPTARG =~ ^[1-9][0-9]*h$ ]] || { logger error \"'-e' must be set like '2h, 5h, 50000h, ...'\"; exit 1; }\n            ;;\n          t)\n            USER_TYPE=\"$OPTARG\"\n\t    [[ $OPTARG =~ ^(admin|view)$ ]] || { logger error \"'-t' can only be set as 'admin' or 'view'\"; exit 1; }\n            ;;\n          u)\n            USER_NAME=\"$OPTARG\"\n            ;;\n          ?)\n            help-info kcfg-adm\n            return 1\n            ;;\n        esac\n    done\n\n    [[ \"$ACTION\" == \"\" ]] && { logger error \"illegal option\"; help-info kcfg-adm; exit 1; }\n\n    logger info \"$ACTION\"\n    ${ACTION} || { logger error \"$ACTION fail\"; return 1; }\n    logger info \"$ACTION success\"\n}\n\nfunction add-kcfg(){\n    USER_NAME=\"$USER_NAME\"-$(date +'%Y%m%d%H%M')\n    logger info \"add-kcfg in cluster:$1 with user:$USER_NAME\"\n    ansible-playbook -i \"clusters/$1/hosts\" -e \"@clusters/$1/config.yml\" -e \"CUSTOM_EXPIRY=$EXPIRY\" \\\n                     -e \"USER_TYPE=$USER_TYPE\" -e \"USER_NAME=$USER_NAME\" -e \"ADD_KCFG=true\" \\\n                     -t add-kcfg \"roles/deploy/deploy.yml\"\n}\n\nfunction del-kcfg(){\n    logger info \"del-kcfg in cluster:$1 with user:$USER_NAME\"\n    CRB=$(bin/kubectl --kubeconfig=\"clusters/$1/kubectl.kubeconfig\" get clusterrolebindings -ojsonpath=\"{.items[?(@.subjects[0].name == '$USER_NAME')].metadata.name}\") && \\\n    bin/kubectl --kubeconfig=\"clusters/$1/kubectl.kubeconfig\" delete clusterrolebindings \"$CRB\" && \\\n    /bin/rm -f \"clusters/$1/ssl/users/$USER_NAME\"*\n}\n\nfunction list-kcfg(){\n    logger info \"list-kcfg in cluster:$1\"\n    ADMINS=$(bin/kubectl --kubeconfig=\"clusters/$1/kubectl.kubeconfig\" get clusterrolebindings -ojsonpath='{.items[?(@.roleRef.name == \"cluster-admin\")].subjects[*].name}')\n    VIEWS=$(bin/kubectl --kubeconfig=\"clusters/$1/kubectl.kubeconfig\" get clusterrolebindings -ojsonpath='{.items[?(@.roleRef.name == \"view\")].subjects[*].name}')\n    ALL=$(bin/kubectl --kubeconfig=\"clusters/$1/kubectl.kubeconfig\" get clusterrolebindings -ojsonpath='{.items[*].subjects[*].name}')\n\n    printf \"\\n%-30s %-15s %-20s\\n\" USER TYPE \"EXPIRY(+8h if in Asia/Shanghai)\"\n    echo \"---------------------------------------------------------------------------------\"\n\n    for u in $ADMINS; do\n       if [[ $u =~ ^.*-[0-9]{12}$ ]];then\n          t=$(bin/cfssl-certinfo -cert \"clusters/$1/ssl/users/$u.pem\"|grep not_after|awk '{print $2}'|sed 's/\"//g'|sed 's/,//g')\n          printf \"%-30s %-15s %-20s\\n\" \"$u\" cluster-admin \"$t\"\n       fi\n    done;\n\n    for u in $VIEWS; do\n       if [[ $u =~ ^.*-[0-9]{12}$ ]];then\n          t=$(bin/cfssl-certinfo -cert \"clusters/$1/ssl/users/$u.pem\"|grep not_after|awk '{print $2}'|sed 's/\"//g'|sed 's/,//g')\n          printf \"%-30s %-15s %-20s\\n\" \"$u\" view \"$t\"\n       fi\n    done;\n\n    for u in $ALL; do\n       if [[ $u =~ ^.*-[0-9]{12}$ ]];then\n          [[ $ADMINS == *$u* ]] || [[ $VIEWS == *$u* ]] || {\n             t=$(bin/cfssl-certinfo -cert \"clusters/$1/ssl/users/$u.pem\"|grep not_after|awk '{print $2}'|sed 's/\"//g'|sed 's/,//g')\n             printf \"%-30s %-15s %-20s\\n\" \"$u\" unknown \"$t\"\n          }\n       fi\n    done;\n    echo \"\"\n}\n\n\n### Main Lines ##################################################\nfunction main() {\n  BASE=\"/etc/kubeasz\"\n  [[ -d \"$BASE\" ]] || { logger error \"invalid dir:$BASE, try: 'ezdown -D'\"; exit 1; }\n  cd \"$BASE\"\n\n  # check bash shell\n  readlink /proc/$$/exe|grep -q \"bash\" || { logger error \"you should use bash shell only\"; exit 1; }\n\n  # check 'ansible' executable\n  which ansible > /dev/null 2>&1 || { logger error \"need 'ansible', try: 'pip install ansible'\"; usage; exit 1; }\n\n  [ \"$#\" -gt 0 ] || { usage >&2; exit 2; }\n\n  case \"$1\" in\n      ### in-cluster operations #####################\n      (add-etcd)\n          [ \"$#\" -gt 2 ] || { usage >&2; exit 2; }\n          add-etcd \"${@:2}\"\n          ;;\n      (add-master)\n          [ \"$#\" -gt 2 ] || { usage >&2; exit 2; }\n          add-master \"${@:2}\"\n          ;;\n      (add-node)\n          [ \"$#\" -gt 2 ] || { usage >&2; exit 2; }\n          add-node \"${@:2}\"\n          ;;\n      (del-etcd)\n          [ \"$#\" -eq 3 ] || { usage >&2; exit 2; }\n          del-etcd \"$2\" \"$3\"\n          ;;\n      (del-master)\n          [ \"$#\" -eq 3 ] || { usage >&2; exit 2; }\n          del-master \"$2\" \"$3\"\n          ;;\n      (del-node)\n          [ \"$#\" -eq 3 ] || { usage >&2; exit 2; }\n          del-node \"$2\" \"$3\"\n          ;;\n      ### cluster-wide operations #######################\n      (checkout)\n          [ \"$#\" -eq 2 ] || { usage >&2; exit 2; }\n          checkout \"$2\"\n          ;;\n      (list)\n          [ \"$#\" -eq 1 ] || { usage >&2; exit 2; }\n          list\n          ;;\n      (new)\n          [ \"$#\" -eq 2 ] || { usage >&2; exit 2; }\n          new \"$2\"\n          ;;\n      (setup)\n          [ \"$#\" -ge 3 ] || { usage-setup >&2; exit 2; }\n          setup \"${@:2}\"\n          ;;\n      (start)\n          [ \"$#\" -eq 2 ] || { usage >&2; exit 2; }\n          cmd \"$2\" start\n          ;;\n      (stop)\n          [ \"$#\" -eq 2 ] || { usage >&2; exit 2; }\n          cmd \"$2\" stop\n          ;;\n      (upgrade)\n          [ \"$#\" -eq 2 ] || { usage >&2; exit 2; }\n          cmd \"$2\" upgrade\n          ;;\n      (backup)\n          [ \"$#\" -eq 2 ] || { usage >&2; exit 2; }\n          cmd \"$2\" backup\n          ;;\n      (restore)\n          [ \"$#\" -eq 2 ] || { usage >&2; exit 2; }\n          cmd \"$2\" restore\n          ;;\n      (destroy)\n          [ \"$#\" -eq 2 ] || { usage >&2; exit 2; }\n          cmd \"$2\" destroy\n          ;;\n      (start-aio)\n          [ \"$#\" -eq 1 ] || { usage >&2; exit 2; }\n          start-aio\n          ;;\n      ### extra operations ##############################\n      (kca-renew)\n          [ \"$#\" -eq 2 ] || { usage >&2; exit 2; }\n          renew-ca \"$2\"\n          ;;\n      (kcfg-adm)\n          [ \"$#\" -gt 2 ] || { usage-kcfg-adm >&2; exit 2; }\n          kcfg-adm \"${@:2}\"\n          ;;\n      (help)\n          [ \"$#\" -gt 1 ] || { usage >&2; exit 2; }\n          help-info \"$2\"\n          exit 0\n          ;;\n      (*)\n          usage\n          exit 0\n          ;;\n  esac\n }\n\nmain \"$@\"\n"
  },
  {
    "path": "ezdown",
    "content": "#!/bin/bash\n#--------------------------------------------------\n# This script is used for:\n# 1. to download the scripts/binaries/images needed for installing a k8s cluster with kubeasz\n# 2. to run kubeasz in a container (recommended)\n# @author:   gjmzj\n# @usage:    ./ezdown\n# @repo:     https://github.com/easzlab/kubeasz\n#--------------------------------------------------\n# shellcheck disable=SC2155\nset -o nounset\nset -o errexit\nset -o pipefail\n#set -o xtrace\n\n# default settings, can be overridden by cmd line options, see usage\nDOCKER_VER=28.5.2\nKUBEASZ_VER=3.6.8\nK8S_BIN_VER=v1.34.3\n# https://github.com/easzlab/dockerfile-kubeasz-ext-bin\nEXT_BIN_VER=1.13.3\n# https://github.com/easzlab/dockerfile-kubeasz-sys-pkg\nSYS_PKG_VER=1.0.4\nHARBOR_VER=v2.12.4\nREGISTRY_MIRROR=docker.1ms.run\n\n# images downloaded by default(with 'ezdown -D')\n# https://github.com/projectcalico/calico\ncalicoVer=v3.28.4\n# https://github.com/coredns/coredns\ncorednsVer=1.12.4\n# https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/\ndnsNodeCacheVer=1.26.4\n# https://github.com/kubernetes-sigs/metrics-server\nmetricsVer=v0.8.0\npauseVer=3.10\n\n# images not downloaded by default(only download  with 'ezdown -X ***')\n# https://github.com/cilium/cilium\n# https://docs.cilium.io/en/stable/installation/k8s-install-helm/\nciliumVer=1.17.4\n# https://github.com/flannel-io/flannel\nflannelVer=v0.27.3\n# https://github.com/cloudnativelabs/kube-router\nkubeRouterVer=v1.5.4\n# https://github.com/kubeovn/kube-ovn\nkubeOvnVer=v1.11.5\n# https://github.com/kubernetes/dashboard\ndashboardVer=7.14.0\n# https://github.com/rancher/local-path-provisioner\nlocalpathProvisionerVer=v0.0.31\n# https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner\nnfsProvisionerVer=v4.0.2\n#https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack\npromChartVer=75.7.0\n#https://kubeblocks.io/docs/release-1_0/user_docs/overview/introduction\nkubeblocksVer=1.0.1\n#https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-operator-helm.html\nminioOperatorVer=7.1.1\n# https://openebs.io/docs/quickstart-guide/installation\nopenebsVer=4.3.2\n# https://kubernetes.github.io/ingress-nginx/deploy/\ningressNginxVer=4.13.0\n\nfunction usage() {\n  echo -e \"\\033[33mUsage:\\033[0m ezdown [options] [args]\"\n  cat <<EOF\n  option:\n    -D         download default binaries/images into \"$BASE\"\n    -P <OS>    download system packages of the OS (ubuntu_22,debian_11,...)\n    -R         download Registry(harbor) offline installer\n    -S         start kubeasz in a container\n    -X <opt>   download extra images\n    -d <ver>   set docker-ce version, default \"$DOCKER_VER\"\n    -e <ver>   set kubeasz-ext-bin version, default \"$EXT_BIN_VER\"\n    -k <ver>   set kubeasz-k8s-bin version, default \"$K8S_BIN_VER\"\n    -m <str>   set docker registry mirrors, default \"docker.1ms.run\"\n    -z <ver>   set kubeasz version, default \"$KUBEASZ_VER\"\nEOF\n}\n\nfunction usage-down-sys-pkg(){\n  echo -e \"\\033[33mUsage:\\033[0m ezdown -P <OS>\"\n  cat <<EOF\navailable OSes:\n    almalinux_8       to download package of AlmaLinux 8\n    almalinux_9       to download package of AlmaLinux 9\n    centos_7          to download package of CentOS 7\n    debian_10         to download package of Debian 10\n    debian_11         to download package of Debian 11\n    fedora_34         to download package of Fedora 34\n    fedora_35         to download package of Fedora 35\n    fedora_36         to download package of Fedora 36\n    fedora_37         to download package of Fedora 37\n    opensuse_leap_15  to download package of openSUSE Leap 15\n    rocky_8           to download package of Rocky Linux 8\n    rocky_9           to download package of Rocky Linux 9\n    ubuntu_16         to download package of Ubuntu 16.04\n    ubuntu_18         to download package of Ubuntu 18.04\n    ubuntu_20         to download package of Ubuntu 20.04\n    ubuntu_22         to download package of Ubuntu 22.04\n    ubuntu_24         to download package of Ubuntu 24.04\nexamples:\n    ./ezdown -P ubuntu_22\nEOF\n}\n\nfunction usage-down-ext-img(){\n  echo -e \"\\033[33mUsage:\\033[0m ezdown -X <opt>\"\n  cat <<EOF\navailable options:\n    argocd                   to download images of argocd\n    cilium                   to download images of cilium\n    dashboard                to download images of dashboard\n    flannel                  to download images of flannel\n    ingress-nginx            to download images of ingress-nginx\n    kube-ovn                 to download images of kube-ovn\n    kube-router              to download images of kube-router\n    kubeblocks               to download images of kubeblocks\n    kb-addon-mysql           to download images of kb-addon-mysql\n    kb-addon-pg              to download images of kb-addon-postgresql\n    kb-addon-redis           to download images of kb-addon-redis\n    kb-addon-mongodb         to download images of kb-addon-mongodb\n    kb-addon-elasticsearch   to download images of kb-addon-elasticsearch\n    kb-addon-clickhouse      to download images of kb-addon-clickhouse\n    kb-addon-minio           to download images of kb-addon-minio\n    local-path-provisioner   to download images of local-path-provisioner\n    minio                    to download images of minio\n    nacos                    to download images of nacos\n    network-check            to download images of network-check\n    nfs-provisioner          to download images of nfs-provisioner\n    openebs                  to download images of openebs\n    prometheus               to download images of prometheus\n    rocketmq                 to download images of rocketmq\nexamples:\n    ./ezdown -X prometheus\nEOF\n}\n\nfunction logger() {\n  TIMESTAMP=$(date +'%Y-%m-%d %H:%M:%S')\n  local FNAME=$(basename \"${BASH_SOURCE[1]}\")\n  local SOURCE=\"\\033[36m[$FNAME:${BASH_LINENO[0]}]\\033[0m\"\n  case \"$1\" in\n    debug)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[36mDEBUG $2\\033[0m\"\n      ;;\n    info)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[32mINFO $2\\033[0m\"\n      ;;\n    warn)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[33mWARN $2\\033[0m\"\n      ;;\n    error)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[31mERROR $2\\033[0m\"\n      ;;\n    *) ;;\n  esac\n}\n\nfunction download_docker() {\n  if [ -n \"$REGISTRY_MIRROR\" ];then\n    # DOCKER_URL=\"https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/${ARCH}/docker-${DOCKER_VER}.tgz\"\n    DOCKER_URL=\"https://mirrors.aliyun.com/docker-ce/linux/static/stable/${ARCH}/docker-${DOCKER_VER}.tgz\"\n  else\n    DOCKER_URL=\"https://download.docker.com/linux/static/stable/${ARCH}/docker-${DOCKER_VER}.tgz\"\n  fi\n\n  if [[ -f \"$BASE/down/docker-${DOCKER_VER}.tgz\" ]];then\n    logger warn \"docker binaries already existed\"\n  else\n    logger info \"downloading docker binaries, arch:$ARCH, version:$DOCKER_VER\"\n    if [[ -e /usr/bin/wget ]];then\n      wget -c --no-check-certificate \"$DOCKER_URL\" || { logger error \"downloading docker failed\"; exit 1; }\n    else\n      curl -k -C- -O --retry 3 \"$DOCKER_URL\" || { logger error \"downloading docker failed\"; exit 1; }\n    fi\n    mv -f \"./docker-$DOCKER_VER.tgz\" \"$BASE/down\"\n  fi\n\n  tar zxf \"$BASE/down/docker-$DOCKER_VER.tgz\" -C \"$BASE/down\" && \\\n  mkdir -p \"$BASE/bin/docker-bin\" /opt/kube/bin/docker-bin && \\\n  cp -f \"$BASE\"/down/docker/* \"$BASE/bin/docker-bin\" && \\\n  mv -f \"$BASE\"/down/docker/* /opt/kube/bin/docker-bin && \\\n  rm -rf \"$BASE\"/down/docker && \\\n  ln -sf /opt/kube/bin/docker-bin/docker /bin/docker\n}\n\nfunction install_docker() {\n  # check if a container runtime is already installed\n  systemctl status docker|grep Active|grep -q running && { logger warn \"docker is already running.\"; return 0; }\n\n  logger debug \"generate docker service file\"\n  cat > /etc/systemd/system/docker.service << EOF\n[Unit]\nDescription=Docker Application Container Engine\n[Service]\nEnvironment=\"PATH=/opt/kube/bin/docker-bin:/bin:/sbin:/usr/bin:/usr/sbin\"\nExecStartPre=/bin/sh -c 'groupadd docker > /dev/null 2>&1 || echo \"\"'\nExecStart=/opt/kube/bin/docker-bin/dockerd\n#ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT\nExecReload=/bin/kill -s HUP \\$MAINPID\nRestart=on-failure\nRestartSec=5\nLimitNOFILE=infinity\nLimitNPROC=infinity\nLimitCORE=infinity\nDelegate=yes\nKillMode=process\n[Install]\nWantedBy=multi-user.target\nEOF\n\n  # configuration for dockerd\n  mkdir -p /etc/docker\n  DOCKER_VER_MAIN=$(echo \"$DOCKER_VER\"|cut -d. -f1)\n  CGROUP_DRIVER=\"cgroupfs\"\n  ((DOCKER_VER_MAIN>=20)) && CGROUP_DRIVER=\"systemd\"\n  logger debug \"generate docker config: /etc/docker/daemon.json\"\n  if [ -n \"$REGISTRY_MIRROR\" ];then\n    logger debug \"prepare register mirror\"\n    cat > /etc/docker/daemon.json << EOF\n{\n  \"exec-opts\": [\"native.cgroupdriver=$CGROUP_DRIVER\"],\n  \"registry-mirrors\": [\n    \"https://docker.1ms.run\",\n    \"https://hub1.nat.tf\",\n    \"https://docker.1panel.live\",\n    \"https://hub.rat.dev\",\n    \"https://docker.amingg.com\"\n  ],\n  \"insecure-registries\": [\"easzlab.io.local:5000\"],\n  \"max-concurrent-downloads\": 10,\n  \"log-driver\": \"json-file\",\n  \"log-level\": \"warn\",\n  \"log-opts\": {\n    \"max-size\": \"10m\",\n    \"max-file\": \"3\"\n    },\n  \"data-root\": \"/var/lib/docker\"\n}\nEOF\n  else\n    logger debug \"standard config without registry mirrors\"\n    cat > /etc/docker/daemon.json << EOF\n{\n  \"exec-opts\": [\"native.cgroupdriver=$CGROUP_DRIVER\"],\n  \"insecure-registries\": [\"easzlab.io.local:5000\"],\n  \"max-concurrent-downloads\": 10,\n  \"log-driver\": \"json-file\",\n  \"log-level\": \"warn\",\n  \"log-opts\": {\n    \"max-size\": \"10m\",\n    \"max-file\": \"3\"\n    },\n  \"data-root\": \"/var/lib/docker\"\n}\nEOF\n  fi\n\n  if [[ -f /etc/selinux/config ]]; then\n    logger debug \"turn off selinux\"\n    getenforce|grep Disabled || setenforce 0\n    sed -i 's/^SELINUX=.*$/SELINUX=disabled/g' /etc/selinux/config\n  fi\n\n  logger debug \"enable and start docker\"\n  systemctl enable docker\n  systemctl daemon-reload && systemctl restart docker && sleep 3\n}\n\nfunction get_kubeasz() {\n  # check if kubeasz already existed\n  [[ -d \"$BASE/roles/kube-node\" ]] && { logger warn \"kubeasz already existed\"; return 0; }\n\n  if [[ ! -f \"$imageDir/kubeasz_$KUBEASZ_VER.tar\" ]];then\n    logger info \"downloading kubeasz: $KUBEASZ_VER\"\n    docker pull \"easzlab/kubeasz:$KUBEASZ_VER\" && \\\n    docker save -o \"$imageDir/kubeasz_$KUBEASZ_VER.tar\" \"easzlab/kubeasz:$KUBEASZ_VER\" || \\\n    { logger error \"download failed!\"; return 1; }\n  else\n    docker load -i \"$imageDir/kubeasz_$KUBEASZ_VER.tar\"\n  fi\n\n  docker ps -a |grep -q temp_easz && { logger debug \"remove existing container\"; docker rm -f temp_easz; }\n  logger debug \" run a temporary container\"\n  docker run -d --name temp_easz easzlab/kubeasz:${KUBEASZ_VER} || { logger error \"failed.\"; exit 1; }\n\n  [[ -d \"$BASE/down\" ]] && /bin/mv -f \"$BASE/down\" /tmp\n  [[ -d \"$BASE/bin\" ]] && /bin/mv -f \"$BASE/bin\" /tmp\n\n  rm -rf \"$BASE\" && \\\n  logger debug \"cp kubeasz code from the temporary container\" && \\\n  docker cp \"temp_easz:$BASE\" \"$BASE\" && \\\n  logger debug \"stop&remove temporary container\" && \\\n  docker rm -f temp_easz\n\n  mkdir -p \"$BASE/bin\" \"$BASE/down\"\n  [[ -d \"/tmp/down\" ]] && /bin/mv -f /tmp/down/* \"$BASE/down\"\n  [[ -d \"/tmp/bin\" ]] && /bin/mv -f /tmp/bin/* \"$BASE/bin\"\n  return 0\n}\n\nfunction get_k8s_bin() {\n  [[ -f \"$BASE/bin/kubelet\" ]] && { logger warn \"kubernetes binaries existed\"; return 0; }\n\n  logger info \"downloading kubernetes: $K8S_BIN_VER binaries\"\n  docker run --rm -v \"$BASE/bin\":/tmp/out easzlab/kubeasz-k8s-bin:\"$K8S_BIN_VER\" \\\n          sh -c \"cp -f /k8s/* /tmp/out/\"\n}\n\nfunction get_ext_bin() {\n  [[ -f \"$BASE/bin/etcdctl\" ]] && { logger warn \"extra binaries existed\"; return 0; }\n\n  logger info \"downloading extral binaries kubeasz-ext-bin:$EXT_BIN_VER\"\n  docker run --rm -v \"$BASE/bin\":/tmp/out \"easzlab/kubeasz-ext-bin:$EXT_BIN_VER\" \\\n          sh -c \"cp -rf /extra/* /tmp/out/\"\n}\n\nfunction get_sys_pkg() {\n  [[ -f \"$BASE/down/packages/$1.tgz\" ]] && { logger warn \"system packages for $1 existed\"; return 0; }\n\n  docker run --rm -v \"$BASE/down\":/tmp/out \"easzlab/kubeasz-sys-pkg:$SYS_PKG_VER\" \\\n\t  sh -c \"cp -r /packages /tmp/out/\"\n}\n\nfunction get_harbor_offline_pkg() {\n  [[ -f \"$BASE/down/harbor-offline-installer-$HARBOR_VER.tgz\" ]] && { logger warn \"harbor-offline existed\"; return 0; }\n\n  if [[ \"$ARCH\" == aarch64 ]];then\n    docker run --rm -v \"$BASE/down\":/tmp/out \"easzlab/harbor-offline:${HARBOR_VER}-aarch64\" \\\n          sh -c \"cp /harbor-offline-installer-$HARBOR_VER.tgz /tmp/out/\"\n  else\n    docker run --rm -v \"$BASE/down\":/tmp/out \"easzlab/harbor-offline:$HARBOR_VER\" \\\n          sh -c \"cp /harbor-offline-installer-$HARBOR_VER.tgz /tmp/out/\"\n  fi\n}\n\nfunction get_default_images() {\n  logger info \"download default images, then upload to the local registry\"\n\n  IMAGES=(\\\n      \"calico/cni:$calicoVer\" \\\n      \"calico/kube-controllers:$calicoVer\" \\\n      \"calico/node:$calicoVer\" \\\n      \"coredns/coredns:$corednsVer\" \\\n      \"easzlab/k8s-dns-node-cache:$dnsNodeCacheVer\" \\\n      \"easzlab/metrics-server:$metricsVer\" \\\n      \"easzlab/pause:$pauseVer\" \\\n    )\n  down_and_save_images\n}\n\nfunction get_extra_images() {\n  logger info \"download images for $1, then upload to the local registry\"\n\n  case \"$1\" in\n    argocd)\n      IMAGES=(\\\n          \"quay.io/argoproj/argocd:v3.2.5\" \\\n          \"ghcr.io/dexidp/dex:v2.44.0\" \\\n          \"ecr-public.aws.com/docker/library/redis:8.2.2-alpine\" \\\n        )\n      down_and_save_images argocd\n      ;;\n\n    cilium)\n      IMAGES=(\\\n          \"cilium/cilium:v$ciliumVer\" \\\n          \"cilium/operator-generic:v$ciliumVer\" \\\n          \"cilium/hubble-relay:v$ciliumVer\" \\\n          \"cilium/hubble-ui-backend:v0.13.2\" \\\n          \"cilium/hubble-ui:v0.13.2\" \\\n        )\n      down_and_save_images cilium\n      ;;\n\n    flannel)\n      IMAGES=(\\\n          \"ghcr.io/flannel-io/flannel:v0.27.3\" \\\n          \"ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1\" \\\n        )\n      down_and_save_images flannel\n      ;;\n\n    ingress-nginx)\n      IMAGES=(\\\n          \"easzlab/ingress-nginx-controller:v1.13.0\" \\\n          \"easzlab/kube-webhook-certgen:v1.6.0\" \\\n        )\n      down_and_save_images\n      ;;\n\n    dashboard)\n      IMAGES=(\\\n          \"kubernetesui/dashboard-api:1.14.0\" \\\n          \"kubernetesui/dashboard-auth:1.4.0\" \\\n          \"kubernetesui/dashboard-metrics-scraper:1.2.2\" \\\n          \"kubernetesui/dashboard-web:1.7.0\" \\\n          \"kong:3.9\" \\\n        )\n      down_and_save_images kubernetesui\n      ;;\n\n    kubeblocks)\n      IMAGES=(\\\n          \"easzlab/snapshot-controller:v8.3.0\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/kubeblocks-charts:${kubeblocksVer}\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/kubeblocks:${kubeblocksVer}\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/kubeblocks-tools:1.0.0\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/kubeblocks-tools:${kubeblocksVer}\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/kubeblocks-dataprotection:${kubeblocksVer}\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/datasafed:0.2.1\" \\\n        )\n      down_and_save_images apecloud\n      ;;\n\n    kb-addon-mysql)\n      IMAGES=(\\\n          \"apecloud/mysql_audit_log:8.0.33\" \\\n          \"apecloud/xtrabackup:8.0\" \\\n          \"apecloud/jemalloc:5.3.0\" \\\n          \"apecloud/syncer:0.5.0\" \\\n          \"apecloud/mysql:8.0.39\" \\\n          \"apecloud/mysqld-exporter:0.15.1\" \\\n          \"apecloud/proxysql:2.4.4\" \\\n          \"apecloud/percona-xtrabackup:8.0\" \\\n          \"apecloud/wal-g-mysql:2.0.1-1-ubuntu\" \\\n        )\n      down_and_save_images apecloud\n      ;;\n\n    kb-addon-pg)\n      IMAGES=(\\\n          \"apecloud/spilo:16.4.0\" \\\n\t  \"apecloud/spilo-init:0.1\" \\\n          \"apecloud/dbctl:0.2.0\" \\\n          \"apecloud/pgbouncer:1.19.0\" \\\n          \"apecloud/postgres-exporter:v0.15.0\" \\\n        )\n      down_and_save_images apecloud\n      ;;\n\n    kb-addon-redis)\n      IMAGES=(\\\n          \"apecloud/dbctl:0.1.8\" \\\n          \"apecloud/agamotto:0.1.2-beta.1\" \\\n          \"apecloud/redis:8.2.1\" \\\n          \"apecloud/redis-stack-server:7.2.0-v14\" \\\n          \"apecloud/redis-stack-server:7.2.0-v18\" \\\n        )\n      down_and_save_images apecloud\n      ;;\n\n    kb-addon-mongodb)\n      IMAGES=(\\\n          \"apecloud/syncer:0.3.7\" \\\n          \"apecloud/mongo:5.0.30\" \\\n        )\n      down_and_save_images apecloud\n      ;;\n\n    kb-addon-elasticsearch)\n      IMAGES=(\\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/elasticsearch-plugins:0.1.0\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/elasticsearch:8.8.2\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/elasticsearch-agent:0.1.0\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/elasticsearch-exporter:v1.7.0\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/curl-jq:0.1.0\" \\\n        )\n      down_and_save_images apecloud\n      ;;\n\n    kb-addon-clickhouse)\n      IMAGES=(\\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/busybox:1.36\" \\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/clickhouse:24.8.3-debian-12-r1\" \\\n        )\n      down_and_save_images apecloud\n      ;;\n\n    kb-addon-minio)\n      IMAGES=(\\\n          \"apecloud-registry.cn-zhangjiakou.cr.aliyuncs.com/apecloud/minio:RELEASE.2024-06-29T01-20-47Z\" \\\n        )\n      down_and_save_images apecloud\n      ;;\n\n    kube-ovn)\n      IMAGES=(\\\n          \"kubeovn/kube-ovn:$kubeOvnVer\" \\\n        )\n      down_and_save_images kubeovn\n      ;;\n\n    kube-router)\n      IMAGES=(\\\n          \"cloudnativelabs/kube-router:$kubeRouterVer\" \\\n        )\n      down_and_save_images cloudnativelabs\n      ;;\n\n    local-path-provisioner)\n      IMAGES=(\\\n          \"rancher/local-path-provisioner:$localpathProvisionerVer\" \\\n        )\n      down_and_save_images rancher\n      ;;\n\n    minio)\n      IMAGES=(\\\n          \"quay.io/minio/operator:v${minioOperatorVer}\" \\\n          \"quay.io/minio/operator-sidecar:v7.0.1\" \\\n          \"quay.io/minio/minio:RELEASE.2025-04-08T15-41-24Z\" \\\n        )\n      down_and_save_images minio\n      ;;\n\n    nacos)\n      IMAGES=(\\\n          \"nacos/nacos-server:v2.4.3\" \\\n          \"nacos/nacos-peer-finder-plugin:1.1\" \\\n        )\n      down_and_save_images nacos\n      ;;\n\n    network-check)\n      IMAGES=(\\\n          \"easzlab/json-mock:v1.3.0\" \\\n          \"easzlab/alpine-curl:v7.85.0\" \\\n        )\n      down_and_save_images\n      ;;\n\n    nfs-provisioner)\n      IMAGES=(\\\n          \"easzlab/nfs-subdir-external-provisioner:$nfsProvisionerVer\" \\\n        )\n      down_and_save_images\n      ;;\n\n    openebs)\n      IMAGES=(\\\n          \"bitnami/kubectl:1.25.15\" \\\n          \"openebs/provisioner-localpv:4.3.0\" \\\n          \"openebs/linux-utils:4.2.0\" \\\n          \"openebs/lvm-driver:1.7.0\" \\\n          \"easzlab/csi-node-driver-registrar:v2.13.0\" \\\n          \"easzlab/csi-resizer:v1.11.2\" \\\n          \"easzlab/csi-snapshotter:v7.0.0\" \\\n          \"easzlab/csi-provisioner:v5.2.0\" \\\n          \"easzlab/snapshot-controller:v7.0.0\" \\\n        )\n      down_and_save_images openebs\n      ;;\n\n    rocketmq)\n      IMAGES=(\\\n          \"apache/rocketmq-operator:latest\" \\\n          \"apacherocketmq/rocketmq-broker:4.5.0-alpine-operator-0.3.0\" \\\n          \"apacherocketmq/rocketmq-nameserver:4.5.0-alpine-operator-0.3.0\" \\\n          \"apacherocketmq/rocketmq-console:2.0.0\" \\\n        )\n      down_and_save_images rocketmq\n      ;;\n\n    prometheus)\n      IMAGES=(\\\n          \"easzlab/kube-state-metrics:v2.16.0\" \\\n          \"easzlab/kube-webhook-certgen:v1.6.0\" \\\n        )\n      down_and_save_images\n      IMAGES=(\\\n          \"grafana/grafana:12.0.2\" \\\n          \"quay.io/kiwigrid/k8s-sidecar:1.30.5\" \\\n          \"quay.io/prometheus-operator/prometheus-config-reloader:v0.83.0\" \\\n          \"quay.io/prometheus-operator/prometheus-operator:v0.83.0\" \\\n          \"quay.io/prometheus/alertmanager:v0.28.1\" \\\n          \"quay.io/prometheus/node-exporter:v1.9.1\" \\\n          \"quay.io/prometheus/prometheus:v3.4.2\" \\\n        )\n      down_and_save_images prometheus\n      ;;\n\n    *)\n      logger error \"invalid option: $1\"\n      usage-down-ext-img\n      exit 1\n      ;;\n  esac\n}\n\n# 优先下载原始镜像；如果失败，尝试用加速地址下载\nfunction down_and_save_images(){\n  if [ \"$#\" -eq 1 ];then\n    down_and_save_images_orig $1 || down_and_save_images_with_mirror $1\n  else\n    down_and_save_images_orig || down_and_save_images_with_mirror\n  fi\n}\n\n# 参数扩展说明：\n# ${var%%pattern} - 从**右边**删除**最长匹配**的 pattern 后缀\n# ${var%pattern}  - 从**右边**删除**最短匹配**的 pattern 后缀\n# ${var##pattern} - 从**左边**删除**最长匹配**的 pattern 前缀\n# ${var#pattern}  - 从**左边**删除**最短匹配**的 pattern 前缀\nfunction down_and_save_images_orig(){\n  NS=\"easzlab\"\n  [ \"$#\" -eq 1 ] && NS=\"$1\"\n  for item in \"${IMAGES[@]}\"; do\n    image_part=\"${item##*/}\"\n    image_name=\"${image_part%:*}\"\n    image_tag=\"${image_part##*:}\"\n    image_file=\"$imageDir/${image_name}_${image_tag}.tar\"\n    if [[ ! -f \"$image_file\" ]];then\n      docker pull \"$item\" && \\\n      docker save -o \"$image_file\" \"$item\" || \\\n      { logger error \"download $item failed!\"; return 1; }\n    else\n      docker load -i \"$image_file\"\n    fi\n    docker tag \"$item\" \"easzlab.io.local:5000/${NS}/${image_part}\"\n    docker push \"easzlab.io.local:5000/${NS}/${image_part}\" || \\\n    { logger error \"push easzlab.io.local:5000/${NS}/${image_part} failed!\"; return 1; }\n  done\n}\n\n# 尝试使用加速地址下载，比如：alpine:latest 替换成 $REGISTRY_MIRROR/library/alpine:latest 下载\nfunction down_and_save_images_with_mirror(){\n  [[ \"$REGISTRY_MIRROR\" == \"\" ]] && { logger error \"no registry mirror set\"; return 1; }\n  NS=\"easzlab\"\n  [ \"$#\" -eq 1 ] && NS=\"$1\"\n  for item in \"${IMAGES[@]}\"; do\n    image_part=\"${item##*/}\"\n    image_name=\"${image_part%:*}\"\n    image_tag=\"${image_part##*:}\"\n    image_file=\"$imageDir/${image_name}_${image_tag}.tar\"\n\n    item=$(normalize_image \"$item\")\n    registry=\"${item%%/*}\"\n    repository=\"${item#*/}\"\n\n    [[ \"$registry\" == \"docker.io\" ]] && item=\"${REGISTRY_MIRROR}/${repository}\"\n\n    if [[ ! -f \"$image_file\" ]];then\n      docker pull \"$item\" && \\\n      docker save -o \"$image_file\" \"$item\" || \\\n      { logger error \"download $item failed!\"; return 1; }\n    else\n      docker load -i \"$image_file\"\n    fi\n    docker tag \"$item\" \"easzlab.io.local:5000/${NS}/${image_part}\"\n    docker push \"easzlab.io.local:5000/${NS}/${image_part}\" || \\\n    { logger error \"push easzlab.io.local:5000/${NS}/${image_part} failed!\"; return 1; }\n  done\n}\n\n# 将镜像名称转换为标准格式: ${registry}/${repository}:${tag}\n# 标准格式规则：\n# 1. 如果没有 registry，默认使用 docker.io\n# 2. 如果没有 tag，默认使用 latest\n# 3. 如果 repository 不包含 /，且 registry 是 docker.io，则添加 library/ 前缀\nfunction normalize_image() {\n    local image=\"$1\"\n    local registry=\"\"\n    local repository=\"\"\n    local tag=\"\"\n\n    # 提取 tag（如果存在）\n    if [[ \"$image\" == *\":\"* ]]; then\n        tag=\"${image##*:}\"\n        image=\"${image%:*}\"\n    else\n        tag=\"latest\"\n    fi\n\n    # 提取 registry 和 repository\n    # 判断是否包含 registry（包含域名特征：包含点号或端口号）\n    if [[ \"$image\" == *\".\"* ]] || [[ \"$image\" == *\":\"* ]]; then\n        # 包含 registry\n        registry=\"${image%%/*}\"\n        repository=\"${image#*/}\"\n    else\n        # 不包含 registry，使用默认的 docker.io\n        registry=\"docker.io\"\n        repository=\"$image\"\n    fi\n\n    # 如果 repository 不包含 /，且 registry 是 docker.io，则添加 library/ 前缀\n    if [[ \"$registry\" == \"docker.io\" ]] && [[ \"$repository\" != *\"/\"* ]]; then\n        repository=\"library/$repository\"\n    fi\n\n    # 输出标准格式\n    echo \"${registry}/${repository}:${tag}\"\n}\n\n\nfunction download_all() {\n  mkdir -p /opt/kube/bin \"$BASE/down\" \"$BASE/bin\"\n  download_docker && \\\n  install_docker && \\\n  get_kubeasz && \\\n  get_k8s_bin && \\\n  get_ext_bin && \\\n  start_local_registry && \\\n  get_default_images\n}\n\nfunction start_local_registry() {\n  if [[ ! -f \"$imageDir/registry-2.tar\" ]];then\n    docker pull \"registry:2\" && \\\n    docker save -o \"$imageDir/registry-2.tar\" \"registry:2\"\n  fi\n\n  docker ps -a --format=\"{{ .Names }}\"|grep local_registry > /dev/null 2>&1 && \\\n  { logger warn \"local_registry is already running\"; return 0; }\n\n  logger info \"start local registry ...\"\n  docker load -i \"$imageDir/registry-2.tar\" > /dev/null\n  mkdir -p /opt/kube/registry\n  docker run -d \\\n        --name local_registry \\\n        --network host \\\n        --restart always \\\n        --volume /opt/kube/registry:/var/lib/registry \\\n        registry:2\n\n  sed -i \"/easzlab.io.local/d\" /etc/hosts\n  echo \"127.0.0.1  easzlab.io.local\" >> /etc/hosts\n}\n\n\nfunction start_kubeasz_docker() {\n  # create cmd alias in /root/.bashrc\n  sed -i '/docker exec/d' /root/.bashrc\n  echo \"alias dk='docker exec -it kubeasz'  # generated by kubeasz\" >> /root/.bashrc\n\n  [[ -d \"$BASE/roles/kube-node\" ]] || { logger error \"not initialized. try 'ezdown -D' first.\"; exit 1; }\n  docker ps -a --format=\"{{ .Names }}\"|grep kubeasz > /dev/null 2>&1 && \\\n  docker rm -f kubeasz > /dev/null\n\n  if [[ ! -f \"$imageDir/kubeasz_$KUBEASZ_VER.tar\" ]];then\n    logger info \"downloading kubeasz: $KUBEASZ_VER\"\n    docker pull \"easzlab/kubeasz:$KUBEASZ_VER\" && \\\n    docker save -o \"$imageDir/kubeasz_$KUBEASZ_VER.tar\" \"easzlab/kubeasz:$KUBEASZ_VER\"\n  else\n    docker load -i \"$imageDir/kubeasz_$KUBEASZ_VER.tar\"\n  fi\n\n  logger info \"try to run kubeasz in a container\"\n  # get host's IP\n  host_if=$(ip route|grep default|head -n1|cut -d' ' -f5)\n  host_ip=$(ip a|grep \"$host_if$\"|head -n1|awk '{print $2}'|cut -d'/' -f1)\n  logger debug \"get host IP: $host_ip\"\n\n  # allow ssh login using key locally\n  if [[ ! -e /root/.ssh/id_rsa ]]; then\n    logger debug \"generate ssh key pair\"\n    ssh-keygen -t rsa -b 2048 -N '' -f /root/.ssh/id_rsa > /dev/null\n    cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys\n    ssh-keyscan -t ecdsa -H \"$host_ip\" >> /root/.ssh/known_hosts\n  fi\n\n  # run kubeasz docker container\n  docker run --detach \\\n      --env HOST_IP=\"$host_ip\" \\\n      --name kubeasz \\\n      --network host \\\n      --restart always \\\n      --volume \"$BASE\":\"$BASE\" \\\n      --volume /root/.kube:/root/.kube \\\n      --volume /root/.ssh:/root/.ssh \\\n      --volume /etc/docker:/etc/docker \\\n      easzlab/kubeasz:${KUBEASZ_VER}\n}\n\n\n### Main Lines ##################################################\nfunction main() {\n  BASE=\"/etc/kubeasz\"\n  IMAGES=()\n  imageDir=\"$BASE/down\"\n\n  # check if use bash shell\n  # readlink /proc/$$/exe|grep -q \"bash\" || { logger error \"you should use bash shell, not sh\"; exit 1; }\n  # check if use with root\n  # [[ \"$EUID\" -ne 0 ]] && { logger error \"you should run this script as root\"; exit 1; }\n\n  # get architecture\n  ARCH=$(uname -m)\n\n  [[ \"$#\" -eq 0 ]] && { usage >&2; exit 1; }\n\n  ACTION=\"\"\n  while getopts \"CDP:RSX:d:e:k:m:z:\" OPTION; do\n      case \"$OPTION\" in\n        D)\n          ACTION=\"download_all\"\n          ;;\n        P)\n          [[ $OPTARG =~ (ubuntu_[0-9]+|centos_[0-9]+|debian_[0-9]+|fedora_[0-9]+|almalinux_[0-9]+|opensuse_leap_[0-9]+|rocky_[0-9]+) ]] || \\\n          { usage-down-sys-pkg; exit 1; }\n          SYS_PKG_VER=\"${SYS_PKG_VER}_$OPTARG\"\n          ACTION=\"get_sys_pkg $OPTARG\"\n          ;;\n        R)\n          ACTION=\"get_harbor_offline_pkg\"\n          ;;\n        S)\n          ACTION=\"start_kubeasz_docker\"\n          ;;\n        X)\n          ACTION=\"get_extra_images $OPTARG\"\n          ;;\n        d)\n          DOCKER_VER=\"$OPTARG\"\n          ;;\n        e)\n          EXT_BIN_VER=\"$OPTARG\"\n          ;;\n        k)\n          K8S_BIN_VER=\"$OPTARG\"\n          ;;\n        m)\n          REGISTRY_MIRROR=\"$OPTARG\"\n          ;;\n        z)\n          KUBEASZ_VER=\"$OPTARG\"\n          ;;\n        ?)\n          usage\n          exit 1\n          ;;\n      esac\n  done\n\n  [[ \"$ACTION\" == \"\" ]] && { logger error \"illegal option\"; usage; exit 1; }\n\n  # excute cmd \"$ACTION\"\n  logger info \"Action begin: $ACTION\"\n  ${ACTION} || { logger error \"Action failed: $ACTION\"; return 1; }\n  logger info \"Action successed: $ACTION\"\n}\n\nmain \"$@\"\n"
  },
  {
    "path": "manifests/deprecated/efk/es-dynamic-pv/es-statefulset.yaml",
    "content": "# RBAC authn and authz\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: elasticsearch-logging\n  namespace: kube-system\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: elasticsearch-logging\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - \"services\"\n  - \"namespaces\"\n  - \"endpoints\"\n  verbs:\n  - \"get\"\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  namespace: kube-system\n  name: elasticsearch-logging\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nsubjects:\n- kind: ServiceAccount\n  name: elasticsearch-logging\n  namespace: kube-system\n  apiGroup: \"\"\nroleRef:\n  kind: ClusterRole\n  name: elasticsearch-logging\n  apiGroup: \"\"\n---\n# Elasticsearch deployment itself\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: elasticsearch-logging\n  namespace: kube-system\n  labels:\n    k8s-app: elasticsearch-logging\n    version: v6.6.1\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  serviceName: elasticsearch-logging\n  replicas: 2\n  selector:\n    matchLabels:\n      k8s-app: elasticsearch-logging\n      version: v6.6.1\n  template:\n    metadata:\n      labels:\n        k8s-app: elasticsearch-logging\n        version: v6.6.1\n        kubernetes.io/cluster-service: \"true\"\n    spec:\n      serviceAccountName: elasticsearch-logging\n      containers:\n      #- image: gcr.io/fluentd-elasticsearch/elasticsearch:v6.6.1\n      - image: easzlab/elasticsearch:v6.6.1\n        name: elasticsearch-logging\n        resources:\n          # need more cpu upon initialization, therefore burstable class\n          limits:\n            cpu: 1000m\n          requests:\n            cpu: 100m\n        ports:\n        - containerPort: 9200\n          name: db\n          protocol: TCP\n        - containerPort: 9300\n          name: transport\n          protocol: TCP\n        volumeMounts:\n        - name: elasticsearch-logging\n          mountPath: /data\n        env:\n        - name: \"NAMESPACE\"\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n      # Elasticsearch requires vm.max_map_count to be at least 262144.\n      # If your OS already sets up this number to a higher value, feel free\n      # to remove this init container.\n      initContainers:\n      - image: alpine:3.6\n        command: [\"/sbin/sysctl\", \"-w\", \"vm.max_map_count=262144\"]\n        name: elasticsearch-logging-init\n        securityContext:\n          privileged: true\n  volumeClaimTemplates:\n  - metadata:\n      name: elasticsearch-logging\n    spec:\n      accessModes: [ \"ReadWriteMany\" ]\n      storageClassName: \"nfs-dynamic-class\"\n      resources:\n        requests:\n          storage: 4Gi\n"
  },
  {
    "path": "manifests/deprecated/efk/es-index-rotator/rotator.yaml",
    "content": "apiVersion: batch/v1beta1\nkind: CronJob\nmetadata:\n  name: es-index-rotator\n  namespace: kube-system\nspec:\n  # 每天1点3分执行\n  schedule: \"3 1 */1 * *\"\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          containers:\n          - name: es-index-rotator\n            image: easzlab/es-index-rotator:0.2.1\n            # 保留最近10天日志\n            command:\n            - /bin/rotate.sh\n            - \"10\"\n            - \"logstash\"  # fluented 默认创建的index形如'logstash-2020.01.01'\n          restartPolicy: OnFailure\n  concurrencyPolicy: Forbid\n  successfulJobsHistoryLimit: 2\n  failedJobsHistoryLimit: 1\n"
  },
  {
    "path": "manifests/deprecated/efk/es-service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: elasticsearch-logging\n  namespace: kube-system\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"Elasticsearch\"\nspec:\n  ports:\n  - port: 9200\n    protocol: TCP\n    targetPort: db\n  clusterIP: None\n  selector:\n    k8s-app: elasticsearch-logging\n"
  },
  {
    "path": "manifests/deprecated/efk/es-static-pv/es-pv0.yaml",
    "content": "apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: pv-es-0\nspec:\n  capacity:\n    storage: 4Gi\n  accessModes:\n    - ReadWriteMany\n  volumeMode: Filesystem\n  persistentVolumeReclaimPolicy: Recycle\n  storageClassName: \"es-storage-class\"\n  nfs:\n    # 根据实际共享目录修改\n    path: /share/es0\n    # 根据实际 nfs服务器地址修改\n    server: 192.168.1.208\n"
  },
  {
    "path": "manifests/deprecated/efk/es-static-pv/es-pv1.yaml",
    "content": "apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: pv-es-1\nspec:\n  capacity:\n    storage: 4Gi\n  accessModes:\n    - ReadWriteMany\n  volumeMode: Filesystem\n  persistentVolumeReclaimPolicy: Recycle\n  storageClassName: \"es-storage-class\"\n  nfs:\n    # 根据实际共享目录修改\n    path: /share/es1\n    # 根据实际 nfs服务器地址修改\n    server: 192.168.1.208\n"
  },
  {
    "path": "manifests/deprecated/efk/es-static-pv/es-pv2.yaml",
    "content": "apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: pv-es-2\nspec:\n  capacity:\n    storage: 4Gi\n  accessModes:\n    - ReadWriteMany\n  volumeMode: Filesystem\n  persistentVolumeReclaimPolicy: Recycle\n  storageClassName: \"es-storage-class\"\n  nfs:\n    # 根据实际共享目录修改\n    path: /share/es2\n    # 根据实际 nfs服务器地址修改\n    server: 192.168.1.208\n"
  },
  {
    "path": "manifests/deprecated/efk/es-static-pv/es-statefulset.yaml",
    "content": "# RBAC authn and authz\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: elasticsearch-logging\n  namespace: kube-system\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: elasticsearch-logging\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - \"services\"\n  - \"namespaces\"\n  - \"endpoints\"\n  verbs:\n  - \"get\"\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  namespace: kube-system\n  name: elasticsearch-logging\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nsubjects:\n- kind: ServiceAccount\n  name: elasticsearch-logging\n  namespace: kube-system\n  apiGroup: \"\"\nroleRef:\n  kind: ClusterRole\n  name: elasticsearch-logging\n  apiGroup: \"\"\n---\n# Elasticsearch deployment itself\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: elasticsearch-logging\n  namespace: kube-system\n  labels:\n    k8s-app: elasticsearch-logging\n    version: v6.6.1\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  serviceName: elasticsearch-logging\n  replicas: 2\n  selector:\n    matchLabels:\n      k8s-app: elasticsearch-logging\n      version: v6.6.1\n  template:\n    metadata:\n      labels:\n        k8s-app: elasticsearch-logging\n        version: v6.6.1\n        kubernetes.io/cluster-service: \"true\"\n    spec:\n      serviceAccountName: elasticsearch-logging\n      containers:\n      #- image: gcr.io/fluentd-elasticsearch/elasticsearch:v6.6.1\n      - image: easzlab/elasticsearch:v6.6.1\n        name: elasticsearch-logging\n        resources:\n          # need more cpu upon initialization, therefore burstable class\n          limits:\n            cpu: 1000m\n          requests:\n            cpu: 100m\n        ports:\n        - containerPort: 9200\n          name: db\n          protocol: TCP\n        - containerPort: 9300\n          name: transport\n          protocol: TCP\n        volumeMounts:\n        - name: elasticsearch-logging\n          mountPath: /data\n        env:\n        - name: \"NAMESPACE\"\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n      # Elasticsearch requires vm.max_map_count to be at least 262144.\n      # If your OS already sets up this number to a higher value, feel free\n      # to remove this init container.\n      initContainers:\n      - image: alpine:3.6\n        command: [\"/sbin/sysctl\", \"-w\", \"vm.max_map_count=262144\"]\n        name: elasticsearch-logging-init\n        securityContext:\n          privileged: true\n  volumeClaimTemplates:\n  - metadata:\n      name: elasticsearch-logging\n    spec:\n      accessModes: [ \"ReadWriteMany\" ]\n      storageClassName: \"es-storage-class\"\n      resources:\n        requests:\n          storage: 4Gi\n"
  },
  {
    "path": "manifests/deprecated/efk/es-without-pv/es-statefulset.yaml",
    "content": "# RBAC authn and authz\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: elasticsearch-logging\n  namespace: kube-system\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: elasticsearch-logging\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - \"services\"\n  - \"namespaces\"\n  - \"endpoints\"\n  verbs:\n  - \"get\"\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  namespace: kube-system\n  name: elasticsearch-logging\n  labels:\n    k8s-app: elasticsearch-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nsubjects:\n- kind: ServiceAccount\n  name: elasticsearch-logging\n  namespace: kube-system\n  apiGroup: \"\"\nroleRef:\n  kind: ClusterRole\n  name: elasticsearch-logging\n  apiGroup: \"\"\n---\n# Elasticsearch deployment itself\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: elasticsearch-logging\n  namespace: kube-system\n  labels:\n    k8s-app: elasticsearch-logging\n    version: v6.6.1\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  serviceName: elasticsearch-logging\n  replicas: 2\n  selector:\n    matchLabels:\n      k8s-app: elasticsearch-logging\n      version: v6.6.1\n  template:\n    metadata:\n      labels:\n        k8s-app: elasticsearch-logging\n        version: v6.6.1\n        kubernetes.io/cluster-service: \"true\"\n    spec:\n      serviceAccountName: elasticsearch-logging\n      containers:\n      #- image: gcr.io/fluentd-elasticsearch/elasticsearch:v6.6.1\n      - image: easzlab/elasticsearch:v6.6.1\n        name: elasticsearch-logging\n        resources:\n          # need more cpu upon initialization, therefore burstable class\n          limits:\n            cpu: 1000m\n          requests:\n            cpu: 100m\n        ports:\n        - containerPort: 9200\n          name: db\n          protocol: TCP\n        - containerPort: 9300\n          name: transport\n          protocol: TCP\n        volumeMounts:\n        - name: elasticsearch-logging\n          mountPath: /data\n        env:\n        - name: \"NAMESPACE\"\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n      volumes:\n      - name: elasticsearch-logging\n        emptyDir: {}\n      # Elasticsearch requires vm.max_map_count to be at least 262144.\n      # If your OS already sets up this number to a higher value, feel free\n      # to remove this init container.\n      initContainers:\n      - image: alpine:3.6\n        command: [\"/sbin/sysctl\", \"-w\", \"vm.max_map_count=262144\"]\n        name: elasticsearch-logging-init\n        securityContext:\n          privileged: true\n"
  },
  {
    "path": "manifests/deprecated/efk/fluentd-es-configmap.yaml",
    "content": "kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: fluentd-es-config-v0.2.0\n  namespace: kube-system\n  labels:\n    addonmanager.kubernetes.io/mode: Reconcile\ndata:\n  system.conf: |-\n    <system>\n      root_dir /tmp/fluentd-buffers/\n    </system>\n\n  containers.input.conf: |-\n    # This configuration file for Fluentd / td-agent is used\n    # to watch changes to Docker log files. The kubelet creates symlinks that\n    # capture the pod name, namespace, container name & Docker container ID\n    # to the docker logs for pods in the /var/log/containers directory on the host.\n    # If running this fluentd configuration in a Docker container, the /var/log\n    # directory should be mounted in the container.\n    #\n    # These logs are then submitted to Elasticsearch which assumes the\n    # installation of the fluent-plugin-elasticsearch & the\n    # fluent-plugin-kubernetes_metadata_filter plugins.\n    # See https://github.com/uken/fluent-plugin-elasticsearch &\n    # https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter for\n    # more information about the plugins.\n    #\n    # Example\n    # =======\n    # A line in the Docker log file might look like this JSON:\n    #\n    # {\"log\":\"2014/09/25 21:15:03 Got request with path wombat\\n\",\n    #  \"stream\":\"stderr\",\n    #   \"time\":\"2014-09-25T21:15:03.499185026Z\"}\n    #\n    # The time_format specification below makes sure we properly\n    # parse the time format produced by Docker. This will be\n    # submitted to Elasticsearch and should appear like:\n    # $ curl 'http://elasticsearch-logging:9200/_search?pretty'\n    # ...\n    # {\n    #      \"_index\" : \"logstash-2014.09.25\",\n    #      \"_type\" : \"fluentd\",\n    #      \"_id\" : \"VBrbor2QTuGpsQyTCdfzqA\",\n    #      \"_score\" : 1.0,\n    #      \"_source\":{\"log\":\"2014/09/25 22:45:50 Got request with path wombat\\n\",\n    #                 \"stream\":\"stderr\",\"tag\":\"docker.container.all\",\n    #                 \"@timestamp\":\"2014-09-25T22:45:50+00:00\"}\n    #    },\n    # ...\n    #\n    # The Kubernetes fluentd plugin is used to write the Kubernetes metadata to the log\n    # record & add labels to the log record if properly configured. This enables users\n    # to filter & search logs on any metadata.\n    # For example a Docker container's logs might be in the directory:\n    #\n    #  /var/lib/docker/containers/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b\n    #\n    # and in the file:\n    #\n    #  997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b-json.log\n    #\n    # where 997599971ee6... is the Docker ID of the running container.\n    # The Kubernetes kubelet makes a symbolic link to this file on the host machine\n    # in the /var/log/containers directory which includes the pod name and the Kubernetes\n    # container name:\n    #\n    #    synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log\n    #    ->\n    #    /var/lib/docker/containers/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b-json.log\n    #\n    # The /var/log directory on the host is mapped to the /var/log directory in the container\n    # running this instance of Fluentd and we end up collecting the file:\n    #\n    #   /var/log/containers/synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log\n    #\n    # This results in the tag:\n    #\n    #  var.log.containers.synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log\n    #\n    # The Kubernetes fluentd plugin is used to extract the namespace, pod name & container name\n    # which are added to the log message as a kubernetes field object & the Docker container ID\n    # is also added under the docker field object.\n    # The final tag is:\n    #\n    #   kubernetes.var.log.containers.synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log\n    #\n    # And the final log record look like:\n    #\n    # {\n    #   \"log\":\"2014/09/25 21:15:03 Got request with path wombat\\n\",\n    #   \"stream\":\"stderr\",\n    #   \"time\":\"2014-09-25T21:15:03.499185026Z\",\n    #   \"kubernetes\": {\n    #     \"namespace\": \"default\",\n    #     \"pod_name\": \"synthetic-logger-0.25lps-pod\",\n    #     \"container_name\": \"synth-lgr\"\n    #   },\n    #   \"docker\": {\n    #     \"container_id\": \"997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b\"\n    #   }\n    # }\n    #\n    # This makes it easier for users to search for logs by pod name or by\n    # the name of the Kubernetes container regardless of how many times the\n    # Kubernetes pod has been restarted (resulting in a several Docker container IDs).\n\n    # Json Log Example:\n    # {\"log\":\"[info:2016-02-16T16:04:05.930-08:00] Some log text here\\n\",\"stream\":\"stdout\",\"time\":\"2016-02-17T00:04:05.931087621Z\"}\n    # CRI Log Example:\n    # 2016-02-17T00:04:05.931087621Z stdout F [info:2016-02-16T16:04:05.930-08:00] Some log text here\n    <source>\n      @id fluentd-containers.log\n      @type tail\n      path /var/log/containers/*.log\n      pos_file /var/log/es-containers.log.pos\n      tag raw.kubernetes.*\n      read_from_head true\n      <parse>\n        @type multi_format\n        <pattern>\n          format json\n          time_key time\n          time_format %Y-%m-%dT%H:%M:%S.%NZ\n        </pattern>\n        <pattern>\n          format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/\n          time_format %Y-%m-%dT%H:%M:%S.%N%:z\n        </pattern>\n      </parse>\n    </source>\n\n    # Detect exceptions in the log output and forward them as one log entry.\n    <match raw.kubernetes.**>\n      @id raw.kubernetes\n      @type detect_exceptions\n      remove_tag_prefix raw\n      message log\n      stream stream\n      multiline_flush_interval 5\n      max_bytes 500000\n      max_lines 1000\n    </match>\n\n    # Concatenate multi-line logs\n    <filter **>\n      @id filter_concat\n      @type concat\n      key log\n      use_first_timestamp true\n      multiline_end_regexp /\\n$/\n      separator \"\"\n    </filter>\n\n    # Enriches records with Kubernetes metadata\n    <filter kubernetes.**>\n      @id filter_kubernetes_metadata\n      @type kubernetes_metadata\n    </filter>\n\n    # Fixes json fields in Elasticsearch\n    <filter kubernetes.**>\n      @id filter_parser\n      @type parser\n      key_name log\n      reserve_data true\n      remove_key_name_field true\n      <parse>\n        @type multi_format\n        <pattern>\n          format json\n        </pattern>\n        <pattern>\n          format none\n        </pattern>\n      </parse>\n    </filter>\n\n  system.input.conf: |-\n\n    # Logs from systemd-journal for interesting services.\n    # TODO(random-liu): Remove this after cri container runtime rolls out.\n    <source>\n      @id journald-docker\n      @type systemd\n      matches [{ \"_SYSTEMD_UNIT\": \"docker.service\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/journald-docker.pos\n      </storage>\n      read_from_head true\n      tag docker\n    </source>\n\n    <source>\n      @id journald-container-runtime\n      @type systemd\n      matches [{ \"_SYSTEMD_UNIT\": \"{{ fluentd_container_runtime_service }}.service\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/journald-container-runtime.pos\n      </storage>\n      read_from_head true\n      tag container-runtime\n    </source>\n\n    <source>\n      @id journald-etcd\n      @type systemd\n      matches [{ \"_SYSTEMD_UNIT\": \"etcd.service\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/journald-etcd.pos\n      </storage>\n      read_from_head true\n      tag etcd\n    </source>\n\n    <source>\n      @id journald-kube-apiserver\n      @type systemd\n      matches [{ \"_SYSTEMD_UNIT\": \"kube-apiserver.service\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/journald-kube-apiserver.pos\n      </storage>\n      read_from_head true\n      tag kube-apiserver\n    </source>\n\n    <source>\n      @id journald-kube-controller-manager\n      @type systemd\n      matches [{ \"_SYSTEMD_UNIT\": \"kube-controller-manager.service\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/journald-kube-controller-manager.pos\n      </storage>\n      read_from_head true\n      tag kube-controller-manager\n    </source>\n\n    <source>\n      @id journald-kube-scheduler\n      @type systemd\n      matches [{ \"_SYSTEMD_UNIT\": \"kube-scheduler.service\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/journald-kube-scheduler.pos\n      </storage>\n      read_from_head true\n      tag kube-scheduler\n    </source>\n\n    <source>\n      @id journald-kubelet\n      @type systemd\n      matches [{ \"_SYSTEMD_UNIT\": \"kubelet.service\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/journald-kubelet.pos\n      </storage>\n      read_from_head true\n      tag kubelet\n    </source>\n\n    <source>\n      @id journald-kube-proxy\n      @type systemd\n      matches [{ \"_SYSTEMD_UNIT\": \"kube-proxy.service\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/journald-kube-proxy.pos\n      </storage>\n      read_from_head true\n      tag kube-proxy\n    </source>\n\n    <source>\n      @id journald-node-problem-detector\n      @type systemd\n      matches [{ \"_SYSTEMD_UNIT\": \"node-problem-detector.service\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/journald-node-problem-detector.pos\n      </storage>\n      read_from_head true\n      tag node-problem-detector\n    </source>\n\n    <source>\n      @id kernel\n      @type systemd\n      matches [{ \"_TRANSPORT\": \"kernel\" }]\n      <storage>\n        @type local\n        persistent true\n        path /var/log/kernel.pos\n      </storage>\n      <entry>\n        fields_strip_underscores true\n        fields_lowercase true\n      </entry>\n      read_from_head true\n      tag kernel\n    </source>\n\n  forward.input.conf: |-\n    # Takes the messages sent over TCP\n    <source>\n      @id forward\n      @type forward\n    </source>\n\n  monitoring.conf: |-\n    # Prometheus Exporter Plugin\n    # input plugin that exports metrics\n    <source>\n      @id prometheus\n      @type prometheus\n    </source>\n\n    <source>\n      @id monitor_agent\n      @type monitor_agent\n    </source>\n\n    # input plugin that collects metrics from MonitorAgent\n    <source>\n      @id prometheus_monitor\n      @type prometheus_monitor\n      <labels>\n        host ${hostname}\n      </labels>\n    </source>\n\n    # input plugin that collects metrics for output plugin\n    <source>\n      @id prometheus_output_monitor\n      @type prometheus_output_monitor\n      <labels>\n        host ${hostname}\n      </labels>\n    </source>\n\n    # input plugin that collects metrics for in_tail plugin\n    <source>\n      @id prometheus_tail_monitor\n      @type prometheus_tail_monitor\n      <labels>\n        host ${hostname}\n      </labels>\n    </source>\n\n  output.conf: |-\n    <match **>\n      @id elasticsearch\n      @type elasticsearch\n      @log_level info\n      type_name _doc\n      include_tag_key true\n      host elasticsearch-logging\n      port 9200\n      logstash_format true\n      <buffer>\n        @type file\n        path /var/log/fluentd-buffers/kubernetes.system.buffer\n        flush_mode interval\n        retry_type exponential_backoff\n        flush_thread_count 2\n        flush_interval 5s\n        retry_forever\n        retry_max_interval 30\n        chunk_limit_size 2M\n        queue_limit_length 8\n        overflow_action block\n      </buffer>\n    </match>\n"
  },
  {
    "path": "manifests/deprecated/efk/fluentd-es-ds.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: fluentd-es\n  namespace: kube-system\n  labels:\n    k8s-app: fluentd-es\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: fluentd-es\n  labels:\n    k8s-app: fluentd-es\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - \"namespaces\"\n  - \"pods\"\n  verbs:\n  - \"get\"\n  - \"watch\"\n  - \"list\"\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: fluentd-es\n  labels:\n    k8s-app: fluentd-es\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nsubjects:\n- kind: ServiceAccount\n  name: fluentd-es\n  namespace: kube-system\n  apiGroup: \"\"\nroleRef:\n  kind: ClusterRole\n  name: fluentd-es\n  apiGroup: \"\"\n---\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: fluentd-es-v2.4.0\n  namespace: kube-system\n  labels:\n    k8s-app: fluentd-es\n    version: v2.4.0\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  selector:\n    matchLabels:\n      k8s-app: fluentd-es\n      version: v2.4.0\n  template:\n    metadata:\n      labels:\n        k8s-app: fluentd-es\n        kubernetes.io/cluster-service: \"true\"\n        version: v2.4.0\n      # This annotation ensures that fluentd does not get evicted if the node\n      # supports critical pod annotation based priority scheme.\n      # Note that this does not guarantee admission on the nodes (#40573).\n      annotations:\n        seccomp.security.alpha.kubernetes.io/pod: 'docker/default'\n    spec:\n      priorityClassName: system-node-critical\n      serviceAccountName: fluentd-es\n      containers:\n      - name: fluentd-es\n        #image: k8s.gcr.io/fluentd-elasticsearch:v2.4.0\n        image: mirrorgooglecontainers/fluentd-elasticsearch:v2.4.0\n        env:\n        - name: FLUENTD_ARGS\n          value: --no-supervisor -q\n        resources:\n          limits:\n            memory: 500Mi\n          requests:\n            cpu: 100m\n            memory: 200Mi\n        volumeMounts:\n        - name: varlog\n          mountPath: /var/log\n        - name: varlibdockercontainers\n          mountPath: /var/lib/docker/containers\n          readOnly: true\n        - name: config-volume\n          mountPath: /etc/fluent/config.d\n      #nodeSelector:\n        #beta.kubernetes.io/fluentd-ds-ready: \"true\"\n      terminationGracePeriodSeconds: 30\n      volumes:\n      - name: varlog\n        hostPath:\n          path: /var/log\n      - name: varlibdockercontainers\n        hostPath:\n          path: /var/lib/docker/containers\n      - name: config-volume\n        configMap:\n          name: fluentd-es-config-v0.2.0\n"
  },
  {
    "path": "manifests/deprecated/efk/kibana-deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kibana-logging\n  namespace: kube-system\n  labels:\n    k8s-app: kibana-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      k8s-app: kibana-logging\n  template:\n    metadata:\n      labels:\n        k8s-app: kibana-logging\n      annotations:\n        seccomp.security.alpha.kubernetes.io/pod: 'docker/default'\n    spec:\n      containers:\n      - name: kibana-logging\n        #image: docker.elastic.co/kibana/kibana-oss:6.6.1\n        image: easzlab/kibana-oss:6.6.1\n        resources:\n          # need more cpu upon initialization, therefore burstable class\n          limits:\n            cpu: 1000m\n          requests:\n            cpu: 100m\n        env:\n          - name: ELASTICSEARCH_URL\n            value: http://elasticsearch-logging:9200\n         # if kibana service is exposed by nodePort, use lines commited out instead\n         #- name: SERVER_BASEPATH\n         #  value: \"\"\n          - name: SERVER_BASEPATH\n            value: /api/v1/namespaces/kube-system/services/kibana-logging/proxy\n        ports:\n        - containerPort: 5601\n          name: ui\n          protocol: TCP\n"
  },
  {
    "path": "manifests/deprecated/efk/kibana-service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: kibana-logging\n  namespace: kube-system\n  labels:\n    k8s-app: kibana-logging\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"Kibana\"\nspec:\n  ports:\n  - port: 5601\n    protocol: TCP\n    targetPort: ui\n  selector:\n    k8s-app: kibana-logging\n  #type: NodePort\n"
  },
  {
    "path": "manifests/deprecated/efk/log-pilot/log-pilot-filebeat.yaml",
    "content": "apiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: log-pilot\n  labels:\n    app: log-pilot\n  namespace: kube-system\nspec:\n  selector:\n    matchLabels:\n      app: log-pilot\n  updateStrategy:\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: log-pilot\n    spec:\n      # 是否允许部署到Master节点上\n      #tolerations:\n      #- key: node-role.kubernetes.io/master\n      #  effect: NoSchedule\n      # priorityClassName: system-cluster-critical\n      containers:\n      - name: log-pilot\n        # 版本请参考https://github.com/AliyunContainerService/log-pilot/releases\n        image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.7-filebeat\n        resources:\n          limits:\n            memory: 500Mi\n          requests:\n            cpu: 200m\n            memory: 200Mi\n        env:\n          - name: \"NODE_NAME\"\n            valueFrom:\n              fieldRef:\n                fieldPath: spec.nodeName\n          - name: \"LOGGING_OUTPUT\"\n            value: \"elasticsearch\"\n          # 请确保集群到ES网络可达\n          - name: \"ELASTICSEARCH_HOSTS\"\n            value: \"elasticsearch-logging:9200\"\n          # 配置ES访问权限\n          - name: \"ELASTICSEARCH_USER\"\n            value: \"\"\n          - name: \"ELASTICSEARCH_PASSWORD\"\n            value: \"\"\n        volumeMounts:\n        - name: sock\n          mountPath: /var/run/docker.sock\n        - name: root\n          mountPath: /host\n          readOnly: true\n        - name: varlib\n          mountPath: /var/lib/filebeat\n        - name: varlog\n          mountPath: /var/log/filebeat\n        - name: localtime\n          mountPath: /etc/localtime\n          readOnly: true\n        livenessProbe:\n          failureThreshold: 3\n          exec:\n            command:\n            - /pilot/healthz\n          initialDelaySeconds: 10\n          periodSeconds: 10\n          successThreshold: 1\n          timeoutSeconds: 2\n        securityContext:\n          capabilities:\n            add:\n            - SYS_ADMIN\n      terminationGracePeriodSeconds: 30\n      imagePullSecrets:\n      - name: ydy-test-key\n      volumes:\n      - name: sock\n        hostPath:\n          path: /var/run/docker.sock\n      - name: root\n        hostPath:\n          path: /\n      - name: varlib\n        hostPath:\n          path: /var/lib/filebeat\n          type: DirectoryOrCreate\n      - name: varlog\n        hostPath:\n          path: /var/log/filebeat\n          type: DirectoryOrCreate\n      - name: localtime\n        hostPath:\n          path: /etc/localtime\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/.helmignore",
    "content": ".git\n# OWNERS file for Kubernetes\nOWNERS"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/Chart.yaml",
    "content": "name: elasticsearch\nhome: https://www.elastic.co/products/elasticsearch\nversion: 1.7.2\nappVersion: 6.4.0\ndescription: Flexible and powerful open source, distributed real-time search and analytics\n  engine.\nicon: https://static-www.elastic.co/assets/blteb1c97719574938d/logo-elastic-elasticsearch-lt.svg\nsources:\n- https://www.elastic.co/products/elasticsearch\n- https://github.com/jetstack/elasticsearch-pet\n- https://github.com/giantswarm/kubernetes-elastic-stack\n- https://github.com/GoogleCloudPlatform/elasticsearch-docker\n- https://github.com/clockworksoul/helm-elasticsearch\n- https://github.com/pires/kubernetes-elasticsearch-cluster\nmaintainers:\n- name: simonswine\n  email: christian@jetstack.io\n- name: icereval\n  email: michael.haselton@gmail.com\n- name: rendhalver\n  email: pete.brown@powerhrg.com\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/OWNERS",
    "content": "approvers:\n- simonswine\n- icereval\n- rendhalver\nreviewers:\n- simonswine\n- icereval\n- rendhalver\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/README.md",
    "content": "# Elasticsearch Helm Chart\n\nThis chart uses a standard Docker image of Elasticsearch (docker.elastic.co/elasticsearch/elasticsearch-oss) and uses a service pointing to the master's transport port for service discovery.\nElasticsearch does not communicate with the Kubernetes API, hence no need for RBAC permissions.\n\n## Warning for previous users\nIf you are currently using an earlier version of this Chart you will need to redeploy your Elasticsearch clusters. The discovery method used here is incompatible with using RBAC.\nIf you are upgrading to Elasticsearch 6 from the 5.5 version used in this chart before, please note that your cluster needs to do a full cluster restart.\nThe simplest way to do that is to delete the installation (keep the PVs) and install this chart again with the new version.\nIf you want to avoid doing that upgrade to Elasticsearch 5.6 first before moving on to Elasticsearch 6.0.\n\n## Prerequisites Details\n\n* Kubernetes 1.6+\n* PV dynamic provisioning support on the underlying infrastructure\n\n## StatefulSets Details\n* https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/\n\n## StatefulSets Caveats\n* https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#limitations\n\n## Todo\n\n* Implement TLS/Auth/Security\n* Smarter upscaling/downscaling\n* Solution for memory locking\n\n## Chart Details\nThis chart will do the following:\n\n* Implemented a dynamically scalable elasticsearch cluster using Kubernetes StatefulSets/Deployments\n* Multi-role deployment: master, client (coordinating) and data nodes\n* Statefulset Supports scaling down without degrading the cluster\n\n## Installing the Chart\n\nTo install the chart with the release name `my-release`:\n\n```bash\n$ helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator\n$ helm install --name my-release incubator/elasticsearch\n```\n\n## Deleting the Charts\n\nDelete the Helm deployment as normal\n\n```\n$ helm delete my-release\n```\n\nDeletion of the StatefulSet doesn't cascade to deleting associated PVCs. To delete them:\n\n```\n$ kubectl delete pvc -l release=my-release,component=data\n```\n\n## Configuration\n\nThe following table lists the configurable parameters of the elasticsearch chart and their default values.\n\n|              Parameter               |                             Description                             |               Default                |\n| ------------------------------------ | ------------------------------------------------------------------- | ------------------------------------ |\n| `appVersion`                         | Application Version (Elasticsearch)                                 | `6.4.0`                              |\n| `image.repository`                   | Container image name                                                | `docker.elastic.co/elasticsearch/elasticsearch-oss` |\n| `image.tag`                          | Container image tag                                                 | `6.4.0`                              |\n| `image.pullPolicy`                   | Container pull policy                                               | `Always`                             |\n| `cluster.name`                       | Cluster name                                                        | `elasticsearch`                      |\n| `cluster.xpackEnable`                | Writes the X-Pack configuration options to the configuration file   | `false`                              |\n| `cluster.config`                     | Additional cluster config appended                                  | `{}`                                 |\n| `cluster.keystoreSecret`             | Name of secret holding secure config options in an es keystore      | `nil`                                |\n| `cluster.env`                        | Cluster environment variables                                       | `{MINIMUM_MASTER_NODES: \"2\"}`        |\n| `client.name`                        | Client component name                                               | `client`                             |\n| `client.replicas`                    | Client node replicas (deployment)                                   | `2`                                  |\n| `client.resources`                   | Client node resources requests & limits                             | `{} - cpu limit must be an integer`  |\n| `client.priorityClassName`           | Client priorityClass                                                | `nil`                                |\n| `client.heapSize`                    | Client node heap size                                               | `512m`                               |\n| `client.podAnnotations`              | Client Deployment annotations                                       | `{}`                                 |\n| `client.nodeSelector`                | Node labels for client pod assignment                               | `{}`                                 |\n| `client.tolerations`                 | Client tolerations                                                  | `[]`                                 |\n| `client.serviceAnnotations`          | Client Service annotations                                          | `{}`                                 |\n| `client.serviceType`                 | Client service type                                                 | `ClusterIP`                          |\n| `client.loadBalancerIP`              | Client loadBalancerIP                                               | `{}`                                 |\n| `client.loadBalancerSourceRanges`    | Client loadBalancerSourceRanges                                     | `{}`                                 |\n| `master.exposeHttp`                  | Expose http port 9200 on master Pods for monitoring, etc            | `false`                              |\n| `master.name`                        | Master component name                                               | `master`                             |\n| `master.replicas`                    | Master node replicas (deployment)                                   | `2`                                  |\n| `master.resources`                   | Master node resources requests & limits                             | `{} - cpu limit must be an integer`  |\n| `master.priorityClassName`           | Master priorityClass                                                | `nil`                                |\n| `master.podAnnotations`              | Master Deployment annotations                                       | `{}`                                 |\n| `master.nodeSelector`                | Node labels for master pod assignment                               | `{}`                                 |\n| `master.tolerations`                 | Master tolerations                                                  | `[]`                                 |\n| `master.heapSize`                    | Master node heap size                                               | `512m`                               |\n| `master.name`                        | Master component name                                               | `master`                             |\n| `master.persistence.enabled`         | Master persistent enabled/disabled                                  | `true`                               |\n| `master.persistence.name`            | Master statefulset PVC template name                                | `data`                               |\n| `master.persistence.size`            | Master persistent volume size                                       | `4Gi`                                |\n| `master.persistence.storageClass`    | Master persistent volume Class                                      | `nil`                                |\n| `master.persistence.accessMode`      | Master persistent Access Mode                                       | `ReadWriteOnce`                      |\n| `data.exposeHttp`                    | Expose http port 9200 on data Pods for monitoring, etc              | `false`                              |\n| `data.replicas`                      | Data node replicas (statefulset)                                    | `2`                                  |\n| `data.resources`                     | Data node resources requests & limits                               | `{} - cpu limit must be an integer`  |\n| `data.priorityClassName`             | Data priorityClass                                                  | `nil`                                |\n| `data.heapSize`                      | Data node heap size                                                 | `1536m`                              |\n| `data.persistence.enabled`           | Data persistent enabled/disabled                                    | `true`                               |\n| `data.persistence.name`              | Data statefulset PVC template name                                  | `data`                               |\n| `data.persistence.size`              | Data persistent volume size                                         | `30Gi`                               |\n| `data.persistence.storageClass`      | Data persistent volume Class                                        | `nil`                                |\n| `data.persistence.accessMode`        | Data persistent Access Mode                                         | `ReadWriteOnce`                      |\n| `data.podAnnotations`                | Data StatefulSet annotations                                        | `{}`                                 |\n| `data.nodeSelector`                  | Node labels for data pod assignment                                 | `{}`                                 |\n| `data.tolerations`                   | Data tolerations                                                    | `[]`                                 |\n| `data.terminationGracePeriodSeconds` | Data termination grace period (seconds)                             | `3600`                               |\n| `data.antiAffinity`                  | Data anti-affinity policy                                           | `soft`                               |\n\nSpecify each parameter using the `--set key=value[,key=value]` argument to `helm install`.\n\nIn terms of Memory resources you should make sure that you follow that equation:\n\n- `${role}HeapSize < ${role}MemoryRequests < ${role}MemoryLimits`\n\nThe YAML value of cluster.config is appended to elasticsearch.yml file for additional customization (\"script.inline: on\" for example to allow inline scripting)\n\n# Deep dive\n\n## Application Version\n\nThis chart aims to support Elasticsearch v2 and v5 deployments by specifying the `values.yaml` parameter `appVersion`.\n\n### Version Specific Features\n\n* Memory Locking *(variable renamed)*\n* Ingest Node *(v5)*\n* X-Pack Plugin *(v5)*\n\nUpgrade paths & more info: https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-upgrade.html\n\n## Mlocking\n\nThis is a limitation in kubernetes right now. There is no way to raise the\nlimits of lockable memory, so that these memory areas won't be swapped. This\nwould degrade performance heavily. The issue is tracked in\n[kubernetes/#3595](https://github.com/kubernetes/kubernetes/issues/3595).\n\n```\n[WARN ][bootstrap] Unable to lock JVM Memory: error=12,reason=Cannot allocate memory\n[WARN ][bootstrap] This can result in part of the JVM being swapped out.\n[WARN ][bootstrap] Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536\n```\n\n## Minimum Master Nodes\n> The minimum_master_nodes setting is extremely important to the stability of your cluster. This setting helps prevent split brains, the existence of two masters in a single cluster.\n\n>When you have a split brain, your cluster is at danger of losing data. Because the master is considered the supreme ruler of the cluster, it decides when new indices can be created, how shards are moved, and so forth. If you have two masters, data integrity becomes perilous, since you have two nodes that think they are in charge.\n\n>This setting tells Elasticsearch to not elect a master unless there are enough master-eligible nodes available. Only then will an election take place.\n\n>This setting should always be configured to a quorum (majority) of your master-eligible nodes. A quorum is (number of master-eligible nodes / 2) + 1\n\nMore info: https://www.elastic.co/guide/en/elasticsearch/guide/1.x/_important_configuration_changes.html#_minimum_master_nodes\n\n# Client and Coordinating Nodes\n\nElasticsearch v5 terminology has updated, and now refers to a `Client Node` as a `Coordinating Node`.\n\nMore info: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/modules-node.html#coordinating-node\n\n## Select right storage class for SSD volumes\n\n### GCE + Kubernetes 1.5\n\nCreate StorageClass for SSD-PD\n\n```\n$ kubectl create -f - <<EOF\nkind: StorageClass\napiVersion: apps/v1 \nmetadata:\n  name: ssd\nprovisioner: kubernetes.io/gce-pd\nparameters:\n  type: pd-ssd\nEOF\n```\nCreate cluster with Storage class `ssd` on Kubernetes 1.5+\n\n```\n$ helm install incubator/elasticsearch --name my-release --set data.storageClass=ssd,data.storage=100Gi\n```\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/NOTES.txt",
    "content": "The elasticsearch cluster has been installed.\n\nElasticsearch can be accessed:\n\n  * Within your cluster, at the following DNS name at port 9200:\n\n    {{ template \"elasticsearch.client.fullname\" . }}.{{ .Release.Namespace }}.svc.cluster.local\n\n  * From outside the cluster, run these commands in the same shell:\n    {{- if contains \"NodePort\" .Values.client.serviceType }}\n\n    export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath=\"{.spec.ports[0].nodePort}\" services {{ template \"elasticsearch.client.fullname\" . }})\n    export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath=\"{.items[0].status.addresses[0].address}\")\n    echo http://$NODE_IP:$NODE_PORT\n    {{- else if contains \"LoadBalancer\" .Values.client.serviceType }}\n\n     WARNING: You have likely exposed your Elasticsearch cluster direct to the internet.\n              Elasticsearch does not implement any security for public facing clusters by default.\n              As a minimum level of security; switch to ClusterIP/NodePort and place an Nginx gateway infront of the cluster in order to lock down access to dangerous HTTP endpoints and verbs.\n\n     NOTE: It may take a few minutes for the LoadBalancer IP to be available.\n           You can watch the status of by running 'kubectl get svc -w {{ template \"elasticsearch.client.fullname\" . }}'\n\n    export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template \"elasticsearch.client.fullname\" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\n    echo http://$SERVICE_IP:9200\n    {{- else if contains \"ClusterIP\"  .Values.client.serviceType }}\n\n    export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l \"app={{ template \"elasticsearch.name\" . }},component={{ .Values.client.name }},release={{ .Release.Name }}\" -o jsonpath=\"{.items[0].metadata.name}\")\n    echo \"Visit http://127.0.0.1:9200 to use Elasticsearch\"\n    kubectl port-forward --namespace {{ .Release.Namespace }} $POD_NAME 9200:9200\n    {{- end }}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"elasticsearch.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"elasticsearch.fullname\" -}}\n{{- if .Values.fullnameOverride -}}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- if contains $name .Release.Name -}}\n{{- .Release.Name | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n{{- end -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified client name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"elasticsearch.client.fullname\" -}}\n{{ template \"elasticsearch.fullname\" . }}-{{ .Values.client.name }}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified data name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"elasticsearch.data.fullname\" -}}\n{{ template \"elasticsearch.fullname\" . }}-{{ .Values.data.name }}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified master name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"elasticsearch.master.fullname\" -}}\n{{ template \"elasticsearch.fullname\" . }}-{{ .Values.master.name }}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/client-deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app: {{ template \"elasticsearch.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    component: \"{{ .Values.client.name }}\"\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: {{ template \"elasticsearch.client.fullname\" . }}\nspec:\n  replicas: {{ .Values.client.replicas }}\n  selector:\n    matchLabels:\n      app: {{ template \"elasticsearch.name\" . }}\n      component: \"{{ .Values.client.name }}\"\n  template:\n    metadata:\n      labels:\n        app: {{ template \"elasticsearch.name\" . }}\n        component: \"{{ .Values.client.name }}\"\n        release: {{ .Release.Name }}\n        {{- if .Values.client.podAnnotations }}\n      annotations:\n{{ toYaml .Values.client.podAnnotations | indent 8 }}\n        {{- end }}\n    spec:\n{{- if .Values.client.priorityClassName }}\n      priorityClassName: \"{{ .Values.client.priorityClassName }}\"\n{{- end }}\n      securityContext:\n        fsGroup: 1000\n      {{- if eq .Values.client.antiAffinity \"hard\" }}\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - topologyKey: \"kubernetes.io/hostname\"\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"elasticsearch.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n                  component: \"{{ .Values.client.name }}\"\n      {{- else if eq .Values.client.antiAffinity \"soft\" }}\n      affinity:\n        podAntiAffinity:\n          preferredDuringSchedulingIgnoredDuringExecution:\n          - weight: 1\n            podAffinityTerm:\n              topologyKey: kubernetes.io/hostname\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"elasticsearch.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n                  component: \"{{ .Values.client.name }}\"\n      {{- end }}\n{{- if .Values.client.nodeSelector }}\n      nodeSelector:\n{{ toYaml .Values.client.nodeSelector | indent 8 }}\n{{- end }}\n{{- if .Values.client.tolerations }}\n      tolerations:\n{{ toYaml .Values.client.tolerations | indent 8 }}\n{{- end }}\n      initContainers:\n      # see https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html\n      # and https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html#mlockall\n      - name: \"sysctl\"\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\"\n        imagePullPolicy: \"Always\"\n        command: [\"sysctl\", \"-w\", \"vm.max_map_count=262144\"]\n        securityContext:\n          privileged: true\n      containers:\n      - name: elasticsearch\n        env:\n        - name: NODE_DATA\n          value: \"false\"\n{{- if hasPrefix \"5.\" .Values.appVersion }}\n        - name: NODE_INGEST\n          value: \"false\"\n{{- end }}\n        - name: NODE_MASTER\n          value: \"false\"\n        - name: DISCOVERY_SERVICE\n          value: {{ template \"elasticsearch.fullname\" . }}-discovery\n        - name: PROCESSORS\n          valueFrom:\n            resourceFieldRef:\n              resource: limits.cpu\n        - name: ES_JAVA_OPTS\n          value: \"-Djava.net.preferIPv4Stack=true -Xms{{ .Values.client.heapSize }} -Xmx{{ .Values.client.heapSize }}\"\n        {{- range $key, $value :=  .Values.cluster.env }}\n        - name: {{ $key }}\n          value: {{ $value | quote }}\n        {{- end }}\n        resources:\n{{ toYaml .Values.client.resources | indent 12 }}\n        readinessProbe:\n          httpGet:\n            path: /_cluster/health\n            port: 9200\n          initialDelaySeconds: 5\n        livenessProbe:\n          httpGet:\n            path: /_cluster/health\n            port: 9200\n          initialDelaySeconds: 90\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\"\n        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}\n        ports:\n        - containerPort: 9200\n          name: http\n        - containerPort: 9300\n          name: transport\n        volumeMounts:\n        - mountPath: /usr/share/elasticsearch/config/elasticsearch.yml\n          name: config\n          subPath: elasticsearch.yml\n{{- if hasPrefix \"2.\" .Values.image.tag }}\n        - mountPath: /usr/share/elasticsearch/config/logging.yml\n          name: config\n          subPath: logging.yml\n{{- end }}\n{{- if hasPrefix \"5.\" .Values.image.tag }}\n        - mountPath: /usr/share/elasticsearch/config/log4j2.properties\n          name: config\n          subPath: log4j2.properties\n{{- end }}\n{{- if .Values.cluster.keystoreSecret }}\n        - name: keystore\n          mountPath: \"/usr/share/elasticsearch/config/elasticsearch.keystore\"\n          subPath: elasticsearch.keystore\n          readOnly: true\n{{- end }}\n{{- if .Values.image.pullSecrets }}\n      imagePullSecrets:\n      {{- range $pullSecret := .Values.image.pullSecrets }}\n        - name: {{ $pullSecret }}\n      {{- end }}\n{{- end }}\n      volumes:\n      - name: config\n        configMap:\n          name: {{ template \"elasticsearch.fullname\" . }}\n{{- if .Values.cluster.keystoreSecret }}\n      - name: keystore\n        secret:\n          secretName: {{ .Values.cluster.keystoreSecret }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/client-pdb.yaml",
    "content": "{{- if .Values.client.podDisruptionBudget.enabled }}\napiVersion: policy/v1beta1\nkind: PodDisruptionBudget\nmetadata:\n  labels:\n    app: {{ template \"elasticsearch.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    component: \"{{ .Values.client.name }}\"\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: {{ template \"elasticsearch.client.fullname\" . }}\nspec:\n{{- if .Values.client.podDisruptionBudget.minAvailable }}\n  minAvailable: {{ .Values.client.podDisruptionBudget.minAvailable }}\n{{- end }}\n{{- if .Values.client.podDisruptionBudget.maxUnavailable }}\n  maxUnavailable: {{ .Values.client.podDisruptionBudget.maxUnavailable }}\n{{- end }}\n  selector:\n    matchLabels:\n      app: {{ template \"elasticsearch.name\" . }}\n      component: \"{{ .Values.client.name }}\"\n      release: {{ .Release.Name }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/client-svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app: {{ template \"elasticsearch.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    component: \"{{ .Values.client.name }}\"\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: {{ template \"elasticsearch.client.fullname\" . }}\n{{- if .Values.client.serviceAnnotations }}\n  annotations:\n{{ toYaml .Values.client.serviceAnnotations | indent 4 }}\n{{- end }}\n\nspec:\n  ports:\n    - name: http\n      port: 9200\n      targetPort: 9200\n    - name: tcp\n      port: 9300\n      targetPort: 9300\n  selector:\n    app: {{ template \"elasticsearch.name\" . }}\n    component: \"{{ .Values.client.name }}\"\n    release: {{ .Release.Name }}\n  type: {{ .Values.client.serviceType }}\n{{- if .Values.client.loadBalancerIP }}\n  loadBalancerIP: \"{{ .Values.client.loadBalancerIP }}\"\n{{- end }}\n  {{if .Values.client.loadBalancerSourceRanges}}\n  loadBalancerSourceRanges:\n    {{range $rangeList := .Values.client.loadBalancerSourceRanges}}\n    - {{ $rangeList }}\n    {{end}}\n  {{end}}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"elasticsearch.fullname\" . }}\n  labels:\n    app: {{ template \"elasticsearch.fullname\" . }}\n    chart: \"{{ .Chart.Name }}-{{ .Chart.Version }}\"\n    release: \"{{ .Release.Name }}\"\n    heritage: \"{{ .Release.Service }}\"\ndata:\n  elasticsearch.yml: |-\n    cluster.name: {{ .Values.cluster.name }}\n\n    node.data: ${NODE_DATA:true}\n    node.master: ${NODE_MASTER:true}\n{{- if hasPrefix \"5.\" .Values.appVersion }}\n    node.ingest: ${NODE_INGEST:true}\n{{- else if hasPrefix \"6.\" .Values.appVersion }}\n    node.ingest: ${NODE_INGEST:true}\n{{- end }}\n    node.name: ${HOSTNAME}\n\n    network.host: 0.0.0.0\n\n{{- if hasPrefix \"2.\" .Values.appVersion }}\n    # see https://github.com/kubernetes/kubernetes/issues/3595\n    bootstrap.mlockall: ${BOOTSTRAP_MLOCKALL:false}\n\n    discovery:\n      zen:\n        ping.unicast.hosts: ${DISCOVERY_SERVICE:}\n        minimum_master_nodes: ${MINIMUM_MASTER_NODES:2}\n{{- else if hasPrefix \"5.\" .Values.appVersion }}\n    # see https://github.com/kubernetes/kubernetes/issues/3595\n    bootstrap.memory_lock: ${BOOTSTRAP_MEMORY_LOCK:false}\n\n    discovery:\n      zen:\n        ping.unicast.hosts: ${DISCOVERY_SERVICE:}\n        minimum_master_nodes: ${MINIMUM_MASTER_NODES:2}\n\n{{- if .Values.cluster.xpackEnable }}\n    # see https://www.elastic.co/guide/en/x-pack/current/xpack-settings.html\n    xpack.ml.enabled: ${XPACK_ML_ENABLED:false}\n    xpack.monitoring.enabled: ${XPACK_MONITORING_ENABLED:false}\n    xpack.security.enabled: ${XPACK_SECURITY_ENABLED:false}\n    xpack.watcher.enabled: ${XPACK_WATCHER_ENABLED:false}\n{{- end }}\n{{- else if hasPrefix \"6.\" .Values.appVersion }}\n    # see https://github.com/kubernetes/kubernetes/issues/3595\n    bootstrap.memory_lock: ${BOOTSTRAP_MEMORY_LOCK:false}\n\n    discovery:\n      zen:\n        ping.unicast.hosts: ${DISCOVERY_SERVICE:}\n        minimum_master_nodes: ${MINIMUM_MASTER_NODES:2}\n\n{{- if .Values.cluster.xpackEnable }}\n    # see https://www.elastic.co/guide/en/x-pack/current/xpack-settings.html\n    xpack.ml.enabled: ${XPACK_ML_ENABLED:false}\n    xpack.monitoring.enabled: ${XPACK_MONITORING_ENABLED:false}\n    xpack.security.enabled: ${XPACK_SECURITY_ENABLED:false}\n    xpack.watcher.enabled: ${XPACK_WATCHER_ENABLED:false}\n{{- end }}\n{{- end }}\n\n    # see https://github.com/elastic/elasticsearch-definitive-guide/pull/679\n    processors: ${PROCESSORS:}\n\n    # avoid split-brain w/ a minimum consensus of two masters plus a data node\n    gateway.expected_master_nodes: ${EXPECTED_MASTER_NODES:2}\n    gateway.expected_data_nodes: ${EXPECTED_DATA_NODES:1}\n    gateway.recover_after_time: ${RECOVER_AFTER_TIME:5m}\n    gateway.recover_after_master_nodes: ${RECOVER_AFTER_MASTER_NODES:2}\n    gateway.recover_after_data_nodes: ${RECOVER_AFTER_DATA_NODES:1}\n{{- with .Values.cluster.config }}\n{{ toYaml . | indent 4 }}\n{{- end }}\n{{- if hasPrefix \"2.\" .Values.image.tag }}\n  logging.yml: |-\n    # you can override this using by setting a system property, for example -Des.logger.level=DEBUG\n    es.logger.level: INFO\n    rootLogger: ${es.logger.level}, console\n    logger:\n      # log action execution errors for easier debugging\n      action: DEBUG\n      # reduce the logging for aws, too much is logged under the default INFO\n      com.amazonaws: WARN\n    appender:\n      console:\n        type: console\n        layout:\n          type: consolePattern\n          conversionPattern: \"[%d{ISO8601}][%-5p][%-25c] %m%n\"\n{{- else if hasPrefix \"5.\" .Values.image.tag }}\n  log4j2.properties: |-\n    status = error\n    appender.console.type = Console\n    appender.console.name = console\n    appender.console.layout.type = PatternLayout\n    appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n\n    rootLogger.level = info\n    rootLogger.appenderRef.console.ref = console\n    logger.searchguard.name = com.floragunn\n    logger.searchguard.level = info\n{{- else if hasPrefix \"6.\" .Values.image.tag }}\n  log4j2.properties: |-\n    status = error\n    appender.console.type = Console\n    appender.console.name = console\n    appender.console.layout.type = PatternLayout\n    appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n\n    rootLogger.level = info\n    rootLogger.appenderRef.console.ref = console\n    logger.searchguard.name = com.floragunn\n    logger.searchguard.level = info\n{{- end }}\n  pre-stop-hook.sh: |-\n    #!/bin/bash\n    exec &> >(tee -a \"/var/log/elasticsearch-hooks.log\")\n    NODE_NAME=${HOSTNAME}\n    echo \"Prepare to migrate data of the node ${NODE_NAME}\"\n    echo \"Move all data from node ${NODE_NAME}\"\n    curl -s -XPUT -H 'Content-Type: application/json' '{{ template \"elasticsearch.client.fullname\" . }}:9200/_cluster/settings' -d \"{\n      \\\"transient\\\" :{\n          \\\"cluster.routing.allocation.exclude._name\\\" : \\\"${NODE_NAME}\\\"\n      }\n    }\"\n    echo \"\"\n\n    while true ; do\n      echo -e \"Wait for node ${NODE_NAME} to become empty\"\n      SHARDS_ALLOCATION=$(curl -s -XGET 'http://{{ template \"elasticsearch.client.fullname\" . }}:9200/_cat/shards')\n      if ! echo \"${SHARDS_ALLOCATION}\" | grep -E \"${NODE_NAME}\"; then\n        break\n      fi\n      sleep 1\n    done\n    echo \"Node ${NODE_NAME} is ready to shutdown\"\n  post-start-hook.sh: |-\n    #!/bin/bash\n    exec &> >(tee -a \"/var/log/elasticsearch-hooks.log\")\n    NODE_NAME=${HOSTNAME}\n    CLUSTER_SETTINGS=$(curl -s -XGET \"http://{{ template \"elasticsearch.client.fullname\" . }}:9200/_cluster/settings\")\n    if echo \"${CLUSTER_SETTINGS}\" | grep -E \"${NODE_NAME}\"; then\n      echo \"Activate node ${NODE_NAME}\"\n      curl -s -XPUT -H 'Content-Type: application/json' \"http://{{ template \"elasticsearch.client.fullname\" . }}:9200/_cluster/settings\" -d \"{\n        \\\"transient\\\" :{\n            \\\"cluster.routing.allocation.exclude._name\\\" : null\n        }\n      }\"\n    fi\n    echo \"Node ${NODE_NAME} is ready to be used\"\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/data-pdb.yaml",
    "content": "{{- if .Values.data.podDisruptionBudget.enabled }}\napiVersion: policy/v1beta1\nkind: PodDisruptionBudget\nmetadata:\n  labels:\n    app: {{ template \"elasticsearch.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    component: \"{{ .Values.data.name }}\"\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: {{ template \"elasticsearch.data.fullname\" . }}\nspec:\n{{- if .Values.data.podDisruptionBudget.minAvailable }}\n  minAvailable: {{ .Values.data.podDisruptionBudget.minAvailable }}\n{{- end }}\n{{- if .Values.data.podDisruptionBudget.maxUnavailable }}\n  maxUnavailable: {{ .Values.data.podDisruptionBudget.maxUnavailable }}\n{{- end }}\n  selector:\n    matchLabels:\n      app: {{ template \"elasticsearch.name\" . }}\n      component: \"{{ .Values.data.name }}\"\n      release: {{ .Release.Name }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/data-statefulset.yaml",
    "content": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  labels:\n    app: {{ template \"elasticsearch.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    component: \"{{ .Values.data.name }}\"\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: {{ template \"elasticsearch.data.fullname\" . }}\nspec:\n  serviceName: {{ template \"elasticsearch.data.fullname\" . }}\n  replicas: {{ .Values.data.replicas }}\n  selector:\n    matchLabels:\n      app: {{ template \"elasticsearch.name\" . }}\n      component: \"{{ .Values.data.name }}\"\n  template:\n    metadata:\n      labels:\n        app: {{ template \"elasticsearch.name\" . }}\n        component: \"{{ .Values.data.name }}\"\n        release: {{ .Release.Name }}\n        {{- if .Values.data.podAnnotations }}\n      annotations:\n{{ toYaml .Values.data.podAnnotations | indent 8 }}\n        {{- end }}\n    spec:\n{{- if .Values.data.priorityClassName }}\n      priorityClassName: \"{{ .Values.data.priorityClassName }}\"\n{{- end }}\n      securityContext:\n        fsGroup: 1000\n      {{- if eq .Values.data.antiAffinity \"hard\" }}\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - topologyKey: \"kubernetes.io/hostname\"\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"elasticsearch.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n                  component: \"{{ .Values.data.name }}\"\n      {{- else if eq .Values.data.antiAffinity \"soft\" }}\n      affinity:\n        podAntiAffinity:\n          preferredDuringSchedulingIgnoredDuringExecution:\n          - weight: 1\n            podAffinityTerm:\n              topologyKey: kubernetes.io/hostname\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"elasticsearch.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n                  component: \"{{ .Values.data.name }}\"\n      {{- end }}\n{{- if .Values.data.nodeSelector }}\n      nodeSelector:\n{{ toYaml .Values.data.nodeSelector | indent 8 }}\n{{- end }}\n{{- if .Values.data.tolerations }}\n      tolerations:\n{{ toYaml .Values.data.tolerations | indent 8 }}\n{{- end }}\n      initContainers:\n      # see https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html\n      # and https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html#mlockall\n      - name: \"sysctl\"\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\" \n        imagePullPolicy: \"Always\"\n        command: [\"sysctl\", \"-w\", \"vm.max_map_count=262144\"]\n        securityContext:\n          privileged: true\n      - name: \"chown\"\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\"\n        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}\n        command:\n        - /bin/bash\n        - -c\n        - chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data &&\n          chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/logs\n        securityContext:\n          runAsUser: 0\n        volumeMounts:\n        - mountPath: /usr/share/elasticsearch/data\n          name: data\n      containers:\n      - name: elasticsearch\n        env:\n        - name: DISCOVERY_SERVICE\n          value: {{ template \"elasticsearch.fullname\" . }}-discovery\n        - name: NODE_MASTER\n          value: \"false\"\n        - name: PROCESSORS\n          valueFrom:\n            resourceFieldRef:\n              resource: limits.cpu\n        - name: ES_JAVA_OPTS\n          value: \"-Djava.net.preferIPv4Stack=true -Xms{{ .Values.data.heapSize }} -Xmx{{ .Values.data.heapSize }}\"\n        {{- range $key, $value :=  .Values.cluster.env }}\n        - name: {{ $key }}\n          value: {{ $value | quote }}\n        {{- end }}\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\"\n        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}\n        ports:\n        - containerPort: 9300\n          name: transport\n{{ if .Values.data.exposeHttp }}\n        - containerPort: 9200\n          name: http\n{{ end }}\n        resources:\n{{ toYaml .Values.data.resources | indent 12 }}\n        readinessProbe:\n          httpGet:\n            path: /_cluster/health?local=true\n            port: 9200\n          initialDelaySeconds: 5\n        volumeMounts:\n        - mountPath: /usr/share/elasticsearch/data\n          name: data\n        - mountPath: /usr/share/elasticsearch/config/elasticsearch.yml\n          name: config\n          subPath: elasticsearch.yml\n{{- if hasPrefix \"2.\" .Values.image.tag }}\n        - mountPath: /usr/share/elasticsearch/config/logging.yml\n          name: config\n          subPath: logging.yml\n{{- end }}\n{{- if hasPrefix \"5.\" .Values.image.tag }}\n        - mountPath: /usr/share/elasticsearch/config/log4j2.properties\n          name: config\n          subPath: log4j2.properties\n{{- end }}\n        - name: config\n          mountPath: /pre-stop-hook.sh\n          subPath: pre-stop-hook.sh\n        - name: config\n          mountPath: /post-start-hook.sh\n          subPath: post-start-hook.sh\n{{- if .Values.cluster.keystoreSecret }}\n        - name: keystore\n          mountPath: \"/usr/share/elasticsearch/config/elasticsearch.keystore\"\n          subPath: elasticsearch.keystore\n          readOnly: true\n{{- end }}\n        lifecycle:\n          preStop:\n            exec:\n              command: [\"/bin/bash\",\"/pre-stop-hook.sh\"]\n          postStart:\n            exec:\n              command: [\"/bin/bash\",\"/post-start-hook.sh\"]\n      terminationGracePeriodSeconds: {{ .Values.data.terminationGracePeriodSeconds }}\n{{- if .Values.image.pullSecrets }}\n      imagePullSecrets:\n      {{- range $pullSecret := .Values.image.pullSecrets }}\n        - name: {{ $pullSecret }}\n      {{- end }}\n{{- end }}\n      volumes:\n      - name: config\n        configMap:\n          name: {{ template \"elasticsearch.fullname\" . }}\n{{- if .Values.cluster.keystoreSecret }}\n      - name: keystore\n        secret:\n          secretName: {{ .Values.cluster.keystoreSecret }}\n{{- end }}\n  {{- if not .Values.data.persistence.enabled }}\n      - name: data\n        emptyDir: {}\n  {{- end }}\n  updateStrategy:\n    type: {{ .Values.data.updateStrategy.type }}\n  {{- if .Values.data.persistence.enabled }}\n  volumeClaimTemplates:\n  - metadata:\n      name: {{ .Values.data.persistence.name }}\n    spec:\n      accessModes:\n        - {{ .Values.data.persistence.accessMode | quote }}\n    {{- if .Values.data.persistence.storageClass }}\n    {{- if (eq \"-\" .Values.data.persistence.storageClass) }}\n      storageClassName: \"\"\n    {{- else }}\n      storageClassName: \"{{ .Values.data.persistence.storageClass }}\"\n    {{- end }}\n    {{- end }}\n      resources:\n        requests:\n          storage: \"{{ .Values.data.persistence.size }}\"\n  {{- end }}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/master-pdb.yaml",
    "content": "{{- if .Values.master.podDisruptionBudget.enabled }}\napiVersion: policy/v1beta1\nkind: PodDisruptionBudget\nmetadata:\n  labels:\n    app: {{ template \"elasticsearch.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    component: \"{{ .Values.master.name }}\"\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: {{ template \"elasticsearch.master.fullname\" . }}\nspec:\n{{- if .Values.master.podDisruptionBudget.minAvailable }}\n  minAvailable: {{ .Values.master.podDisruptionBudget.minAvailable }}\n{{- end }}\n{{- if .Values.master.podDisruptionBudget.maxUnavailable }}\n  maxUnavailable: {{ .Values.master.podDisruptionBudget.maxUnavailable }}\n{{- end }}\n  selector:\n    matchLabels:\n      app: {{ template \"elasticsearch.name\" . }}\n      component: \"{{ .Values.master.name }}\"\n      release: {{ .Release.Name }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/master-statefulset.yaml",
    "content": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  labels:\n    app: {{ template \"elasticsearch.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    component: \"{{ .Values.master.name }}\"\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: {{ template \"elasticsearch.master.fullname\" . }}\nspec:\n  serviceName: {{ template \"elasticsearch.master.fullname\" . }}\n  replicas: {{ .Values.master.replicas }}\n  selector:\n    matchLabels:\n      app: {{ template \"elasticsearch.name\" . }}\n      component: \"{{ .Values.master.name }}\"\n  template:\n    metadata:\n      labels:\n        app: {{ template \"elasticsearch.name\" . }}\n        component: \"{{ .Values.master.name }}\"\n        release: {{ .Release.Name }}\n        {{- if .Values.master.podAnnotations }}\n      annotations:\n{{ toYaml .Values.master.podAnnotations | indent 8 }}\n        {{- end }}\n    spec:\n{{- if .Values.master.priorityClassName }}\n      priorityClassName: \"{{ .Values.master.priorityClassName }}\"\n{{- end }}\n      securityContext:\n        fsGroup: 1000\n      {{- if eq .Values.master.antiAffinity \"hard\" }}\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - topologyKey: \"kubernetes.io/hostname\"\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"elasticsearch.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n                  component: \"{{ .Values.master.name }}\"\n      {{- else if eq .Values.master.antiAffinity \"soft\" }}\n      affinity:\n        podAntiAffinity:\n          preferredDuringSchedulingIgnoredDuringExecution:\n          - weight: 1\n            podAffinityTerm:\n              topologyKey: kubernetes.io/hostname\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"elasticsearch.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n                  component: \"{{ .Values.master.name }}\"\n      {{- end }}\n{{- if .Values.master.nodeSelector }}\n      nodeSelector:\n{{ toYaml .Values.master.nodeSelector | indent 8 }}\n{{- end }}\n{{- if .Values.master.tolerations }}\n      tolerations:\n{{ toYaml .Values.master.tolerations | indent 8 }}\n{{- end }}\n      initContainers:\n      # see https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html\n      # and https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html#mlockall\n      - name: \"sysctl\"\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\" \n        imagePullPolicy: \"Always\"\n        command: [\"sysctl\", \"-w\", \"vm.max_map_count=262144\"]\n        securityContext:\n          privileged: true\n      - name: \"chown\"\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\"\n        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}\n        command:\n        - /bin/bash\n        - -c\n        - chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data &&\n          chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/logs\n        securityContext:\n          runAsUser: 0\n        volumeMounts:\n        - mountPath: /usr/share/elasticsearch/data\n          name: data\n      containers:\n      - name: elasticsearch\n        env:\n        - name: NODE_DATA\n          value: \"false\"\n{{- if hasPrefix \"5.\" .Values.appVersion }}\n        - name: NODE_INGEST\n          value: \"false\"\n{{- end }}\n        - name: DISCOVERY_SERVICE\n          value: {{ template \"elasticsearch.fullname\" . }}-discovery\n        - name: PROCESSORS\n          valueFrom:\n            resourceFieldRef:\n              resource: limits.cpu\n        - name: ES_JAVA_OPTS\n          value: \"-Djava.net.preferIPv4Stack=true -Xms{{ .Values.master.heapSize }} -Xmx{{ .Values.master.heapSize }}\"\n        {{- range $key, $value :=  .Values.cluster.env }}\n        - name: {{ $key }}\n          value: {{ $value | quote }}\n        {{- end }}\n        resources:\n{{ toYaml .Values.master.resources | indent 12 }}\n        readinessProbe:\n          httpGet:\n            path: /_cluster/health?local=true\n            port: 9200\n          initialDelaySeconds: 5\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\"\n        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}\n        ports:\n        - containerPort: 9300\n          name: transport\n{{ if .Values.master.exposeHttp }}\n        - containerPort: 9200\n          name: http\n{{ end }}\n        volumeMounts:\n        - mountPath: /usr/share/elasticsearch/data\n          name: data\n        - mountPath: /usr/share/elasticsearch/config/elasticsearch.yml\n          name: config\n          subPath: elasticsearch.yml\n{{- if hasPrefix \"2.\" .Values.image.tag }}\n        - mountPath: /usr/share/elasticsearch/config/logging.yml\n          name: config\n          subPath: logging.yml\n{{- end }}\n{{- if hasPrefix \"5.\" .Values.image.tag }}\n        - mountPath: /usr/share/elasticsearch/config/log4j2.properties\n          name: config\n          subPath: log4j2.properties\n{{- end }}\n{{- if .Values.cluster.keystoreSecret }}\n        - name: keystore\n          mountPath: \"/usr/share/elasticsearch/config/elasticsearch.keystore\"\n          subPath: elasticsearch.keystore\n          readOnly: true\n{{- end }}\n{{- if .Values.image.pullSecrets }}\n      imagePullSecrets:\n      {{- range $pullSecret := .Values.image.pullSecrets }}\n        - name: {{ $pullSecret }}\n      {{- end }}\n{{- end }}\n      volumes:\n      - name: config\n        configMap:\n          name: {{ template \"elasticsearch.fullname\" . }}\n{{- if .Values.cluster.keystoreSecret }}\n      - name: keystore\n        secret:\n          secretName: {{ .Values.cluster.keystoreSecret }}\n{{- end }}\n  {{- if not .Values.master.persistence.enabled }}\n      - name: data\n        emptyDir: {}\n  {{- end }}\n  updateStrategy:\n    type: {{ .Values.master.updateStrategy.type }}\n  {{- if .Values.master.persistence.enabled }}\n  volumeClaimTemplates:\n  - metadata:\n      name: {{ .Values.master.persistence.name }}\n    spec:\n      accessModes:\n        - {{ .Values.master.persistence.accessMode | quote }}\n    {{- if .Values.master.persistence.storageClass }}\n    {{- if (eq \"-\" .Values.master.persistence.storageClass) }}\n      storageClassName: \"\"\n    {{- else }}\n      storageClassName: \"{{ .Values.master.persistence.storageClass }}\"\n    {{- end }}\n    {{- end }}\n      resources:\n        requests:\n          storage: \"{{ .Values.master.persistence.size }}\"\n  {{ end }}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/templates/master-svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app: {{ template \"elasticsearch.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    component: \"{{ .Values.master.name }}\"\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: {{ template \"elasticsearch.fullname\" . }}-discovery\nspec:\n  clusterIP: None\n  ports:\n    - port: 9300\n      targetPort: transport\n  selector:\n    app: {{ template \"elasticsearch.name\" . }}\n    component: \"{{ .Values.master.name }}\"\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/elasticsearch/values.yaml",
    "content": "# Default values for elasticsearch.\n# This is a YAML-formatted file.\n# Declare variables to be passed into your templates.\nappVersion: \"6.4.0\"\n\nimage:\n  repository: \"docker.elastic.co/elasticsearch/elasticsearch-oss\"\n  tag: \"6.4.0\"\n  pullPolicy: \"IfNotPresent\"\n  # If specified, use these secrets to access the image\n  # pullSecrets:\n  #   - registry-secret\n\ncluster:\n  name: \"elasticsearch\"\n  # If you want X-Pack installed, switch to an image that includes it, enable this option and toggle the features you want\n  # enabled in the environment variables outlined in the README\n  xpackEnable: false\n  # Some settings must be placed in a keystore, so they need to be mounted in from a secret.\n  # Use this setting to specify the name of the secret\n  # keystoreSecret: eskeystore\n  config: {}\n  env:\n    # IMPORTANT: https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html#minimum_master_nodes\n    # To prevent data loss, it is vital to configure the discovery.zen.minimum_master_nodes setting so that each master-eligible\n    # node knows the minimum number of master-eligible nodes that must be visible in order to form a cluster.\n    MINIMUM_MASTER_NODES: \"2\"\n\nclient:\n  name: client\n  replicas: 2\n  serviceType: ClusterIP\n  loadBalancerIP: {}\n  loadBalancerSourceRanges: {}\n## (dict) If specified, apply these annotations to the client service\n#  serviceAnnotations:\n#    example: client-svc-foo\n  heapSize: \"512m\"\n  antiAffinity: \"soft\"\n  nodeSelector: {}\n  tolerations: []\n  resources:\n    limits:\n      cpu: \"1\"\n      # memory: \"1024Mi\"\n    requests:\n      cpu: \"25m\"\n      memory: \"512Mi\"\n  priorityClassName: \"\"\n  ## (dict) If specified, apply these annotations to each client Pod\n  # podAnnotations:\n  #   example: client-foo\n  podDisruptionBudget:\n    enabled: false\n    minAvailable: 1\n    # maxUnavailable: 1\n\nmaster:\n  name: master\n  exposeHttp: false\n  replicas: 3\n  heapSize: \"512m\"\n  persistence:\n    enabled: true\n    accessMode: ReadWriteOnce\n    name: data\n    size: \"4Gi\"\n    # storageClass: \"ssd\"\n  antiAffinity: \"soft\"\n  nodeSelector: {}\n  tolerations: []\n  resources:\n    limits:\n      cpu: \"1\"\n      # memory: \"1024Mi\"\n    requests:\n      cpu: \"25m\"\n      memory: \"512Mi\"\n  priorityClassName: \"\"\n  ## (dict) If specified, apply these annotations to each master Pod\n  # podAnnotations:\n  #   example: master-foo\n  podDisruptionBudget:\n    enabled: false\n    minAvailable: 2  # Same as `cluster.env.MINIMUM_MASTER_NODES`\n    # maxUnavailable: 1\n  updateStrategy:\n    type: OnDelete\n\ndata:\n  name: data\n  exposeHttp: false\n  replicas: 2\n  heapSize: \"1536m\"\n  persistence:\n    enabled: true\n    accessMode: ReadWriteOnce\n    name: data\n    size: \"30Gi\"\n    # storageClass: \"ssd\"\n  terminationGracePeriodSeconds: 3600\n  antiAffinity: \"soft\"\n  nodeSelector: {}\n  tolerations: []\n  resources:\n    limits:\n      cpu: \"1\"\n      # memory: \"2048Mi\"\n    requests:\n      cpu: \"25m\"\n      memory: \"1536Mi\"\n  priorityClassName: \"\"\n  ## (dict) If specified, apply these annotations to each data Pod\n  # podAnnotations:\n  #   example: data-foo\n  podDisruptionBudget:\n    enabled: false\n    # minAvailable: 1\n    maxUnavailable: 1\n  updateStrategy:\n    type: OnDelete\n"
  },
  {
    "path": "manifests/deprecated/es-cluster/es-values.yaml",
    "content": "image:\n  repository: \"jmgao1983/elasticsearch\"\n\ncluster:\n  name: \"es-on-k8s\"\n  env:\n    MINIMUM_MASTER_NODES: \"2\"\n\nclient:\n  serviceType: NodePort\n\nmaster:\n  name: master\n  replicas: 3\n  heapSize: \"512m\"\n  persistence:\n    enabled: true\n    accessMode: ReadWriteOnce\n    name: data\n    size: \"4Gi\"\n    storageClass: \"nfs-es\"\n\ndata:\n  name: data\n  replicas: 2\n  heapSize: \"1536m\"\n  persistence:\n    enabled: true\n    accessMode: ReadWriteOnce\n    name: data\n    size: \"40Gi\"\n    storageClass: \"nfs-es\"\n  terminationGracePeriodSeconds: 3600\n  resources:\n    limits:\n      cpu: \"1\"\n      # memory: \"2048Mi\"\n    requests:\n      cpu: \"25m\"\n      memory: \"1536Mi\"\n  podDisruptionBudget:\n    enabled: false\n    # minAvailable: 1\n    maxUnavailable: 1\n"
  },
  {
    "path": "manifests/deprecated/ingress/nginx-ingress/nginx-ingress-svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: ingress-nginx\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\nspec:\n  type: NodePort\n  ports:\n    - name: http\n      port: 80\n      targetPort: 80\n      protocol: TCP\n      # 集群hosts文件中设置的 NODE_PORT_RANGE 作为 NodePort的可用范围\n      # 从默认20000~40000之间选一个可用端口，让ingress-controller暴露给外部的访问\n      nodePort: 23456\n    - name: https\n      port: 443\n      targetPort: 443\n      protocol: TCP\n      # 集群hosts文件中设置的 NODE_PORT_RANGE 作为 NodePort的可用范围\n      # 从默认20000~40000之间选一个可用端口，让ingress-controller暴露https\n      nodePort: 23457\n    - name: test-mysql\n      port: 3306\n      targetPort: 3306\n      protocol: TCP\n      nodePort: 23306\n    - name: test-mysql-read\n      port: 3307\n      targetPort: 3307\n      protocol: TCP\n      nodePort: 23307\n    - name: test-dns\n      port: 53\n      targetPort: 53\n      protocol: UDP\n      nodePort: 20053\n  selector:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\n\n"
  },
  {
    "path": "manifests/deprecated/ingress/nginx-ingress/nginx-ingress.yaml",
    "content": "apiVersion: v1\nkind: Namespace\nmetadata:\n  name: ingress-nginx\n\n---\n\nkind: ConfigMap\napiVersion: v1\nmetadata:\n  name: nginx-configuration\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\n\n---\nkind: ConfigMap\napiVersion: v1\nmetadata:\n  name: tcp-services\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\n\n---\nkind: ConfigMap\napiVersion: v1\nmetadata:\n  name: udp-services\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\n\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: nginx-ingress-serviceaccount\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: nginx-ingress-clusterrole\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\nrules:\n  - apiGroups:\n      - \"\"\n    resources:\n      - configmaps\n      - endpoints\n      - nodes\n      - pods\n      - secrets\n    verbs:\n      - list\n      - watch\n  - apiGroups:\n      - \"\"\n    resources:\n      - nodes\n    verbs:\n      - get\n  - apiGroups:\n      - \"\"\n    resources:\n      - services\n    verbs:\n      - get\n      - list\n      - watch\n  - apiGroups:\n      - \"extensions\"\n    resources:\n      - ingresses\n    verbs:\n      - get\n      - list\n      - watch\n  - apiGroups:\n      - \"\"\n    resources:\n      - events\n    verbs:\n      - create\n      - patch\n  - apiGroups:\n      - \"extensions\"\n    resources:\n      - ingresses/status\n    verbs:\n      - update\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  name: nginx-ingress-role\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\nrules:\n  - apiGroups:\n      - \"\"\n    resources:\n      - configmaps\n      - pods\n      - secrets\n      - namespaces\n    verbs:\n      - get\n  - apiGroups:\n      - \"\"\n    resources:\n      - configmaps\n    resourceNames:\n      # Defaults to \"<election-id>-<ingress-class>\"\n      # Here: \"<ingress-controller-leader>-<nginx>\"\n      # This has to be adapted if you change either parameter\n      # when launching the nginx-ingress-controller.\n      - \"ingress-controller-leader-nginx\"\n    verbs:\n      - get\n      - update\n  - apiGroups:\n      - \"\"\n    resources:\n      - configmaps\n    verbs:\n      - create\n  - apiGroups:\n      - \"\"\n    resources:\n      - endpoints\n    verbs:\n      - get\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: nginx-ingress-role-nisa-binding\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: Role\n  name: nginx-ingress-role\nsubjects:\n  - kind: ServiceAccount\n    name: nginx-ingress-serviceaccount\n    namespace: ingress-nginx\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: nginx-ingress-clusterrole-nisa-binding\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: nginx-ingress-clusterrole\nsubjects:\n  - kind: ServiceAccount\n    name: nginx-ingress-serviceaccount\n    namespace: ingress-nginx\n\n---\n\napiVersion: apps/v1 \nkind: Deployment\nmetadata:\n  name: nginx-ingress-controller\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app.kubernetes.io/name: ingress-nginx\n      app.kubernetes.io/part-of: ingress-nginx\n  template:\n    metadata:\n      labels:\n        app.kubernetes.io/name: ingress-nginx\n        app.kubernetes.io/part-of: ingress-nginx\n      annotations:\n        prometheus.io/port: \"10254\"\n        prometheus.io/scrape: \"true\"\n    spec:\n      serviceAccountName: nginx-ingress-serviceaccount\n      containers:\n        - name: nginx-ingress-controller\n          #image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0\n          #使用以下镜像，方便国内下载加速\n          image: jmgao1983/nginx-ingress-controller:0.21.0\n          args:\n            - /nginx-ingress-controller\n            - --configmap=$(POD_NAMESPACE)/nginx-configuration\n            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services\n            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services\n            - --publish-service=$(POD_NAMESPACE)/ingress-nginx\n            - --annotations-prefix=nginx.ingress.kubernetes.io\n          securityContext:\n            capabilities:\n              drop:\n                - ALL\n              add:\n                - NET_BIND_SERVICE\n            # www-data -> 33\n            runAsUser: 33\n          env:\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n          ports:\n            - name: http\n              containerPort: 80\n            - name: https\n              containerPort: 443\n            # hostPort可以直接使用node节点的网络端口暴露服务\n            #- name: mysql\n            #  containerPort: 3306\n            #  hostPort: 3306\n            #- name: dns\n            #  containerPort: 53\n            #  hostPort: 53\n            #  protocol: UDP\n          livenessProbe:\n            failureThreshold: 3\n            httpGet:\n              path: /healthz\n              port: 10254\n              scheme: HTTP\n            initialDelaySeconds: 10\n            periodSeconds: 10\n            successThreshold: 1\n            timeoutSeconds: 1\n          readinessProbe:\n            failureThreshold: 3\n            httpGet:\n              path: /healthz\n              port: 10254\n              scheme: HTTP\n            periodSeconds: 10\n            successThreshold: 1\n            timeoutSeconds: 1\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: ingress-nginx\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\nspec:\n  type: NodePort\n  ports:\n    - name: http\n      port: 80\n      targetPort: 80\n      protocol: TCP\n      # 集群hosts文件中设置的 NODE_PORT_RANGE 作为 NodePort的可用范围\n      # 从默认20000~40000之间选一个可用端口，让ingress-controller暴露给外部的访问\n      nodePort: 23456\n    - name: https\n      port: 443\n      targetPort: 443\n      protocol: TCP\n      # 集群hosts文件中设置的 NODE_PORT_RANGE 作为 NodePort的可用范围\n      # 从默认20000~40000之间选一个可用端口，让ingress-controller暴露https\n      nodePort: 23457\n  selector:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\n\n---\n\n"
  },
  {
    "path": "manifests/deprecated/ingress/nginx-ingress/tcp-services-configmap.yaml",
    "content": "kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: tcp-services\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\ndata:\n  3306: \"mariadb/mydb-mariadb:3306\"\n  3307: \"mariadb/mydb-mariadb-slave:3306\"\n\n"
  },
  {
    "path": "manifests/deprecated/ingress/nginx-ingress/udp-services-configmap.yaml",
    "content": "kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: udp-services\n  namespace: ingress-nginx\n  labels:\n    app.kubernetes.io/name: ingress-nginx\n    app.kubernetes.io/part-of: ingress-nginx\ndata:\n  53: \"kube-system/kube-dns:53\"\n\n"
  },
  {
    "path": "manifests/deprecated/ingress/test-hello.ing.yaml",
    "content": "# kubectl run test-hello --image=nginx --expose --port=80\napiVersion: networking.k8s.io/v1beta1 \nkind: Ingress\nmetadata:\n  name: test-hello\nspec:\n  rules:\n  - host: hello.test.com\n    http:\n      paths:\n      - path: /\n        backend:\n          serviceName: test-hello\n          servicePort: 80\n"
  },
  {
    "path": "manifests/deprecated/ingress/traefik/tls/hello-tls.ing.yaml",
    "content": "apiVersion: networking.k8s.io/v1beta1 \nkind: Ingress\nmetadata:\n  name: hello-tls-ingress\n  annotations:\n    kubernetes.io/ingress.class: traefik\nspec:\n  rules:\n  - host: hello.test.com\n    http:\n      paths:\n      - backend:\n          serviceName: test-hello\n          servicePort: 80\n  tls:\n  - secretName: traefik-cert\n"
  },
  {
    "path": "manifests/deprecated/ingress/traefik/tls/k8s-dashboard.ing.yaml",
    "content": "apiVersion: networking.k8s.io/v1beta1 \nkind: Ingress\nmetadata:\n  name:  kubernetes-dashboard\n  namespace: kube-system\n  annotations:\n    traefik.ingress.kubernetes.io/redirect-entry-point: https\nspec:\n  rules:\n  - host: dashboard.test.com\n    http:\n      paths:\n      - path: /\n        backend:\n          serviceName: kubernetes-dashboard\n          servicePort: 443\n\n"
  },
  {
    "path": "manifests/deprecated/ingress/traefik/tls/traefik-controller.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: traefik-conf\n  namespace: kube-system\ndata:\n  traefik.toml: |\n    # 设置insecureSkipVerify = true，可以配置backend为443(比如dashboard)的ingress规则\n    insecureSkipVerify = true\n    defaultEntryPoints = [\"http\", \"https\"]\n    [entryPoints]\n      [entryPoints.http]\n        address = \":80\"\n        ### 配置http 强制跳转 https\n        #[entryPoints.http.redirect]\n        #  entryPoint = \"https\"\n        ### 配置只信任trustedIPs传递过来X-Forwarded-*，默认全部信任；为了防止客户端地址伪造，需开启这个\n        #[entryPoints.http.forwardedHeaders]\n        #  trustedIPs = [\"10.1.0.0/16\", \"172.20.0.0/16\", \"192.168.1.3\"]\n      [entryPoints.https]\n        address = \":443\"\n        [entryPoints.https.tls]\n          [[entryPoints.https.tls.certificates]]\n            CertFile = \"/ssl/tls.crt\"\n            KeyFile = \"/ssl/tls.key\"\n---\nkind: Deployment\napiVersion: apps/v1\nmetadata:\n  name: traefik-ingress-controller\n  namespace: kube-system\n  labels:\n    k8s-app: traefik-ingress-lb\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      k8s-app: traefik-ingress-lb\n  template:\n    metadata:\n      labels:\n        k8s-app: traefik-ingress-lb\n        name: traefik-ingress-lb\n    spec:\n      serviceAccountName: traefik-ingress-controller\n      terminationGracePeriodSeconds: 60\n      volumes:\n      - name: ssl\n        secret:\n          secretName: traefik-cert\n      - name: config\n        configMap:\n          name: traefik-conf\n      #nodeSelector:\n      #  node-role.kubernetes.io/traefik: \"true\"\n      containers:\n      - image: traefik:v1.7.20\n        imagePullPolicy: IfNotPresent\n        name: traefik-ingress-lb\n        volumeMounts:\n        - mountPath: \"/ssl\"\n          name: \"ssl\"\n        - mountPath: \"/config\"\n          name: \"config\"\n        resources:\n          limits:\n            cpu: 1000m\n            memory: 800Mi\n          requests:\n            cpu: 500m\n            memory: 600Mi\n        args:\n        - --configfile=/config/traefik.toml\n        - --api\n        - --kubernetes\n        - --logLevel=INFO\n        securityContext:\n          capabilities:\n            drop:\n              - ALL\n            add:\n              - NET_BIND_SERVICE\n        ports:\n          - name: http\n            containerPort: 80\n            hostPort: 80\n          - name: https\n            containerPort: 443\n            hostPort: 443\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: traefik-ingress-service\n  namespace: kube-system\nspec:\n  selector:\n    k8s-app: traefik-ingress-lb\n  ports:\n    - protocol: TCP\n      # 该端口为 traefik ingress-controller的服务端口\n      port: 80\n      # 集群hosts文件中设置的 NODE_PORT_RANGE 作为 NodePort的可用范围\n      # 从默认20000~40000之间选一个可用端口，让ingress-controller暴露给外部的访问\n      nodePort: 23456\n      name: http\n    - protocol: TCP\n      # \n      port: 443\n      nodePort: 23457\n      name: https\n    - protocol: TCP\n      # 该端口为 traefik 的管理WEB界面\n      port: 8080\n      name: admin\n  type: NodePort\n---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: traefik-ingress-controller\nrules:\n  - apiGroups:\n      - \"\"\n    resources:\n      - pods\n      - services\n      - endpoints\n      - secrets\n    verbs:\n      - get\n      - list\n      - watch\n  - apiGroups:\n      - extensions\n    resources:\n      - ingresses\n    verbs:\n      - get\n      - list\n      - watch\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: traefik-ingress-controller\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: traefik-ingress-controller\nsubjects:\n- kind: ServiceAccount\n  name: traefik-ingress-controller\n  namespace: kube-system\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: traefik-ingress-controller\n  namespace: kube-system\n"
  },
  {
    "path": "manifests/deprecated/ingress/traefik/traefik-ingress.yaml",
    "content": "---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: traefik-ingress-controller\nrules:\n  - apiGroups:\n      - \"\"\n    resources:\n      - pods\n      - services\n      - endpoints\n      - secrets\n    verbs:\n      - get\n      - list\n      - watch\n  - apiGroups:\n      - extensions\n    resources:\n      - ingresses\n    verbs:\n      - get\n      - list\n      - watch\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: traefik-ingress-controller\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: traefik-ingress-controller\nsubjects:\n- kind: ServiceAccount\n  name: traefik-ingress-controller\n  namespace: kube-system\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: traefik-ingress-controller\n  namespace: kube-system\n---\nkind: Deployment\napiVersion: apps/v1\nmetadata:\n  name: traefik-ingress-controller\n  namespace: kube-system\n  labels:\n    k8s-app: traefik-ingress-lb\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      k8s-app: traefik-ingress-lb\n  template:\n    metadata:\n      labels:\n        k8s-app: traefik-ingress-lb\n        name: traefik-ingress-lb\n    spec:\n      serviceAccountName: traefik-ingress-controller\n      terminationGracePeriodSeconds: 60\n      containers:\n      - image: traefik:v1.7.20\n        imagePullPolicy: IfNotPresent\n        name: traefik-ingress-lb\n        args:\n        - --api\n        - --kubernetes\n        - --logLevel=INFO\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: traefik-ingress-service\n  namespace: kube-system\nspec:\n  selector:\n    k8s-app: traefik-ingress-lb\n  ports:\n    - protocol: TCP\n      # 该端口为 traefik ingress-controller的服务端口\n      port: 80\n      # 集群hosts文件中设置的 NODE_PORT_RANGE 作为 NodePort的可用范围\n      # 从默认20000~40000之间选一个可用端口，让ingress-controller暴露给外部的访问\n      nodePort: 23456\n      name: web\n    - protocol: TCP\n      # 该端口为 traefik 的管理WEB界面\n      port: 8080\n      name: admin\n  type: NodePort\n"
  },
  {
    "path": "manifests/deprecated/ingress/traefik/traefik-ui.ing.yaml",
    "content": "---\napiVersion: networking.k8s.io/v1beta1\nkind: Ingress\nmetadata:\n  name: traefik-web-ui\n  namespace: kube-system\nspec:\n  rules:\n  - host: traefik-ui.test.com\n    http:\n      paths:\n      - path: /\n        backend:\n          serviceName: traefik-ingress-service\n          servicePort: 8080\n"
  },
  {
    "path": "manifests/deprecated/ingress/whoami.ing.yaml",
    "content": "# kubectl run whoami --image=emilevauge/whoami --port=80 --expose\napiVersion: networking.k8s.io/v1beta1 \nkind: Ingress\nmetadata:\n  name: test-whoami\nspec:\n  rules:\n  - host: who.test.com\n    http:\n      paths:\n      - path: /\n        backend:\n          serviceName: whoami\n          servicePort: 80\n\n"
  },
  {
    "path": "manifests/deprecated/ingress/whoami.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: whoami\n  labels:\n    app: whoami \nspec:\n  ports:\n  - name: web\n    port: 80\n    targetPort: 80\n  selector:\n    app: whoami\n  sessionAffinity: None\n  #type: NodePort\n\n---\napiVersion: apps/v1\nkind: Deployment \nmetadata:\n  name: whoami\nspec:   \n  replicas: 2\n  selector:\n    matchLabels:\n      app: whoami\n  template:\n    metadata:\n      labels:\n        app: whoami\n    spec:\n      containers:\n      - name: whoami \n        image: emilevauge/whoami\n        ports:\n        - containerPort: 80\n"
  },
  {
    "path": "manifests/deprecated/jenkins/.helmignore",
    "content": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation (prefixed with !). Only one pattern per line.\n.DS_Store\n# Common VCS dirs\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n# Common backup files\n*.swp\n*.bak\n*.tmp\n*~\n# Various IDEs\n.project\n.idea/\n*.tmproj\n"
  },
  {
    "path": "manifests/deprecated/jenkins/Chart.yaml",
    "content": "name: jenkins\nhome: https://jenkins.io/\nversion: 0.16.6\nappVersion: 2.121.1\ndescription: Open source continuous integration server. It supports multiple SCM tools\n  including CVS, Subversion and Git. It can execute Apache Ant and Apache Maven-based\n  projects as well as arbitrary scripts.\nsources:\n- https://github.com/jenkinsci/jenkins\n- https://github.com/jenkinsci/docker-jnlp-slave\nmaintainers:\n- name: lachie83\n  email: lachlan.evenson@microsoft.com\n- name: viglesiasce\n  email: viglesias@google.com\n- name: lusyoe\n  email: lusyoe@163.com\nicon: https://wiki.jenkins-ci.org/download/attachments/2916393/logo.png\n"
  },
  {
    "path": "manifests/deprecated/jenkins/OWNERS",
    "content": "approvers:\n- lachie83\n- viglesiasce\nreviewers:\n- lachie83\n- viglesiasce\n"
  },
  {
    "path": "manifests/deprecated/jenkins/README.md",
    "content": "# Jenkins Helm Chart\n\nJenkins master and slave cluster utilizing the Jenkins Kubernetes plugin\n\n* https://wiki.jenkins-ci.org/display/JENKINS/Kubernetes+Plugin\n\nInspired by the awesome work of Carlos Sanchez <mailto:carlos@apache.org>\n\n## Chart Details\n\nThis chart will do the following:\n\n* 1 x Jenkins Master with port 8080 exposed on an external LoadBalancer\n* All using Kubernetes Deployments\n\n## Installing the Chart\n\nTo install the chart with the release name `my-release`:\n\n```bash\n$ helm install --name my-release stable/jenkins\n```\n\n## Configuration\n\nThe following tables list the configurable parameters of the Jenkins chart and their default values.\n\n### Jenkins Master\n| Parameter                         | Description                          | Default                                                                      |\n| --------------------------------- | ------------------------------------ | ---------------------------------------------------------------------------- |\n| `nameOverride`                    | Override the resource name prefix    | `jenkins`                                                                    |\n| `fullnameOverride`                | Override the full resource names     | `jenkins-{release-name}` (or `jenkins` if release-name is `jenkins`)         |\n| `Master.Name`                     | Jenkins master name                  | `jenkins-master`                                                             |\n| `Master.Image`                    | Master image name                    | `jenkinsci/jenkins`                                                          |\n| `Master.ImageTag`                 | Master image tag                     | `lts`                                                                     |\n| `Master.ImagePullPolicy`          | Master image pull policy             | `Always`                                                                     |\n| `Master.ImagePullSecret`          | Master image pull secret             | Not set                                                                      |\n| `Master.Component`                | k8s selector key                     | `jenkins-master`                                                             |\n| `Master.UseSecurity`              | Use basic security                   | `true`                                                                       |\n| `Master.AdminUser`                | Admin username (and password) created as a secret if useSecurity is true | `admin`                                  |\n| `Master.resources`                | Resources allocation (Requests and Limits) | `{requests: {cpu: 50m, memory: 256Mi}, limits: {cpu: 2000m, memory: 2048Mi}}`|\n| `Master.InitContainerEnv`         | Environment variables for Init Container                                 | Not set                                  |\n| `Master.ContainerEnv`             | Environment variables for Jenkins Container                              | Not set                                  |\n| `Master.UsePodSecurityContext`    | Enable pod security context (must be `true` if `RunAsUser` or `FsGroup` are set) | `true`                           |\n| `Master.RunAsUser`                | uid that jenkins runs with           | `0`                                                                          |\n| `Master.FsGroup`                  | uid that will be used for persistent volume | `0`                                                                   |\n| `Master.ServiceAnnotations`       | Service annotations                  | `{}`                                                                         |\n| `Master.ServiceType`              | k8s service type                     | `LoadBalancer`                                                               |\n| `Master.ServicePort`              | k8s service port                     | `8080`                                                                       |\n| `Master.NodePort`                 | k8s node port                        | Not set                                                                      |\n| `Master.HealthProbes`             | Enable k8s liveness and readiness probes | `true`                                                                   |\n| `Master.HealthProbesLivenessTimeout`      | Set the timeout for the liveness probe | `120`                                                       |\n| `Master.HealthProbesReadinessTimeout` | Set the timeout for the readiness probe | `60`                                                       |\n| `Master.HealthProbeLivenessFailureThreshold` | Set the failure threshold for the liveness probe | `12`                                                       |\n| `Master.ContainerPort`            | Master listening port                | `8080`                                                                       |\n| `Master.SlaveListenerPort`        | Listening port for agents            | `50000`                                                                      |\n| `Master.DisabledAgentProtocols`   | Disabled agent protocols             | `JNLP-connect JNLP2-connect`                                                                      |\n| `Master.CSRF.DefaultCrumbIssuer.Enabled` | Enable the default CSRF Crumb issuer | `true`                                                                      |\n| `Master.CSRF.DefaultCrumbIssuer.ProxyCompatability` | Enable proxy compatibility | `true`                                                                      |\n| `Master.CLI`                      | Enable CLI over remoting             | `false`                                                                      |\n| `Master.LoadBalancerSourceRanges` | Allowed inbound IP addresses         | `0.0.0.0/0`                                                                  |\n| `Master.LoadBalancerIP`           | Optional fixed external IP           | Not set                                                                      |\n| `Master.JMXPort`                  | Open a port, for JMX stats           | Not set                                                                      |\n| `Master.CustomConfigMap`          | Use a custom ConfigMap               | `false`                                                                      |\n| `Master.Ingress.Annotations`      | Ingress annotations                  | `{}`                                                                         |\n| `Master.Ingress.TLS`              | Ingress TLS configuration            | `[]`                                                                         |\n| `Master.InitScripts`              | List of Jenkins init scripts         | Not set                                                                      |\n| `Master.CredentialsXmlSecret`     | Kubernetes secret that contains a 'credentials.xml' file | Not set                                                  |\n| `Master.SecretsFilesSecret`       | Kubernetes secret that contains 'secrets' files | Not set                                                           |\n| `Master.Jobs`                     | Jenkins XML job configs              | Not set                                                                      |\n| `Master.InstallPlugins`           | List of Jenkins plugins to install   | `kubernetes:0.11 workflow-aggregator:2.5 credentials-binding:1.11 git:3.2.0` |\n| `Master.ScriptApproval`           | List of groovy functions to approve  | Not set                                                                      |\n| `Master.NodeSelector`             | Node labels for pod assignment       | `{}`                                                                         |\n| `Master.Affinity`                 | Affinity settings                    | `{}`                                                                         |\n| `Master.Tolerations`              | Toleration labels for pod assignment | `{}`                                                                         |\n| `Master.PodAnnotations`           | Annotations for master pod           | `{}`                                                                         |\n| `NetworkPolicy.Enabled`           | Enable creation of NetworkPolicy resources. | `false`                                                               |\n| `NetworkPolicy.ApiVersion`        | NetworkPolicy ApiVersion             | `extensions/v1beta1`                                                         |\n| `rbac.install`                    | Create service account and ClusterRoleBinding for Kubernetes plugin | `false`                                       |\n| `rbac.apiVersion`                 | RBAC API version                     | `v1beta1`                                                                    |\n| `rbac.roleRef`                    | Cluster role name to bind to         | `cluster-admin`                                                              |\n\n### Jenkins Agent\n\n| Parameter               | Description                                     | Default                |\n| ----------------------- | ----------------------------------------------- | ---------------------- |\n| `Agent.AlwaysPullImage` | Always pull agent container image before build  | `false`                |\n| `Agent.Enabled`         | Enable Kubernetes plugin jnlp-agent podTemplate | `true`                 |\n| `Agent.Image`           | Agent image name                                | `jenkinsci/jnlp-slave` |\n| `Agent.ImagePullSecret` | Agent image pull secret                         | Not set                |\n| `Agent.ImageTag`        | Agent image tag                                 | `2.62`                 |\n| `Agent.Privileged`      | Agent privileged container                      | `false`                |\n| `Agent.resources`       | Resources allocation (Requests and Limits)      | `{requests: {cpu: 200m, memory: 256Mi}, limits: {cpu: 200m, memory: 256Mi}}`|\n| `Agent.volumes`         | Additional volumes                              | `nil`                  |\n\nSpecify each parameter using the `--set key=value[,key=value]` argument to `helm install`.\n\nAlternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,\n\n```bash\n$ helm install --name my-release -f values.yaml stable/jenkins\n```\n\n> **Tip**: You can use the default [values.yaml](values.yaml)\n\n## Mounting volumes into your Agent pods\n\nYour Jenkins Agents will run as pods, and it's possible to inject volumes where needed:\n\n```yaml\nAgent:\n  volumes:\n  - type: Secret\n    secretName: jenkins-mysecrets\n    mountPath: /var/run/secrets/jenkins-mysecrets\n```\n\nThe supported volume types are: `ConfigMap`, `EmptyDir`, `HostPath`, `Nfs`, `Pod`, `Secret`. Each type supports a different set of configurable attributes, defined by [the corresponding Java class](https://github.com/jenkinsci/kubernetes-plugin/tree/master/src/main/java/org/csanchez/jenkins/plugins/kubernetes/volumes).\n\n## NetworkPolicy\n\nTo make use of the NetworkPolicy resources created by default,\ninstall [a networking plugin that implements the Kubernetes\nNetworkPolicy spec](https://kubernetes.io/docs/tasks/administer-cluster/declare-network-policy#before-you-begin).\n\nFor Kubernetes v1.5 & v1.6, you must also turn on NetworkPolicy by setting\nthe DefaultDeny namespace annotation. Note: this will enforce policy for _all_ pods in the namespace:\n\n    kubectl annotate namespace default \"net.beta.kubernetes.io/network-policy={\\\"ingress\\\":{\\\"isolation\\\":\\\"DefaultDeny\\\"}}\"\n\nInstall helm chart with network policy enabled:\n\n    $ helm install stable/jenkins --set NetworkPolicy.Enabled=true\n\n## Persistence\n\nThe Jenkins image stores persistence under `/var/jenkins_home` path of the container. A dynamically managed Persistent Volume\nClaim is used to keep the data across deployments, by default. This is known to work in GCE, AWS, and minikube. Alternatively,\na previously configured Persistent Volume Claim can be used.\n\nIt is possible to mount several volumes using `Persistence.volumes` and `Persistence.mounts` parameters.\n\n### Persistence Values\n\n| Parameter                   | Description                     | Default         |\n| --------------------------- | ------------------------------- | --------------- |\n| `Persistence.Enabled`       | Enable the use of a Jenkins PVC | `true`          |\n| `Persistence.ExistingClaim` | Provide the name of a PVC       | `nil`           |\n| `Persistence.AccessMode`    | The PVC access mode             | `ReadWriteOnce` |\n| `Persistence.Size`          | The size of the PVC             | `8Gi`           |\n| `Persistence.volumes`       | Additional volumes              | `nil`           |\n| `Persistence.mounts`        | Additional mounts               | `nil`           |\n| `Persistence.StorageClass`  | The PV Provisioner              | `nfs-dynamic-class`|\n\n#### Existing PersistentVolumeClaim\n\n1. Create the PersistentVolume\n1. Create the PersistentVolumeClaim\n1. Install the chart\n\n```bash\n$ helm install --name my-release --set Persistence.ExistingClaim=PVC_NAME stable/jenkins\n```\n\n## Custom ConfigMap\n\nWhen creating a new parent chart with this chart as a dependency, the `CustomConfigMap` parameter can be used to override the default config.xml provided.\nIt also allows for providing additional xml configuration files that will be copied into `/var/jenkins_home`. In the parent chart's values.yaml,\nset the `jenkins.Master.CustomConfigMap` value to true like so\n\n```yaml\njenkins:\n  Master:\n    CustomConfigMap: true\n```\n\nand provide the file `templates/config.tpl` in your parent chart for your use case. You can start by copying the contents of `config.yaml` from this chart into your parent charts `templates/config.tpl` as a basis for customization. Finally, you'll need to wrap the contents of `templates/config.tpl` like so:\n\n```yaml\n{{- define \"override_config_map\" }}\n    <CONTENTS_HERE>\n{{ end }}\n```\n\n## RBAC\n\nIf running upon a cluster with RBAC enabled you will need to do the following:\n\n* `helm install stable/jenkins --set rbac.install=true`\n* Create a Jenkins credential of type Kubernetes service account with service account name provided in the `helm status` output.\n* Under configure Jenkins -- Update the credentials config in the cloud section to use the service account credential you created in the step above.\n\n## Run Jenkins as non root user\n\nThe default settings of this helm chart let Jenkins run as root user with uid `0`.\nDue to security reasons you may want to run Jenkins as a non root user.\nFortunately the default jenkins docker image `jenkins/jenkins` contains a user `jenkins` with uid `1000` that can be used for this purpose.\n\nSimply use the following settings to run Jenkins as `jenkins` user with uid `1000`.\n\n```yaml\njenkins:\n  Master:\n    RunAsUser: 1000\n    FsGroup: 1000\n```\n\nDocs taken from https://github.com/jenkinsci/docker/blob/master/Dockerfile:\n_Jenkins is run with user `jenkins`, uid = 1000. If you bind mount a volume from the host or a data container,ensure you use the same uid_\n\n## Running behind a forward proxy\n\nThe master pod uses an Init Container to install plugins etc. If you are behind a corporate proxy it may be useful to set `Master.InitContainerEnv` to add environment variables such as `http_proxy`, so that these can be downloaded.\n\nAdditionally, you may want to add env vars for the Jenkins container, and the JVM (`Master.JavaOpts`).\n\n```yaml\nMaster:\n  InitContainerEnv:\n    - name: http_proxy\n      value: \"http://192.168.64.1:3128\"\n    - name: https_proxy\n      value: \"http://192.168.64.1:3128\"\n    - name: no_proxy\n      value: \"\"\n  ContainerEnv:\n    - name: http_proxy\n      value: \"http://192.168.64.1:3128\"\n    - name: https_proxy\n      value: \"http://192.168.64.1:3128\"\n  JavaOpts: >-\n    -Dhttp.proxyHost=192.168.64.1\n    -Dhttp.proxyPort=3128\n    -Dhttps.proxyHost=192.168.64.1\n    -Dhttps.proxyPort=3128\n```\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/NOTES.txt",
    "content": "1. Get your '{{ .Values.Master.AdminUser }}' user password by running:\n  printf $(kubectl get secret --namespace {{ .Release.Namespace }} {{ template \"jenkins.fullname\" . }} -o jsonpath=\"{.data.jenkins-admin-password}\" | base64 --decode);echo\n\n{{- if .Values.Master.HostName }}\n\n2. Visit http://{{ .Values.Master.HostName }}\n{{- else }}\n2. Get the Jenkins URL to visit by running these commands in the same shell:\n{{- if contains \"NodePort\" .Values.Master.ServiceType }}\n  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath=\"{.spec.ports[0].nodePort}\" services {{ template \"jenkins.fullname\" . }})\n  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath=\"{.items[0].status.addresses[0].address}\")\n  echo http://$NODE_IP:$NODE_PORT/login\n\n{{- else if contains \"LoadBalancer\" .Values.Master.ServiceType }}\n  NOTE: It may take a few minutes for the LoadBalancer IP to be available.\n        You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template \"jenkins.fullname\" . }}'\n  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template \"jenkins.fullname\" . }} --template \"{{ \"{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}\" }}\")\n  echo http://$SERVICE_IP:{{ .Values.Master.ServicePort }}/login\n\n{{- else if contains \"ClusterIP\"  .Values.Master.ServiceType }}\n  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l \"component={{ template \"jenkins.fullname\" . }}-master\" -o jsonpath=\"{.items[0].metadata.name}\")\n  echo http://127.0.0.1:{{ .Values.Master.ServicePort }}\n  kubectl port-forward $POD_NAME {{ .Values.Master.ServicePort }}:{{ .Values.Master.ServicePort }}\n\n{{- end }}\n{{- end }}\n\n3. Login with the password from step 1 and the username: {{ .Values.Master.AdminUser }}\n\nFor more information on running Jenkins on Kubernetes, visit:\nhttps://cloud.google.com/solutions/jenkins-on-container-engine\n\n{{- if .Values.Persistence.Enabled }}\n{{- else }}\n#################################################################################\n######   WARNING: Persistence is disabled!!! You will lose your data when   #####\n######            the Jenkins pod is terminated.                            #####\n#################################################################################\n{{- end }}\n\n{{- if .Values.rbac.install }}\nConfigure the Kubernetes plugin in Jenkins to use the following Service Account name {{ template \"jenkins.fullname\" . }} using the following steps:\n  Create a Jenkins credential of type Kubernetes service account with service account name {{ template \"jenkins.fullname\" . }}\n  Under configure Jenkins -- Update the credentials config in the cloud section to use the service account credential you created in the step above.\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"jenkins.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\nIf release name contains chart name it will be used as a full name.\n*/}}\n{{- define \"jenkins.fullname\" -}}\n{{- if .Values.fullnameOverride -}}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- if contains $name .Release.Name -}}\n{{- .Release.Name | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n{{- end -}}\n{{- end -}}\n\n{{- define \"jenkins.kubernetes-version\" -}}\n  {{- range .Values.Master.InstallPlugins -}}\n    {{ if hasPrefix \"kubernetes:\" . }}\n      {{- $split := splitList \":\" . }}\n      {{- printf \"%s\" (index $split 1 ) -}}\n    {{- end -}}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/config.yaml",
    "content": "{{- if not .Values.Master.CustomConfigMap }}\n\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"jenkins.fullname\" . }}\ndata:\n  config.xml: |-\n    <?xml version='1.0' encoding='UTF-8'?>\n    <hudson>\n      <disabledAdministrativeMonitors/>\n      <version>{{ .Values.Master.ImageTag }}</version>\n      <numExecutors>0</numExecutors>\n      <mode>NORMAL</mode>\n      <useSecurity>{{ .Values.Master.UseSecurity }}</useSecurity>\n      <authorizationStrategy class=\"hudson.security.FullControlOnceLoggedInAuthorizationStrategy\">\n        <denyAnonymousReadAccess>true</denyAnonymousReadAccess>\n      </authorizationStrategy>\n      <securityRealm class=\"hudson.security.LegacySecurityRealm\"/>\n      <disableRememberMe>false</disableRememberMe>\n      <projectNamingStrategy class=\"jenkins.model.ProjectNamingStrategy$DefaultProjectNamingStrategy\"/>\n      <workspaceDir>${JENKINS_HOME}/workspace/${ITEM_FULLNAME}</workspaceDir>\n      <buildsDir>${ITEM_ROOTDIR}/builds</buildsDir>\n      <markupFormatter class=\"hudson.markup.EscapedMarkupFormatter\"/>\n      <jdks/>\n      <viewsTabBar class=\"hudson.views.DefaultViewsTabBar\"/>\n      <myViewsTabBar class=\"hudson.views.DefaultMyViewsTabBar\"/>\n      <clouds>\n        <org.csanchez.jenkins.plugins.kubernetes.KubernetesCloud plugin=\"kubernetes@{{ template \"jenkins.kubernetes-version\" . }}\">\n          <name>kubernetes</name>\n          <templates>\n{{- if .Values.Agent.Enabled }}\n            <org.csanchez.jenkins.plugins.kubernetes.PodTemplate>\n              <inheritFrom></inheritFrom>\n              <name>default</name>\n              <instanceCap>2147483647</instanceCap>\n              <idleMinutes>0</idleMinutes>\n              <label>{{ .Values.Agent.Component }}</label>\n              <nodeSelector>\n                {{- $local := dict \"first\" true }}\n                {{- range $key, $value := .Values.Agent.NodeSelector }}\n                  {{- if not $local.first }},{{- end }}\n                  {{- $key }}={{ $value }}\n                  {{- $_ := set $local \"first\" false }}\n                {{- end }}</nodeSelector>\n                <nodeUsageMode>NORMAL</nodeUsageMode>\n              <volumes>\n{{- range $index, $volume := .Values.Agent.volumes }}\n                <org.csanchez.jenkins.plugins.kubernetes.volumes.{{ $volume.type }}Volume>\n{{- range $key, $value := $volume }}{{- if not (eq $key \"type\") }}\n                  <{{ $key }}>{{ $value }}</{{ $key }}>\n{{- end }}{{- end }}\n                </org.csanchez.jenkins.plugins.kubernetes.volumes.{{ $volume.type }}Volume>\n{{- end }}\n              </volumes>\n              <containers>\n                <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>\n                  <name>jnlp</name>\n                  <image>{{ .Values.Agent.Image }}:{{ .Values.Agent.ImageTag }}</image>\n{{- if .Values.Agent.Privileged }}\n                  <privileged>true</privileged>\n{{- else }}\n                  <privileged>false</privileged>\n{{- end }}\n                  <alwaysPullImage>{{ .Values.Agent.AlwaysPullImage }}</alwaysPullImage>\n                  <workingDir>/home/jenkins</workingDir>\n                  <command></command>\n                  <args>${computer.jnlpmac} ${computer.name}</args>\n                  <ttyEnabled>false</ttyEnabled>\n                  # Resources configuration is a little hacky. This was to prevent breaking\n                  # changes, and should be cleanned up in the future once everybody had\n                  # enough time to migrate.\n                  <resourceRequestCpu>{{.Values.Agent.Cpu | default .Values.Agent.resources.requests.cpu}}</resourceRequestCpu>\n                  <resourceRequestMemory>{{.Values.Agent.Memory | default .Values.Agent.resources.requests.memory}}</resourceRequestMemory>\n                  <resourceLimitCpu>{{.Values.Agent.Cpu | default .Values.Agent.resources.limits.cpu}}</resourceLimitCpu>\n                  <resourceLimitMemory>{{.Values.Agent.Memory | default .Values.Agent.resources.limits.memory}}</resourceLimitMemory>\n                </org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>\n              </containers>\n              <envVars/>\n              <annotations/>\n{{- if .Values.Agent.ImagePullSecret }}\n              <imagePullSecrets>\n                <org.csanchez.jenkins.plugins.kubernetes.PodImagePullSecret>\n                  <name>{{ .Values.Agent.ImagePullSecret }}</name>\n                </org.csanchez.jenkins.plugins.kubernetes.PodImagePullSecret>\n              </imagePullSecrets>\n{{- else }}\n              <imagePullSecrets/>\n{{- end }}\n              <nodeProperties/>\n            </org.csanchez.jenkins.plugins.kubernetes.PodTemplate>\n{{- end -}}\n          </templates>\n          <serverUrl>https://kubernetes</serverUrl>\n          <skipTlsVerify>false</skipTlsVerify>\n          <namespace>{{ .Release.Namespace }}</namespace>\n          <jenkinsUrl>http://{{ template \"jenkins.fullname\" . }}:{{.Values.Master.ServicePort}}{{ default \"\" .Values.Master.JenkinsUriPrefix }}</jenkinsUrl>\n          <jenkinsTunnel>{{ template \"jenkins.fullname\" . }}-agent:50000</jenkinsTunnel>\n          <containerCap>10</containerCap>\n          <retentionTimeout>5</retentionTimeout>\n          <connectTimeout>0</connectTimeout>\n          <readTimeout>0</readTimeout>\n        </org.csanchez.jenkins.plugins.kubernetes.KubernetesCloud>\n      </clouds>\n      <quietPeriod>5</quietPeriod>\n      <scmCheckoutRetryCount>0</scmCheckoutRetryCount>\n      <views>\n        <hudson.model.AllView>\n          <owner class=\"hudson\" reference=\"../../..\"/>\n          <name>All</name>\n          <filterExecutors>false</filterExecutors>\n          <filterQueue>false</filterQueue>\n          <properties class=\"hudson.model.View$PropertyList\"/>\n        </hudson.model.AllView>\n      </views>\n      <primaryView>All</primaryView>\n      <slaveAgentPort>50000</slaveAgentPort>\n      <disabledAgentProtocols>\n{{- range .Values.Master.DisabledAgentProtocols }}\n        <string>{{ . }}</string>\n{{- end }}\n      </disabledAgentProtocols>\n      <label></label>\n{{- if .Values.Master.CSRF.DefaultCrumbIssuer.Enabled }}\n      <crumbIssuer class=\"hudson.security.csrf.DefaultCrumbIssuer\">\n{{- if .Values.Master.CSRF.DefaultCrumbIssuer.ProxyCompatability }}\n        <excludeClientIPFromCrumb>true</excludeClientIPFromCrumb>\n{{- end }}\n      </crumbIssuer>\n{{- end }}\n      <nodeProperties/>\n      <globalNodeProperties/>\n      <noUsageStatistics>true</noUsageStatistics>\n    </hudson>\n{{- if .Values.Master.ScriptApproval }}\n  scriptapproval.xml: |-\n    <?xml version='1.0' encoding='UTF-8'?>\n    <scriptApproval plugin=\"script-security@1.27\">\n      <approvedScriptHashes/>\n      <approvedSignatures>\n{{- range $key, $val := .Values.Master.ScriptApproval }}\n        <string>{{ $val }}</string>\n{{- end }}\n      </approvedSignatures>\n      <aclApprovedSignatures/>\n      <approvedClasspathEntries/>\n      <pendingScripts/>\n      <pendingSignatures/>\n      <pendingClasspathEntries/>\n    </scriptApproval>\n{{- end }}\n  jenkins.CLI.xml: |-\n    <?xml version='1.1' encoding='UTF-8'?>\n    <jenkins.CLI>\n{{- if .Values.Master.CLI }}\n      <enabled>true</enabled>\n{{- else }}\n      <enabled>false</enabled>\n{{- end }}\n    </jenkins.CLI>\n  hudson.model.UpdateCenter.xml: |-\n    <?xml version='1.1' encoding='UTF-8'?>\n    <sites>\n      <site>\n        <id>default</id>\n{{- if .Values.Master.UpdateCenter }}\n        <url>{{ .Values.Master.UpdateCenter }}</url>\n{{- else }}\n        <url>https://updates.jenkins.io/update-center.json</url>\n{{- end }}\n      </site>\n    </sites>\n  apply_config.sh: |-\n    mkdir -p /usr/share/jenkins/ref/secrets/;\n    echo \"false\" > /usr/share/jenkins/ref/secrets/slave-to-master-security-kill-switch;\n    cp -n /var/jenkins_config/config.xml /var/jenkins_home;\n    cp -n /var/jenkins_config/jenkins.CLI.xml /var/jenkins_home;\n    cp -n /var/jenkins_config/hudson.model.UpdateCenter.xml /var/jenkins_home;\n{{- if .Values.Master.InstallPlugins }}\n    # Install missing plugins\n    cp /var/jenkins_config/plugins.txt /var/jenkins_home;\n    rm -rf /usr/share/jenkins/ref/plugins/*.lock\n    /usr/local/bin/install-plugins.sh `echo $(cat /var/jenkins_home/plugins.txt)`;\n    # Copy plugins to shared volume\n    cp -n /usr/share/jenkins/ref/plugins/* /var/jenkins_plugins;\n{{- end }}\n{{- if .Values.Master.ScriptApproval }}\n    cp -n /var/jenkins_config/scriptapproval.xml /var/jenkins_home/scriptApproval.xml;\n{{- end }}\n{{- if .Values.Master.InitScripts }}\n    mkdir -p /var/jenkins_home/init.groovy.d/;\n    cp -n /var/jenkins_config/*.groovy /var/jenkins_home/init.groovy.d/\n{{- end }}\n{{- if .Values.Master.CredentialsXmlSecret }}\n    cp -n /var/jenkins_credentials/credentials.xml /var/jenkins_home;\n{{- end }}\n{{- if .Values.Master.SecretsFilesSecret }}\n    cp -n /var/jenkins_secrets/* /usr/share/jenkins/ref/secrets;\n{{- end }}\n{{- if .Values.Master.Jobs }}\n    for job in $(ls /var/jenkins_jobs); do\n      mkdir -p /var/jenkins_home/jobs/$job\n      cp -n /var/jenkins_jobs/$job /var/jenkins_home/jobs/$job/config.xml\n    done\n{{- end }}\n{{- range $key, $val := .Values.Master.InitScripts }}\n  init{{ $key }}.groovy: |-\n{{ $val | indent 4 }}\n{{- end }}\n  plugins.txt: |-\n{{- if .Values.Master.InstallPlugins }}\n{{- range $index, $val := .Values.Master.InstallPlugins }}\n{{ $val | indent 4 }}\n{{- end }}\n{{- end }}\n{{ else }}\n{{ include \"override_config_map\" . }}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/home-pvc.yaml",
    "content": "{{- if and .Values.Persistence.Enabled (not .Values.Persistence.ExistingClaim) -}}\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n{{- if .Values.Persistence.Annotations }}\n  annotations:\n{{ toYaml .Values.Persistence.Annotations | indent 4 }}\n{{- end }}\n  name: {{ template \"jenkins.fullname\" . }}\n  labels:\n    app: {{ template \"jenkins.fullname\" . }}\n    chart: \"{{ .Chart.Name }}-{{ .Chart.Version }}\"\n    release: \"{{ .Release.Name }}\"\n    heritage: \"{{ .Release.Service }}\"\nspec:\n  accessModes:\n    - {{ .Values.Persistence.AccessMode | quote }}\n  resources:\n    requests:\n      storage: {{ .Values.Persistence.Size | quote }}\n{{- if .Values.Persistence.StorageClass }}\n{{- if (eq \"-\" .Values.Persistence.StorageClass) }}\n  storageClassName: \"\"\n{{- else }}\n  storageClassName: \"{{ .Values.Persistence.StorageClass }}\"\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/jenkins-agent-svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ template \"jenkins.fullname\" . }}-agent\n  labels:\n    app: {{ template \"jenkins.fullname\" . }}\n    chart: \"{{ .Chart.Name }}-{{ .Chart.Version }}\"\n    component: \"{{ .Release.Name }}-{{ .Values.Master.Component }}\"\n{{- if .Values.Master.SlaveListenerServiceAnnotations }}\n  annotations:\n{{ toYaml .Values.Master.SlaveListenerServiceAnnotations | indent 4 }}\n{{- end }}\nspec:\n  ports:\n    - port: {{ .Values.Master.SlaveListenerPort }}\n      targetPort: {{ .Values.Master.SlaveListenerPort }}\n      name: slavelistener\n  selector:\n    component: \"{{ .Release.Name }}-{{ .Values.Master.Component }}\"\n  type: {{ .Values.Master.SlaveListenerServiceType }}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/jenkins-master-deployment.yaml",
    "content": "apiVersion: apps/v1 \nkind: Deployment\nmetadata:\n  name: {{ template \"jenkins.fullname\" . }}\n  labels:\n    heritage: {{ .Release.Service | quote }}\n    release: {{ .Release.Name | quote }}\n    chart: \"{{ .Chart.Name }}-{{ .Chart.Version }}\"\n    component: \"{{ .Release.Name }}-{{ .Values.Master.Name }}\"\nspec:\n  replicas: 1\n  strategy:\n    type: RollingUpdate\n  selector:\n    matchLabels:\n      component: \"{{ .Release.Name }}-{{ .Values.Master.Component }}\"\n  template:\n    metadata:\n      labels:\n        app: {{ template \"jenkins.fullname\" . }}\n        heritage: {{ .Release.Service | quote }}\n        release: {{ .Release.Name | quote }}\n        chart: \"{{ .Chart.Name }}-{{ .Chart.Version }}\"\n        component: \"{{ .Release.Name }}-{{ .Values.Master.Component }}\"\n      annotations:\n        checksum/config: {{ include (print $.Template.BasePath \"/config.yaml\") . | sha256sum }}\n        {{- if .Values.Master.PodAnnotations }}\n{{ toYaml .Values.Master.PodAnnotations | indent 8 }}\n        {{- end }}\n    spec:\n      {{- if .Values.Master.NodeSelector }}\n      nodeSelector:\n{{ toYaml .Values.Master.NodeSelector | indent 8 }}\n      {{- end }}\n      {{- if .Values.Master.Tolerations }}\n      tolerations:\n{{ toYaml .Values.Master.Tolerations | indent 8 }}\n      {{- end }}\n      {{- if .Values.Master.Affinity }}\n      affinity:\n{{ toYaml .Values.Master.Affinity | indent 8 }}\n      {{- end }}\n{{- if .Values.Master.UsePodSecurityContext }}\n      securityContext:\n        runAsUser: {{ default 0 .Values.Master.RunAsUser }}\n{{- if and (.Values.Master.RunAsUser) (.Values.Master.FsGroup) }}\n{{- if not (eq .Values.Master.RunAsUser 0.0) }}\n        fsGroup: {{ .Values.Master.FsGroup }}\n{{- end }}\n{{- end }}\n{{- end }}\n      serviceAccountName: {{ if .Values.rbac.install }}{{ template \"jenkins.fullname\" . }}{{ else }}\"{{ .Values.rbac.serviceAccountName }}\"{{ end }}\n      initContainers:\n        - name: \"copy-default-config\"\n          image: \"{{ .Values.Master.Image }}:{{ .Values.Master.ImageTag }}\"\n          imagePullPolicy: \"{{ .Values.Master.ImagePullPolicy }}\"\n          command: [ \"sh\", \"/var/jenkins_config/apply_config.sh\" ]\n          {{- if .Values.Master.InitContainerEnv }}\n          env:\n{{ toYaml .Values.Master.InitContainerEnv | indent 12 }}\n          {{- end }}\n          volumeMounts:\n            -\n              mountPath: /var/jenkins_home\n              name: jenkins-home\n            -\n              mountPath: /var/jenkins_config\n              name: jenkins-config\n            {{- if .Values.Master.CredentialsXmlSecret }}\n            -\n              mountPath: /var/jenkins_credentials\n              name: jenkins-credentials\n              readOnly: true\n            {{- end }}\n            {{- if .Values.Master.SecretsFilesSecret }}\n            -\n              mountPath: /var/jenkins_secrets\n              name: jenkins-secrets\n              readOnly: true\n            {{- end }}\n            {{- if .Values.Master.Jobs }}\n            -\n              mountPath: /var/jenkins_jobs\n              name: jenkins-jobs\n              readOnly: true\n            {{- end }}\n            {{- if .Values.Master.InstallPlugins }}\n            -\n              mountPath: /var/jenkins_plugins\n              name: plugin-dir\n            {{- end }}\n            -\n              mountPath: /usr/share/jenkins/ref/secrets/\n              name: secrets-dir\n      containers:\n        - name: {{ template \"jenkins.fullname\" . }}\n          image: \"{{ .Values.Master.Image }}:{{ .Values.Master.ImageTag }}\"\n          imagePullPolicy: \"{{ .Values.Master.ImagePullPolicy }}\"\n          {{- if .Values.Master.UseSecurity }}\n          args: [ \"--argumentsRealm.passwd.$(ADMIN_USER)=$(ADMIN_PASSWORD)\",  \"--argumentsRealm.roles.$(ADMIN_USER)=admin\"]\n          {{- end }}\n          env:\n            - name: JAVA_OPTS\n              value: \"{{ default \"\" .Values.Master.JavaOpts}}\"\n            - name: JENKINS_OPTS\n              value: \"{{ if .Values.Master.JenkinsUriPrefix }}--prefix={{ .Values.Master.JenkinsUriPrefix }} {{ end }}{{ default \"\" .Values.Master.JenkinsOpts}}\"\n            {{- if .Values.Master.UseSecurity }}\n            - name: ADMIN_PASSWORD\n              valueFrom:\n                secretKeyRef:\n                  name: {{ template \"jenkins.fullname\" . }}\n                  key: jenkins-admin-password\n            - name: ADMIN_USER\n              valueFrom:\n                secretKeyRef:\n                  name: {{ template \"jenkins.fullname\" . }}\n                  key: jenkins-admin-user\n            {{- end }}\n            {{- if .Values.Master.ContainerEnv }}\n{{ toYaml .Values.Master.ContainerEnv | indent 12 }}\n            {{- end }}\n          ports:\n            - containerPort: {{ .Values.Master.ContainerPort }}\n              name: http\n            - containerPort: {{ .Values.Master.SlaveListenerPort }}\n              name: slavelistener\n            {{- if .Values.Master.JMXPort }}\n            - containerPort: {{ .Values.Master.JMXPort }}\n              name: jmx\n            {{- end }}\n{{- if .Values.Master.HealthProbes }}\n          livenessProbe:\n            httpGet:\n              path: /login\n              port: http\n            initialDelaySeconds: {{ .Values.Master.HealthProbesLivenessTimeout }}\n            timeoutSeconds: 5\n            failureThreshold: {{ .Values.Master.HealthProbeLivenessFailureThreshold }}\n          readinessProbe:\n            httpGet:\n              path: /login\n              port: http\n            initialDelaySeconds: {{ .Values.Master.HealthProbesReadinessTimeout }}\n{{- end }}\n          resources:\n{{ if or .Values.Master.Cpu .Values.Master.Memory }}\n            requests:\n              cpu: \"{{ .Values.Master.Cpu }}\"\n              memory: \"{{ .Values.Master.Memory }}\"\n{{ else }}\n{{ toYaml .Values.Master.resources | indent 12 }}\n{{ end }}\n          volumeMounts:\n{{- if .Values.Persistence.mounts }}\n{{ toYaml .Values.Persistence.mounts | indent 12 }}\n{{- end }}\n            -\n              mountPath: /var/jenkins_home\n              name: jenkins-home\n              readOnly: false\n            -\n              mountPath: /var/jenkins_config\n              name: jenkins-config\n              readOnly: true\n            {{- if .Values.Master.CredentialsXmlSecret }}\n            -\n              mountPath: /var/jenkins_credentials\n              name: jenkins-credentials\n              readOnly: true\n            {{- end }}\n            {{- if .Values.Master.SecretsFilesSecret }}\n            -\n              mountPath: /var/jenkins_secrets\n              name: jenkins-secrets\n              readOnly: true\n            {{- end }}\n            {{- if .Values.Master.Jobs }}\n            -\n              mountPath: /var/jenkins_jobs\n              name: jenkins-jobs\n              readOnly: true\n            {{- end }}\n            {{- if .Values.Master.InstallPlugins }}\n            -\n              mountPath: /usr/share/jenkins/ref/plugins/\n              name: plugin-dir\n              readOnly: false\n            {{- end }}\n            -\n              mountPath: /usr/share/jenkins/ref/secrets/\n              name: secrets-dir\n              readOnly: false\n      volumes:\n{{- if .Values.Persistence.volumes }}\n{{ toYaml .Values.Persistence.volumes | indent 6 }}\n{{- end }}\n      - name: jenkins-config\n        configMap:\n          name: {{ template \"jenkins.fullname\" . }}\n      {{- if .Values.Master.CredentialsXmlSecret }}\n      - name: jenkins-credentials\n        secret:\n          secretName: {{ .Values.Master.CredentialsXmlSecret }}\n      {{- end }}\n      {{- if .Values.Master.SecretsFilesSecret }}\n      - name: jenkins-secrets\n        secret:\n          secretName: {{ .Values.Master.SecretsFilesSecret }}\n      {{- end }}\n      {{- if .Values.Master.Jobs }}\n      - name: jenkins-jobs\n        configMap:\n          name: {{ template \"jenkins.fullname\" . }}-jobs\n      {{- end }}\n      {{- if .Values.Master.InstallPlugins }}\n      - name: plugin-dir\n        emptyDir: {}\n      {{- end }}\n      - name: secrets-dir\n        emptyDir: {}\n      - name: jenkins-home\n      {{- if .Values.Persistence.Enabled }}\n        persistentVolumeClaim:\n          claimName: {{ .Values.Persistence.ExistingClaim | default (include \"jenkins.fullname\" .) }}\n      {{- else }}\n        emptyDir: {}\n      {{- end -}}\n{{- if .Values.Master.ImagePullSecret }}\n      imagePullSecrets:\n      - name: {{ .Values.Master.ImagePullSecret }}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/jenkins-master-ingress.yaml",
    "content": "{{- if .Values.Master.HostName }}\napiVersion: {{ .Values.Master.Ingress.ApiVersion }}\nkind: Ingress\nmetadata:\n{{- if .Values.Master.Ingress.Annotations }}\n  annotations:\n{{ toYaml .Values.Master.Ingress.Annotations | indent 4 }}\n{{- end }}\n  name: {{ template \"jenkins.fullname\" . }}\nspec:\n  rules:\n  - host: {{ .Values.Master.HostName | quote }}\n    http:\n      paths:\n      - backend:\n          serviceName: {{ template \"jenkins.fullname\" . }}\n          servicePort: {{ .Values.Master.ServicePort }}\n{{- if .Values.Master.Ingress.TLS }}\n  tls:\n{{ toYaml .Values.Master.Ingress.TLS | indent 4 }}\n{{- end -}}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/jenkins-master-networkpolicy.yaml",
    "content": "{{- if .Values.NetworkPolicy.Enabled }}\nkind: NetworkPolicy\napiVersion: {{ .Values.NetworkPolicy.ApiVersion }}\nmetadata:\n  name: \"{{ .Release.Name }}-{{ .Values.Master.Component }}\"\nspec:\n  podSelector:\n    matchLabels:\n      component: \"{{ .Release.Name }}-{{ .Values.Master.Component }}\"\n  ingress:\n    # Allow web access to the UI\n    - ports:\n      - port: {{ .Values.Master.ContainerPort }}\n    # Allow inbound connections from slave\n    - from:\n      - podSelector:\n          matchLabels:\n            \"jenkins/{{ .Release.Name }}-{{ .Values.Agent.Component }}\": \"true\"\n      ports:\n      - port: {{ .Values.Master.SlaveListenerPort }}\n{{- if .Values.Agent.Enabled }}\n---\nkind: NetworkPolicy\napiVersion: {{ .Values.NetworkPolicy.ApiVersion }}\nmetadata:\n  name: \"{{ .Release.Name }}-{{ .Values.Agent.Component }}\"\nspec:\n  podSelector:\n    matchLabels:\n      # DefaultDeny\n      \"jenkins/{{ .Release.Name }}-{{ .Values.Agent.Component }}\": \"true\"\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/jenkins-master-svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{template \"jenkins.fullname\" . }}\n  labels:\n    app: {{ template \"jenkins.fullname\" . }}\n    heritage: {{.Release.Service | quote }}\n    release: {{.Release.Name | quote }}\n    chart: \"{{.Chart.Name}}-{{.Chart.Version}}\"\n    component: \"{{.Release.Name}}-{{.Values.Master.Component}}\"\n{{- if .Values.Master.ServiceAnnotations }}\n  annotations:\n{{ toYaml .Values.Master.ServiceAnnotations | indent 4 }}\n{{- end }}\nspec:\n  ports:\n    - port: {{.Values.Master.ServicePort}}\n      name: http\n      targetPort: {{.Values.Master.ContainerPort}}\n      {{if (and (eq .Values.Master.ServiceType \"NodePort\") (not (empty .Values.Master.NodePort)))}}\n      nodePort: {{.Values.Master.NodePort}}\n      {{end}}\n  selector:\n    component: \"{{.Release.Name}}-{{.Values.Master.Component}}\"\n  type: {{.Values.Master.ServiceType}}\n  {{if eq .Values.Master.ServiceType \"LoadBalancer\"}}\n  loadBalancerSourceRanges: {{.Values.Master.LoadBalancerSourceRanges}}\n  {{if .Values.Master.LoadBalancerIP}}\n  loadBalancerIP: {{.Values.Master.LoadBalancerIP}}\n  {{end}}\n  {{end}}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/jenkins-test.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ .Release.Name }}-ui-test-{{ randAlphaNum 5 | lower }}\"\n  annotations:\n    \"helm.sh/hook\": test-success\nspec:\n  {{- if .Values.Master.NodeSelector }}\n  nodeSelector:\n{{ toYaml .Values.Master.NodeSelector | indent 4 }}\n  {{- end }}\n  {{- if .Values.Master.Tolerations }}\n  tolerations:\n{{ toYaml .Values.Master.Tolerations | indent 4 }}\n  {{- end }}\n  initContainers:\n    - name: \"test-framework\"\n      image: \"dduportal/bats:0.4.0\"\n      command:\n      - \"bash\"\n      - \"-c\"\n      - |\n        set -ex\n        # copy bats to tools dir\n        cp -R /usr/local/libexec/ /tools/bats/\n      volumeMounts:\n      - mountPath: /tools\n        name: tools\n  containers:\n    - name: {{ .Release.Name }}-ui-test\n      image: {{ .Values.Master.Image }}:{{ .Values.Master.ImageTag }}\n      command: [\"/tools/bats/bats\", \"-t\", \"/tests/run.sh\"]\n      volumeMounts:\n      - mountPath: /tests\n        name: tests\n        readOnly: true\n      - mountPath: /tools\n        name: tools\n  volumes:\n  - name: tests\n    configMap:\n      name: {{ template \"jenkins.fullname\" . }}-tests\n  - name: tools\n    emptyDir: {}\n  restartPolicy: Never\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/jobs.yaml",
    "content": "{{- if .Values.Master.Jobs }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"jenkins.fullname\" . }}-jobs\ndata:\n{{ .Values.Master.Jobs | indent 2 }}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/rbac.yaml",
    "content": "{{ if .Values.rbac.install }}\n{{- $serviceName := include \"jenkins.fullname\" . -}}\napiVersion: rbac.authorization.k8s.io/{{ required \"A valid .Values.rbac.apiVersion entry required!\" .Values.rbac.apiVersion }}\nkind: ClusterRoleBinding\nmetadata:\n  name: {{ $serviceName }}-role-binding\n  labels:\n    app: {{ $serviceName }}\n    chart: \"{{ .Chart.Name }}-{{ .Chart.Version }}\"\n    release: \"{{ .Release.Name }}\"\n    heritage: \"{{ .Release.Service }}\"\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: {{ .Values.rbac.roleRef }}\nsubjects:\n- kind: ServiceAccount\n  name: {{ $serviceName }}\n  namespace: {{ .Release.Namespace }}\n{{ end }}"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/secret.yaml",
    "content": "{{- if .Values.Master.UseSecurity }}\napiVersion: v1\nkind: Secret\nmetadata:\n  name: {{ template \"jenkins.fullname\" . }}\n  labels:\n    app: {{ template \"jenkins.fullname\" . }}\n    chart: \"{{ .Chart.Name }}-{{ .Chart.Version }}\"\n    release: \"{{ .Release.Name }}\"\n    heritage: \"{{ .Release.Service }}\"\ntype: Opaque\ndata:\n  {{ if .Values.Master.AdminPassword }}\n  jenkins-admin-password: {{ .Values.Master.AdminPassword | b64enc | quote }}\n  {{ else }}\n  jenkins-admin-password: {{ randAlphaNum 10 | b64enc | quote }}\n  {{ end }}\n  jenkins-admin-user: {{ .Values.Master.AdminUser | b64enc | quote }}\n{{- end }}"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/service-account.yaml",
    "content": "{{ if .Values.rbac.install }}\n{{- $serviceName := include \"jenkins.fullname\" . -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ $serviceName }}\n  labels:\n    app: {{ $serviceName }}\n    chart: \"{{ .Chart.Name }}-{{ .Chart.Version }}\"\n    release: \"{{ .Release.Name }}\"\n    heritage: \"{{ .Release.Service }}\"\n{{ end }}"
  },
  {
    "path": "manifests/deprecated/jenkins/templates/test-config.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"jenkins.fullname\" . }}-tests\ndata:\n  run.sh: |-\n    @test \"Testing Jenkins UI is accessible\" {\n      curl --retry 48 --retry-delay 10 {{ template \"jenkins.fullname\" . }}:{{ .Values.Master.ServicePort }}{{ default \"\" .Values.Master.JenkinsUriPrefix }}/login\n    }\n"
  },
  {
    "path": "manifests/deprecated/jenkins/values.yaml",
    "content": "# Default values for jenkins.\n# This is a YAML-formatted file.\n# Declare name/value pairs to be passed into your templates.\n# name: value\n\n## Overrides for generated resource names\n# See templates/_helpers.tpl\n# nameOverride:\n# fullnameOverride:\n\nMaster:\n  Name: jenkins-master\n  Image: \"jenkins/jenkins\"\n  ImageTag: \"2.138.2-alpine\"\n  ImagePullPolicy: \"IfNotPresent\"\n# ImagePullSecret: jenkins\n  Component: \"jenkins-master\"\n  UseSecurity: true\n  AdminUser: admin\n  AdminPassword: admin\n  resources:\n    requests:\n      cpu: \"50m\"\n      memory: \"256Mi\"\n    limits:\n      cpu: \"2000m\"\n      memory: \"2048Mi\"\n  # Environment variables that get added to the init container (useful for e.g. http_proxy)\n  # InitContainerEnv:\n  #   - name: http_proxy\n  #     value: \"http://192.168.64.1:3128\"\n  # ContainerEnv:\n  #   - name: http_proxy\n  #     value: \"http://192.168.64.1:3128\"\n  # Set min/max heap here if needed with:\n  # JavaOpts: \"-Xms512m -Xmx512m\"\n  # JenkinsOpts: \"\"\n  # JenkinsUriPrefix: \"/jenkins\"\n\n  # Enable pod security context (must be `true` if RunAsUser or FsGroup are set)\n  # UsePodSecurityContext: true\n\n  # Set RunAsUser to 1000 to let Jenkins run as non-root user 'jenkins' which exists in 'jenkins/jenkins' docker image.\n  # When setting RunAsUser to a different value than 0 also set FsGroup to the same value:\n  # RunAsUser: <defaults to 0>\n  # FsGroup: <will be omitted in deployment if RunAsUser is 0>\n  ServicePort: 8080\n  # For minikube, set this to NodePort, elsewhere use LoadBalancer\n  # Use ClusterIP if your setup includes ingress controller\n  ServiceType: ClusterIP\n  # Master Service annotations\n  ServiceAnnotations: {}\n  #   service.beta.kubernetes.io/aws-load-balancer-backend-protocol: https\n  # Used to create Ingress record (should used with ServiceType: ClusterIP)\n  HostName: jenkins.local.com\n  # NodePort: <to set explicitly, choose port between 30000-32767\n  ContainerPort: 8080\n  # Enable Kubernetes Liveness and Readiness Probes\n  # ~ 2 minutes to allow Jenkins to restart when upgrading plugins. Set ReadinessTimeout to be shorter than LivenessTimeout.\n  HealthProbes: true\n  HealthProbesLivenessTimeout: 90\n  HealthProbesReadinessTimeout: 60\n  HealthProbeLivenessFailureThreshold: 12\n  SlaveListenerPort: 50000\n  DisabledAgentProtocols:\n    - JNLP-connect\n    - JNLP2-connect\n  CSRF:\n    DefaultCrumbIssuer:\n      Enabled: true\n      ProxyCompatability: true\n  CLI: false\n  # Kubernetes service type for the JNLP slave service\n  # SETTING THIS TO \"LoadBalancer\" IS A HUGE SECURITY RISK: https://github.com/kubernetes/charts/issues/1341\n  SlaveListenerServiceType: ClusterIP\n  SlaveListenerServiceAnnotations: {}\n  LoadBalancerSourceRanges:\n  - 0.0.0.0/0\n  # Optionally assign a known public LB IP\n  # LoadBalancerIP: 1.2.3.4\n  # Optionally configure a JMX port\n  # requires additional JavaOpts, ie\n  JavaOpts: >\n    -Djava.awt.headless=true\n    -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Shanghai\n    -Dfile.encoding=UTF-8\n  #   -Dcom.sun.management.jmxremote.port=4000\n  #   -Dcom.sun.management.jmxremote.authenticate=false\n  #   -Dcom.sun.management.jmxremote.ssl=false\n  # JMXPort: 4000\n\n  # 插件镜像地址\n  UpdateCenter: https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json\n\n  # List of plugins to be install during Jenkins master start\n  InstallPlugins:\n    - kubernetes:1.13.5\n    - workflow-aggregator:2.5\n    - workflow-job:2.25\n    - credentials-binding:1.17\n    - git:3.9.1\n    - gitlab:1.5.10\n  # Used to approve a list of groovy functions in pipelines used the script-security plugin. Can be viewed under /scriptApproval\n  # ScriptApproval:\n  #   - \"method groovy.json.JsonSlurperClassic parseText java.lang.String\"\n  #   - \"new groovy.json.JsonSlurperClassic\"\n  # List of groovy init scripts to be executed during Jenkins master start\n  InitScripts:\n  #  - |\n  #    print 'adding global pipeline libraries, register properties, bootstrap jobs...'\n  # Kubernetes secret that contains a 'credentials.xml' for Jenkins\n  # CredentialsXmlSecret: jenkins-credentials\n  # Kubernetes secret that contains files to be put in the Jenkins 'secrets' directory,\n  # useful to manage encryption keys used for credentials.xml for instance (such as\n  # master.key and hudson.util.Secret)\n  # SecretsFilesSecret: jenkins-secrets\n  # Jenkins XML job configs to provision\n  # Jobs: |-\n  #   test: |-\n  #     <<xml here>>\n  CustomConfigMap: false\n  # Node labels and tolerations for pod assignment\n  # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector\n  # ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature\n  NodeSelector: {}\n\n  Tolerations: {}\n  PodAnnotations: {}\n\n  Ingress:\n    ApiVersion: networking.k8s.io/v1beta1 \n    Annotations:\n    # kubernetes.io/ingress.class: nginx\n    # kubernetes.io/tls-acme: \"true\"\n\n    TLS:\n    # - secretName: jenkins.cluster.local\n    #   hosts:\n    #     - jenkins.cluster.local\n\nAgent:\n  Enabled: true\n  Image: jenkinsci/jnlp-slave\n  ImageTag: alpine\n# ImagePullSecret: jenkins\n  Component: \"jenkins-slave\"\n  Privileged: false\n  resources:\n    requests:\n      cpu: \"200m\"\n      memory: \"256Mi\"\n    limits:\n      cpu: \"200m\"\n      memory: \"256Mi\"\n  # You may want to change this to true while testing a new image\n  AlwaysPullImage: false\n  # You can define the volumes that you want to mount for this container\n  # Allowed types are: ConfigMap, EmptyDir, HostPath, Nfs, Pod, Secret\n  # Configure the attributes as they appear in the corresponding Java class for that type\n  # https://github.com/jenkinsci/kubernetes-plugin/tree/master/src/main/java/org/csanchez/jenkins/plugins/kubernetes/volumes\n  volumes:\n  # - type: Secret\n  #   secretName: mysecret\n  #   mountPath: /var/myapp/mysecret\n  NodeSelector: {}\n  # Key Value selectors. Ex:\n  # jenkins-agent: v1\n\nPersistence:\n  Enabled: true\n  ## A manually managed Persistent Volume and Claim\n  ## Requires Persistence.Enabled: true\n  ## If defined, PVC must be created manually before volume will be bound\n  # ExistingClaim:\n\n  ## jenkins data Persistent Volume Storage Class\n  ## If defined, storageClassName: <storageClass>\n  ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n  ## If undefined (the default) or set to null, no storageClassName spec is\n  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on\n  ##   GKE, AWS & OpenStack)\n  ##\n  StorageClass: \"nfs-dynamic-class\"\n\n  Annotations: {}\n  AccessMode: ReadWriteOnce\n  Size: 8Gi\n  volumes:\n  #  - name: nothing\n  #    emptyDir: {}\n  mounts:\n  #  - mountPath: /var/nothing\n  #    name: nothing\n  #    readOnly: true\n\nNetworkPolicy:\n  # Enable creation of NetworkPolicy resources.\n  Enabled: false\n  # For Kubernetes v1.7, use 'networking.k8s.io/v1'\n  ApiVersion: networking.k8s.io/v1 \n\n## Install Default RBAC roles and bindings\nrbac:\n  install: true\n  serviceAccountName: default\n  # RBAC api version (currently either v1beta1 or v1alpha1 or v1)\n  apiVersion: v1\n  # Cluster role reference\n  roleRef: cluster-admin\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/.helmignore",
    "content": ".git\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/Chart.yaml",
    "content": "name: mariadb\nversion: 5.5.0\nappVersion: 10.1.37\ndescription: Fast, reliable, scalable, and easy to use open-source relational database system. MariaDB Server is intended for mission-critical, heavy-load production systems as well as for embedding into mass-deployed software. Highly available MariaDB cluster.\nkeywords:\n- mariadb\n- mysql\n- database\n- sql\n- prometheus\nhome: https://mariadb.org\nicon: https://bitnami.com/assets/stacks/mariadb/img/mariadb-stack-220x234.png\nsources:\n- https://github.com/bitnami/bitnami-docker-mariadb\n- https://github.com/prometheus/mysqld_exporter\nmaintainers:\n- name: Bitnami\n  email: containers@bitnami.com\nengine: gotpl\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/OWNERS",
    "content": "approvers:\n- prydonius\n- tompizmor\n- sameersbn\n- carrodher\n- juan131\nreviewers:\n- prydonius\n- tompizmor\n- sameersbn\n- carrodher\n- juan131\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/README.md",
    "content": "# MariaDB\n\n[MariaDB](https://mariadb.org) is one of the most popular database servers in the world. It’s made by the original developers of MySQL and guaranteed to stay open source. Notable users include Wikipedia, Facebook and Google.\n\nMariaDB is developed as open source software and as a relational database it provides an SQL interface for accessing data. The latest versions of MariaDB also include GIS and JSON features.\n\n## TL;DR\n\n```bash\n$ helm install stable/mariadb\n```\n\n## Introduction\n\nThis chart bootstraps a [MariaDB](https://github.com/bitnami/bitnami-docker-mariadb) replication cluster deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.\n\nBitnami charts can be used with [Kubeapps](https://kubeapps.com/) for deployment and management of Helm Charts in clusters.\n\n## Prerequisites\n\n- Kubernetes 1.10+\n- PV provisioner support in the underlying infrastructure\n\n## Installing the Chart\n\nTo install the chart with the release name `my-release`:\n\n```bash\n$ helm install --name my-release stable/mariadb\n```\n\nThe command deploys MariaDB on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.\n\n> **Tip**: List all releases using `helm list`\n\n## Uninstalling the Chart\n\nTo uninstall/delete the `my-release` deployment:\n\n```bash\n$ helm delete my-release\n```\n\nThe command removes all the Kubernetes components associated with the chart and deletes the release.\n\n## Configuration\n\nThe following table lists the configurable parameters of the MariaDB chart and their default values.\n\n|             Parameter                     |                     Description                     |                              Default                              |\n|-------------------------------------------|-----------------------------------------------------|-------------------------------------------------------------------|\n| `global.imageRegistry`                    | Global Docker image registry                        | `nil`                                                             |\n| `image.registry`                          | MariaDB image registry                              | `docker.io`                                                       |\n| `image.repository`                        | MariaDB Image name                                  | `bitnami/mariadb`                                                 |\n| `image.tag`                               | MariaDB Image tag                                   | `{VERSION}`                                                       |\n| `image.pullPolicy`                        | MariaDB image pull policy                           | `Always` if `imageTag` is `latest`, else `IfNotPresent`           |\n| `image.pullSecrets`                       | Specify docker-registry secret names as an array    | `[]` (does not add image pull secrets to deployed pods)           |\n| `image.debug`                             | Specify if debug logs should be enabled             | `false`                                                           |\n| `service.type`                            | Kubernetes service type                             | `ClusterIP`                                                       |\n| `service.clusterIp`                       | Specific cluster IP when service type is cluster IP. Use None for headless service | `nil`                              |\n| `service.port`                            | MySQL service port                                  | `3306`                                                            |\n| `serviceAccount.create`                   | Specifies whether a ServiceAccount should be created | `false`                                                          |\n| `serviceAccount.name`                     | The name of the ServiceAccount to create            | Generated using the mariadb.fullname template                     |\n| `securityContext.enabled`                 | Enable security context                             | `true`                                                            |\n| `securityContext.fsGroup`                 | Group ID for the container                          | `1001`                                                            |\n| `securityContext.runAsUser`               | User ID for the container                           | `1001`                                                            |\n| `existingSecret`                          | Use Existing secret for Password details (`rootUser.password`, `db.password`, `replication.password` will be ignored and picked up from this secret) |                         |\n| `rootUser.password`                       | Password for the `root` user. Ignored if existing secret is provided. | _random 10 character alphanumeric string_       |\n| `rootUser.forcePassword`                  | Force users to specify a password                   | `false`                                                           |\n| `db.user`                                 | Username of new user to create                      | `nil`                                                             |\n| `db.password`                             | Password for the new user. Ignored if existing secret is provided.    | _random 10 character alphanumeric string if `db.user` is defined_ |\n| `db.name`                                 | Name for new database to create                     | `my_database`                                                     |\n| `replication.enabled`                     | MariaDB replication enabled                         | `true`                                                            |\n| `replication.user`                        |MariaDB replication user                             | `replicator`                                                      |\n| `replication.password`                    | MariaDB replication user password. Ignored if existing secret is provided. | _random 10 character alphanumeric string_  |\n| `initdbScripts`                           | List of initdb scripts                              | `nil`                                                             |\n| `initdbScriptsConfigMap`                  | ConfigMap with the initdb scripts (Note: Overrides `initdbScripts`) | `nil`                                             |\n| `master.annotations[].key`                | key for the the annotation list item                |  `nil`                                                            |\n| `master.annotations[].value`              | value for the the annotation list item              |  `nil`                                                            |\n| `master.affinity`                         | Master affinity (in addition to master.antiAffinity when set)  | `{}`                                                   |\n| `master.antiAffinity`                     | Master pod anti-affinity policy                     | `soft`                                                            |\n| `master.tolerations`                      | List of node taints to tolerate (master)            | `[]`                                                              |\n| `master.persistence.enabled`              | Enable persistence using PVC                        | `true`                                                            |\n| `master.persistence.existingClaim`        | Provide an existing `PersistentVolumeClaim`         | `nil`                                                             |\n| `master.persistence.mountPath`            | Path to mount the volume at                         | `/bitnami/mariadb`                                                |\n| `master.persistence.annotations`          | Persistent Volume Claim annotations                 | `{}`                                                              |\n| `master.persistence.storageClass`         | Persistent Volume Storage Class                     | ``                                                                |\n| `master.persistence.accessModes`          | Persistent Volume Access Modes                      | `[ReadWriteOnce]`                                                 |\n| `master.persistence.size`                 | Persistent Volume Size                              | `8Gi`                                                             |\n| `master.extraInitContainers`              | Additional init containers as a string to be passed to the `tpl` function (master) |                                    |\n| `master.config`                           | Config file for the MariaDB Master server           | `_default values in the values.yaml file_`                        |\n| `master.resources`                        | CPU/Memory resource requests/limits for master node | `{}`                                                              |\n| `master.livenessProbe.enabled`            | Turn on and off liveness probe (master)             | `true`                                                            |\n| `master.livenessProbe.initialDelaySeconds`| Delay before liveness probe is initiated (master)   | `120`                                                             |\n| `master.livenessProbe.periodSeconds`      | How often to perform the probe (master)             | `10`                                                              |\n| `master.livenessProbe.timeoutSeconds`     | When the probe times out (master)                   | `1`                                                               |\n| `master.livenessProbe.successThreshold`   | Minimum consecutive successes for the probe (master)| `1`                                                               |\n| `master.livenessProbe.failureThreshold`   | Minimum consecutive failures for the probe (master) | `3`                                                               |\n| `master.readinessProbe.enabled`           | Turn on and off readiness probe (master)            | `true`                                                            |\n| `master.readinessProbe.initialDelaySeconds`| Delay before readiness probe is initiated (master) | `30`                                                              |\n| `master.readinessProbe.periodSeconds`     | How often to perform the probe (master)             | `10`                                                              |\n| `master.readinessProbe.timeoutSeconds`    | When the probe times out (master)                   | `1`                                                               |\n| `master.readinessProbe.successThreshold`  | Minimum consecutive successes for the probe (master)| `1`                                                               |\n| `master.readinessProbe.failureThreshold`  | Minimum consecutive failures for the probe (master) | `3`                                                               |\n| `slave.replicas`                          | Desired number of slave replicas                    | `1`                                                               |\n| `slave.annotations[].key`                 | key for the the annotation list item                | `nil`                                                             |\n| `slave.annotations[].value`               | value for the the annotation list item              | `nil`                                                             |\n| `slave.affinity`                          | Slave affinity (in addition to slave.antiAffinity when set) | `{}`                                                      |\n| `slave.antiAffinity`                      | Slave pod anti-affinity policy                      | `soft`                                                            |\n| `slave.tolerations`                       | List of node taints to tolerate for (slave)         | `[]`                                                              |\n| `slave.persistence.enabled`               | Enable persistence using a `PersistentVolumeClaim`  | `true`                                                            |\n| `slave.persistence.annotations`           | Persistent Volume Claim annotations                 | `{}`                                                              |\n| `slave.persistence.storageClass`          | Persistent Volume Storage Class                     | ``                                                                |\n| `slave.persistence.accessModes`           | Persistent Volume Access Modes                      | `[ReadWriteOnce]`                                                 |\n| `slave.persistence.size`                  | Persistent Volume Size                              | `8Gi`                                                             |\n| `slave.extraInitContainers`               | Additional init containers as a string to be passed to the `tpl` function (slave)               |                       |\n| `slave.config`                            | Config file for the MariaDB Slave replicas          | `_default values in the values.yaml file_`                        |\n| `slave.resources`                         | CPU/Memory resource requests/limits for slave node  | `{}`                                                              |\n| `slave.livenessProbe.enabled`             | Turn on and off liveness probe (slave)              | `true`                                                            |\n| `slave.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated (slave)    | `120`                                                             |\n| `slave.livenessProbe.periodSeconds`       | How often to perform the probe (slave)              | `10`                                                              |\n| `slave.livenessProbe.timeoutSeconds`      | When the probe times out (slave)                    | `1`                                                               |\n| `slave.livenessProbe.successThreshold`    | Minimum consecutive successes for the probe (slave) | `1`                                                               |\n| `slave.livenessProbe.failureThreshold`    | Minimum consecutive failures for the probe (slave)  | `3`                                                               |\n| `slave.readinessProbe.enabled`            | Turn on and off readiness probe (slave)             | `true`                                                            |\n| `slave.readinessProbe.initialDelaySeconds`| Delay before readiness probe is initiated (slave)   | `45`                                                              |\n| `slave.readinessProbe.periodSeconds`      | How often to perform the probe (slave)              | `10`                                                              |\n| `slave.readinessProbe.timeoutSeconds`     | When the probe times out (slave)                    | `1`                                                               |\n| `slave.readinessProbe.successThreshold`   | Minimum consecutive successes for the probe (slave) | `1`                                                               |\n| `slave.readinessProbe.failureThreshold`   | Minimum consecutive failures for the probe (slave)  | `3`                                                               |\n| `metrics.enabled`                         | Start a side-car prometheus exporter                | `false`                                                           |\n| `metrics.image.registry`                  | Exporter image registry                             | `docker.io`                                                       |\n| `metrics.image.repository`                | Exporter image name                                 | `prom/mysqld-exporter`                                            |\n| `metrics.image.tag`                       | Exporter image tag                                  | `v0.10.0`                                                         |\n| `metrics.image.pullPolicy`                | Exporter image pull policy                          | `IfNotPresent`                                                    |\n| `metrics.resources`                       | Exporter resource requests/limit                    | `nil`                                                             |\n\nThe above parameters map to the env variables defined in [bitnami/mariadb](http://github.com/bitnami/bitnami-docker-mariadb). For more information please refer to the [bitnami/mariadb](http://github.com/bitnami/bitnami-docker-mariadb) image documentation.\n\nSpecify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,\n\n```bash\n$ helm install --name my-release \\\n  --set root.password=secretpassword,user.database=app_database \\\n    stable/mariadb\n```\n\nThe above command sets the MariaDB `root` account password to `secretpassword`. Additionally it creates a database named `my_database`.\n\nAlternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,\n\n```bash\n$ helm install --name my-release -f values.yaml stable/mariadb\n```\n\n> **Tip**: You can use the default [values.yaml](values.yaml)\n\n## Initialize a fresh instance\n\nThe [Bitnami MariaDB](https://github.com/bitnami/bitnami-docker-mariadb) image allows you to use your custom scripts to initialize a fresh instance. In order to execute the scripts, they must be located inside the chart folder `files/docker-entrypoint-initdb.d` so they can be consumed as a ConfigMap.\n\nAlternatively, you can specify custom scripts using the `initdbScripts` parameter as dict.\n\nIn addition to these options, you can also set an external ConfigMap with all the initialization scripts. This is done by setting the `initdbScriptsConfigMap` parameter. Note that this will override the two previous options.\n\nThe allowed extensions are `.sh`, `.sql` and `.sql.gz`.\n\n## Persistence\n\nThe [Bitnami MariaDB](https://github.com/bitnami/bitnami-docker-mariadb) image stores the MariaDB data and configurations at the `/bitnami/mariadb` path of the container.\n\nThe chart mounts a [Persistent Volume](kubernetes.io/docs/user-guide/persistent-volumes/) volume at this location. The volume is created using dynamic volume provisioning, by default. An existing PersistentVolumeClaim can be defined.\n\n## Extra Init Containers\n\nThe feature allows for specifying a template string for a initContainer in the master/slave pod. Usecases include situations when you need some pre-run setup. For example, in IKS (IBM Cloud Kubernetes Service), non-root users do not have write permission on the volume mount path for NFS-powered file storage. So, you could use a initcontainer to `chown` the mount. See a example below, where we add an initContainer on the master pod that reports to an external resource that the db is going to starting.\n`values.yaml`\n```yaml\nmaster:\n  extraInitContainers: |\n    - name: initcontainer\n      image: alpine:latest\n      command: [\"/bin/sh\", \"-c\"]\n      args:\n        - curl http://api-service.local/db/starting;\n```\n\n## Upgrading\n\nIt's necessary to set the `rootUser.password` parameter when upgrading for readiness/liveness probes to work properly. When you install this chart for the first time, some notes will be displayed providing the credentials you must use under the 'Administrator credentials' section. Please note down the password and run the command below to upgrade your chart:\n\n```bash\n$ helm upgrade my-release stable/mariadb --set rootUser.password=[ROOT_PASSWORD]\n```\n\n| Note: you need to substitute the placeholder _[ROOT_PASSWORD]_ with the value obtained in the installation notes.\n\n### To 5.0.0\n\nBackwards compatibility is not guaranteed unless you modify the labels used on the chart's deployments.\nUse the workaround below to upgrade from versions previous to 5.0.0. The following example assumes that the release name is mariadb:\n\n```console\n$ kubectl delete statefulset opencart-mariadb --cascade=false\n```\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/files/docker-entrypoint-initdb.d/README.md",
    "content": "You can copy here your custom .sh, .sql or .sql.gz file so they are executed during the first boot of the image.\n\nMore info in the [bitnami-docker-mariadb](https://github.com/bitnami/bitnami-docker-mariadb#initializing-a-new-instance) repository."
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/NOTES.txt",
    "content": "\nPlease be patient while the chart is being deployed\n\nTip:\n\n  Watch the deployment status using the command: kubectl get pods -w --namespace {{ .Release.Namespace }} -l release={{ .Release.Name }}\n\nServices:\n\n  echo Master: {{ template \"mariadb.fullname\" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.service.port }}\n{{- if .Values.replication.enabled }}\n  echo Slave:  {{ template \"slave.fullname\" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.service.port }}\n{{- end }}\n\nAdministrator credentials:\n\n  Username: root\n  Password : $(kubectl get secret --namespace {{ .Release.Namespace }} {{ template \"mariadb.fullname\" . }} -o jsonpath=\"{.data.mariadb-root-password}\" | base64 --decode)\n\nTo connect to your database:\n\n  1. Run a pod that you can use as a client:\n\n      kubectl run {{ template \"mariadb.fullname\" . }}-client --rm --tty -i --restart='Never' --image  {{ template \"mariadb.image\" . }} --namespace {{ .Release.Namespace }} --command -- bash\n\n  2. To connect to master service (read/write):\n\n      mysql -h {{ template \"mariadb.fullname\" . }}.{{ .Release.Namespace }}.svc.cluster.local -uroot -p {{ .Values.db.name }}\n\n{{- if .Values.replication.enabled }}\n\n  3. To connect to slave service (read-only):\n\n      mysql -h {{ template \"slave.fullname\" . }}.{{ .Release.Namespace }}.svc.cluster.local -uroot -p {{ .Values.db.name }}\n{{- end }}\n\nTo upgrade this helm chart:\n\n  1. Obtain the password as described on the 'Administrator credentials' section and set the 'rootUser.password' parameter as shown below:\n\n      ROOT_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template \"mariadb.fullname\" . }} -o jsonpath=\"{.data.mariadb-root-password}\" | base64 --decode)\n      helm upgrade {{ .Release.Name }} stable/mariadb --set rootUser.password=$ROOT_PASSWORD\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"mariadb.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\nIf release name contains chart name it will be used as a full name.\n*/}}\n{{- define \"mariadb.fullname\" -}}\n{{- if .Values.fullnameOverride -}}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- if contains $name .Release.Name -}}\n{{- printf .Release.Name | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n{{- end -}}\n{{- end -}}\n\n{{- define \"master.fullname\" -}}\n{{- if .Values.replication.enabled -}}\n{{- printf \"%s-%s\" .Release.Name \"mariadb-master\" | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- printf \"%s-%s\" .Release.Name \"mariadb\" | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n{{- end -}}\n\n{{- define \"slave.fullname\" -}}\n{{- printf \"%s-%s\" .Release.Name \"mariadb-slave\" | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{- define \"mariadb.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nReturn the proper MariaDB image name\n*/}}\n{{- define \"mariadb.image\" -}}\n{{- $registryName := .Values.image.registry -}}\n{{- $repositoryName := .Values.image.repository -}}\n{{- $tag := .Values.image.tag | toString -}}\n{{/*\nHelm 2.11 supports the assignment of a value to a variable defined in a different scope,\nbut Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.\nAlso, we can't use a single if because lazy evaluation is not an option\n*/}}\n{{- if .Values.global }}\n    {{- if .Values.global.imageRegistry }}\n        {{- printf \"%s/%s:%s\" .Values.global.imageRegistry $repositoryName $tag -}}\n    {{- else -}}\n        {{- printf \"%s/%s:%s\" $registryName $repositoryName $tag -}}\n    {{- end -}}\n{{- else -}}\n    {{- printf \"%s/%s:%s\" $registryName $repositoryName $tag -}}\n{{- end -}}\n{{- end -}}\n\n{{/*\nReturn the proper metrics image name\n*/}}\n{{- define \"metrics.image\" -}}\n{{- $registryName :=  .Values.metrics.image.registry -}}\n{{- $repositoryName := .Values.metrics.image.repository -}}\n{{- $tag := .Values.metrics.image.tag | toString -}}\n{{- printf \"%s/%s:%s\" $registryName $repositoryName $tag -}}\n{{- end -}}\n\n{{ template \"mariadb.initdbScriptsCM\" . }}\n{{/*\nGet the initialization scripts ConfigMap name.\n*/}}\n{{- define \"mariadb.initdbScriptsCM\" -}}\n{{- if .Values.initdbScriptsConfigMap -}}\n{{- printf \"%s\" .Values.initdbScriptsConfigMap -}}\n{{- else -}}\n{{- printf \"%s-init-scripts\" (include \"mariadb.fullname\" .) -}}\n{{- end -}}\n{{- end -}}\n\n{{/*\nCreate the name of the service account to use\n*/}}\n{{- define \"mariadb.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.create -}}\n    {{ default (include \"mariadb.fullname\" .) .Values.serviceAccount.name }}\n{{- else -}}\n    {{ default \"default\" .Values.serviceAccount.name }}\n{{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/initialization-configmap.yaml",
    "content": "{{- if and (or (.Files.Glob \"files/docker-entrypoint-initdb.d/*.{sh,sql,sql.gz}\") .Values.initdbScripts) (not .Values.initdbScriptsConfigMap) }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"master.fullname\" . }}-init-scripts\n  labels:\n    app: {{ template \"mariadb.name\" . }}\n    chart: {{ template \"mariadb.chart\" . }}\n    release: {{ .Release.Name | quote }}\n    heritage: {{ .Release.Service | quote }}\n    component: \"master\"\n{{- if and (.Files.Glob \"files/docker-entrypoint-initdb.d/*.sql.gz\") (not .Values.initdbScriptsConfigMap) }}\nbinaryData:\n{{- $root := . }}\n{{- range $path, $bytes := .Files.Glob \"files/docker-entrypoint-initdb.d/*.sql.gz\" }}\n  {{ base $path }}: {{ $root.Files.Get $path | b64enc | quote }}\n{{- end }}\n{{- end }}\ndata:\n{{- if and (.Files.Glob \"files/docker-entrypoint-initdb.d/*.{sh,sql}\") (not .Values.initdbScriptsConfigMap) }}\n{{ (.Files.Glob \"files/docker-entrypoint-initdb.d/*.{sh,sql}\").AsConfig | indent 2 }}\n{{- end }}\n{{- with .Values.initdbScripts }}\n{{ toYaml . | indent 2 }}\n{{- end }}\n{{ end }}\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/master-configmap.yaml",
    "content": "{{- if .Values.master.config }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"master.fullname\" . }}\n  labels:\n    app: {{ template \"mariadb.name\" . }}\n    component: \"master\"\n    chart: {{ template \"mariadb.chart\" . }}\n    release: {{ .Release.Name | quote }}\n    heritage: {{ .Release.Service | quote }}\ndata:\n  my.cnf: |-\n{{ .Values.master.config | indent 4 }}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/master-statefulset.yaml",
    "content": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ template \"master.fullname\" . }}\n  labels:\n    app: \"{{ template \"mariadb.name\" . }}\"\n    chart: {{ template \"mariadb.chart\" . }}\n    component: \"master\"\n    release: {{ .Release.Name | quote }}\n    heritage: {{ .Release.Service | quote }}\nspec:\n  selector:\n    matchLabels:\n      release: \"{{ .Release.Name }}\"\n      component: \"master\"\n      app: {{ template \"mariadb.name\" . }}\n  serviceName: \"{{ template \"master.fullname\" . }}\"\n  replicas: 1\n  updateStrategy:\n    type: RollingUpdate\n  template:\n    metadata:\n      {{- if .Values.master.annotations }}\n      annotations:\n        {{- range .Values.master.annotations }}\n        {{ .key }}: '{{ .value }}'\n        {{- end }}\n      {{- end }}\n      labels:\n        app: \"{{ template \"mariadb.name\" . }}\"\n        component: \"master\"\n        release: \"{{ .Release.Name }}\"\n        chart: {{ template \"mariadb.chart\" . }}\n    spec:\n      serviceAccountName: \"{{ template \"mariadb.serviceAccountName\" . }}\"\n      {{- if .Values.securityContext.enabled }}\n      securityContext:\n        fsGroup: {{ .Values.securityContext.fsGroup }}\n        runAsUser: {{ .Values.securityContext.runAsUser }}\n      {{- end }}\n      {{- if eq .Values.master.antiAffinity \"hard\" }}\n      affinity:\n      {{- with .Values.master.affinity  }}\n{{ toYaml . | indent 8 }}\n      {{- end }}\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - topologyKey: \"kubernetes.io/hostname\"\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"mariadb.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n      {{- else if eq .Values.master.antiAffinity \"soft\" }}\n      affinity:\n      {{- with .Values.master.affinity  }}\n{{ toYaml . | indent 8 }}\n      {{- end }}\n        podAntiAffinity:\n          preferredDuringSchedulingIgnoredDuringExecution:\n          - weight: 1\n            podAffinityTerm:\n              topologyKey: kubernetes.io/hostname\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"mariadb.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n      {{- else}}\n      {{- with .Values.master.affinity }}\n      affinity:\n{{ toYaml . | indent 8 }}\n      {{- end }}\n      {{- end }}\n      {{- with .Values.master.tolerations }}\n      tolerations:\n{{ toYaml . | indent 8 }}\n      {{- end }}\n      {{- if .Values.image.pullSecrets }}\n      imagePullSecrets:\n      {{- range .Values.image.pullSecrets }}\n        - name: {{ . }}\n      {{- end}}\n      {{- end }}\n      {{- if .Values.master.extraInitContainers }}\n      initContainers:\n{{ tpl .Values.master.extraInitContainers . | indent 6}}\n      {{- end }}\n      containers:\n      - name: \"mariadb\"\n        image: {{ template \"mariadb.image\" . }}\n        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}\n        env:\n        {{- if .Values.image.debug}}\n        - name: BITNAMI_DEBUG\n          value: \"true\"\n        {{- end }}\n        - name: MARIADB_ROOT_PASSWORD\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"mariadb.fullname\" . }}\n            {{- end }}\n              key: mariadb-root-password\n        {{- if .Values.db.user }}\n        - name: MARIADB_USER\n          value: \"{{ .Values.db.user }}\"\n        - name: MARIADB_PASSWORD\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"mariadb.fullname\" . }}\n            {{- end }}\n              key: mariadb-password\n        {{- end }}\n        - name: MARIADB_DATABASE\n          value: \"{{ .Values.db.name }}\"\n        {{- if .Values.replication.enabled }}\n        - name: MARIADB_REPLICATION_MODE\n          value: \"master\"\n        - name: MARIADB_REPLICATION_USER\n          value: \"{{ .Values.replication.user }}\"\n        - name: MARIADB_REPLICATION_PASSWORD\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"mariadb.fullname\" . }}\n            {{- end }}\n              key: mariadb-replication-password\n        {{- end }}\n        ports:\n        - name: mysql\n          containerPort: 3306\n        {{- if .Values.master.livenessProbe.enabled }}\n        livenessProbe:\n          exec:\n            command: [\"sh\", \"-c\", \"exec mysqladmin status -uroot -p$MARIADB_ROOT_PASSWORD\"]\n          initialDelaySeconds: {{ .Values.master.livenessProbe.initialDelaySeconds }}\n          periodSeconds: {{ .Values.master.livenessProbe.periodSeconds }}\n          timeoutSeconds: {{ .Values.master.livenessProbe.timeoutSeconds }}\n          successThreshold: {{ .Values.master.livenessProbe.successThreshold }}\n          failureThreshold: {{ .Values.master.livenessProbe.failureThreshold }}\n        {{- end }}\n        {{- if .Values.master.readinessProbe.enabled }}\n        readinessProbe:\n          exec:\n            command: [\"sh\", \"-c\", \"exec mysqladmin status -uroot -p$MARIADB_ROOT_PASSWORD\"]\n          initialDelaySeconds: {{ .Values.master.readinessProbe.initialDelaySeconds }}\n          periodSeconds: {{ .Values.master.readinessProbe.periodSeconds }}\n          timeoutSeconds: {{ .Values.master.readinessProbe.timeoutSeconds }}\n          successThreshold: {{ .Values.master.readinessProbe.successThreshold }}\n          failureThreshold: {{ .Values.master.readinessProbe.failureThreshold }}\n        {{- end }}\n        resources:\n{{ toYaml .Values.master.resources | indent 10 }}\n        volumeMounts:\n        - name: data\n          mountPath: {{ .Values.master.persistence.mountPath }}\n        {{- if or (.Files.Glob \"files/docker-entrypoint-initdb.d/*.{sh,sql,sql.gz}\") .Values.initdbScriptsConfigMap .Values.initdbScripts }}\n        - name: custom-init-scripts\n          mountPath: /docker-entrypoint-initdb.d\n        {{- end }}\n        {{- if .Values.master.config }}\n        - name: config\n          mountPath: /opt/bitnami/mariadb/conf/my.cnf\n          subPath: my.cnf\n       {{- end }}\n{{- if .Values.metrics.enabled }}\n      - name: metrics\n        image: {{ template \"metrics.image\" . }}\n        imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}\n        env:\n        - name: MARIADB_ROOT_PASSWORD\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"mariadb.fullname\" . }}\n            {{- end }}\n              key: mariadb-root-password\n        command: [ 'sh', '-c', 'DATA_SOURCE_NAME=\"root:$MARIADB_ROOT_PASSWORD@(localhost:3306)/\" /bin/mysqld_exporter' ]\n        ports:\n        - name: metrics\n          containerPort: 9104\n        livenessProbe:\n          httpGet:\n            path: /metrics\n            port: metrics\n          initialDelaySeconds: 15\n          timeoutSeconds: 5\n        readinessProbe:\n          httpGet:\n            path: /metrics\n            port: metrics\n          initialDelaySeconds: 5\n          timeoutSeconds: 1\n        resources:\n{{ toYaml .Values.metrics.resources | indent 10 }}\n{{- end }}\n      volumes:\n        {{- if .Values.master.config }}\n        - name: config\n          configMap:\n            name: {{ template \"master.fullname\" . }}\n        {{- end }}\n        {{- if or (.Files.Glob \"files/docker-entrypoint-initdb.d/*.{sh,sql,sql.gz}\") .Values.initdbScriptsConfigMap .Values.initdbScripts }}\n        - name: custom-init-scripts\n          configMap:\n            name: {{ template \"mariadb.initdbScriptsCM\" . }}\n        {{- end }}\n{{- if and .Values.master.persistence.enabled .Values.master.persistence.existingClaim }}\n        - name: data\n          persistentVolumeClaim:\n            claimName: {{ .Values.master.persistence.existingClaim }}\n{{- else if not .Values.master.persistence.enabled }}\n        - name: data\n          emptyDir: {}\n{{- else if and .Values.master.persistence.enabled (not .Values.master.persistence.existingClaim) }}\n  volumeClaimTemplates:\n    - metadata:\n        name: data\n        labels:\n          app: \"{{ template \"mariadb.name\" . }}\"\n          component: \"master\"\n          release: {{ .Release.Name | quote }}\n          heritage: {{ .Release.Service | quote }}\n      spec:\n        accessModes:\n        {{- range .Values.master.persistence.accessModes }}\n          - {{ . | quote }}\n        {{- end }}\n        resources:\n          requests:\n            storage: {{ .Values.master.persistence.size | quote }}\n      {{- if .Values.master.persistence.storageClass }}\n      {{- if (eq \"-\" .Values.master.persistence.storageClass) }}\n        storageClassName: \"\"\n      {{- else }}\n        storageClassName: {{ .Values.master.persistence.storageClass | quote }}\n      {{- end }}\n      {{- end }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/master-svc.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ template \"mariadb.fullname\" . }}\n  labels:\n    app: \"{{ template \"mariadb.name\" . }}\"\n    component: \"master\"\n    chart: {{ template \"mariadb.chart\" . }}\n    release: {{ .Release.Name | quote }}\n    heritage: {{ .Release.Service | quote }}\n{{- if .Values.metrics.enabled }}\n  annotations:\n{{ toYaml .Values.metrics.annotations | indent 4 }}\n{{- end }}\nspec:\n  type: {{ .Values.service.type }}\n  {{- if eq .Values.service.type \"ClusterIP\" }}\n  {{- if .Values.service.clusterIp }}\n  clusterIP: {{ .Values.service.clusterIp }}\n  {{- end }}\n  {{- end }}\n  ports:\n  - name: mysql\n    port: {{ .Values.service.port }}\n    targetPort: mysql\n{{- if eq .Values.service.type \"NodePort\" }}\n{{- if .Values.service.nodePort }}\n{{- if .Values.service.nodePort.master }}\n    nodePort: {{ .Values.service.nodePort.master }}\n{{- end }}\n{{- end }}\n{{- end }}\n{{- if .Values.metrics.enabled }}\n  - name: metrics\n    port: 9104\n    targetPort: metrics\n{{- end }}\n  selector:\n    app: \"{{ template \"mariadb.name\" . }}\"\n    component: \"master\"\n    release: \"{{ .Release.Name }}\"\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/secrets.yaml",
    "content": "{{- if (not .Values.existingSecret) -}}\napiVersion: v1\nkind: Secret\nmetadata:\n  name: {{ template \"mariadb.fullname\" . }}\n  labels:\n    app: \"{{ template \"mariadb.name\" . }}\"\n    chart: {{ template \"mariadb.chart\" . }}\n    release: {{ .Release.Name | quote }}\n    heritage: {{ .Release.Service | quote }}\ntype: Opaque\ndata:\n  {{- if .Values.rootUser.password }}\n  mariadb-root-password: \"{{ .Values.rootUser.password | b64enc }}\"\n  {{- else if (not .Values.rootUser.forcePassword) }}\n  mariadb-root-password: \"{{ randAlphaNum 10 | b64enc }}\"\n  {{ else }}\n  mariadb-root-password: {{ required \"A MariaDB Root Password is required!\" .Values.rootUser.password }}\n  {{- end }}\n  {{- if .Values.db.user }}\n  {{- if .Values.db.password }}\n  mariadb-password: \"{{ .Values.db.password | b64enc }}\"\n  {{- else if (not .Values.db.forcePassword) }}\n  mariadb-password: \"{{ randAlphaNum 10 | b64enc }}\"\n  {{- else }}\n  mariadb-password: {{ required \"A MariaDB Database Password is required!\" .Values.db.password }}\n  {{- end }}\n  {{- end }}\n  {{- if .Values.replication.enabled }}\n  {{- if .Values.replication.password }}\n  mariadb-replication-password: \"{{ .Values.replication.password | b64enc }}\"\n  {{- else if (not .Values.replication.forcePassword) }}\n  mariadb-replication-password: \"{{ randAlphaNum 10 | b64enc }}\"\n  {{- else }}\n  mariadb-replication-password: {{ required \"A MariaDB Replication Password is required!\" .Values.replication.password }}\n  {{- end }}\n  {{- end }}\n{{- end }}"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/slave-configmap.yaml",
    "content": "{{- if and .Values.replication.enabled .Values.slave.config }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"slave.fullname\" . }}\n  labels:\n    app: {{ template \"mariadb.name\" . }}\n    component: \"slave\"\n    chart: {{ template \"mariadb.chart\" . }}\n    release: {{ .Release.Name | quote }}\n    heritage: {{ .Release.Service | quote }}\ndata:\n  my.cnf: |-\n{{ .Values.slave.config | indent 4 }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/slave-statefulset.yaml",
    "content": "{{- if .Values.replication.enabled }}\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ template \"slave.fullname\" . }}\n  labels:\n    app: \"{{ template \"mariadb.name\" . }}\"\n    chart: {{ template \"mariadb.chart\" . }}\n    component: \"slave\"\n    release: {{ .Release.Name | quote }}\n    heritage: {{ .Release.Service | quote }}\nspec:\n  selector:\n    matchLabels:\n      release: \"{{ .Release.Name }}\"\n      component: \"slave\"\n      app: {{ template \"mariadb.name\" . }}\n  serviceName: \"{{ template \"slave.fullname\" . }}\"\n  replicas: {{ .Values.slave.replicas }}\n  updateStrategy:\n    type: RollingUpdate\n  template:\n    metadata:\n      {{- if .Values.slave.annotations }}\n      annotations:\n        {{- range .Values.slave.annotations }}\n        {{ .key }}: '{{ .value }}'\n        {{- end }}\n      {{- end }}\n      labels:\n        app: \"{{ template \"mariadb.name\" . }}\"\n        component: \"slave\"\n        release: \"{{ .Release.Name }}\"\n        chart: {{ template \"mariadb.chart\" . }}\n    spec:\n      serviceAccountName: \"{{ template \"mariadb.serviceAccountName\" . }}\"\n      {{- if .Values.securityContext.enabled }}\n      securityContext:\n        fsGroup: {{ .Values.securityContext.fsGroup }}\n        runAsUser: {{ .Values.securityContext.runAsUser }}\n      {{- end }}\n      {{- if eq .Values.slave.antiAffinity \"hard\" }}\n      affinity:\n      {{- with .Values.slave.affinity  }}\n{{ toYaml . | indent 8 }}\n      {{- end }}\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - topologyKey: \"kubernetes.io/hostname\"\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"mariadb.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n      {{- else if eq .Values.slave.antiAffinity \"soft\" }}\n      affinity:\n      {{- with .Values.slave.affinity  }}\n{{ toYaml . | indent 8 }}\n      {{- end }}\n        podAntiAffinity:\n          preferredDuringSchedulingIgnoredDuringExecution:\n          - weight: 1\n            podAffinityTerm:\n              topologyKey: kubernetes.io/hostname\n              labelSelector:\n                matchLabels:\n                  app: \"{{ template \"mariadb.name\" . }}\"\n                  release: \"{{ .Release.Name }}\"\n      {{- else}}\n      {{- with .Values.slave.affinity }}\n      affinity:\n{{ toYaml . | indent 8 }}\n      {{- end }}\n      {{- end }}\n      {{- with .Values.slave.tolerations }}\n      tolerations:\n{{ toYaml . | indent 8 }}\n      {{- end }}\n      {{- if .Values.image.pullSecrets }}\n      imagePullSecrets:\n      {{- range .Values.image.pullSecrets }}\n        - name: {{ . }}\n      {{- end}}\n      {{- end }}\n      {{- if .Values.master.extraInitContainers }}\n      initContainers:\n{{ tpl .Values.master.extraInitContainers . | indent 6}}\n      {{- end }}\n      containers:\n      - name: \"mariadb\"\n        image: {{ template \"mariadb.image\" . }}\n        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}\n        env:\n        {{- if .Values.image.debug}}\n        - name: BITNAMI_DEBUG\n          value: \"true\"\n        {{- end }}\n        - name: MARIADB_REPLICATION_MODE\n          value: \"slave\"\n        - name: MARIADB_MASTER_HOST\n          value: {{ template \"mariadb.fullname\" . }}\n        - name: MARIADB_MASTER_PORT_NUMBER\n          value: \"3306\"\n        - name: MARIADB_MASTER_ROOT_USER\n          value: \"root\"\n        - name: MARIADB_MASTER_ROOT_PASSWORD\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"mariadb.fullname\" . }}\n            {{- end }}\n              key: mariadb-root-password\n        - name: MARIADB_REPLICATION_USER\n          value: \"{{ .Values.replication.user }}\"\n        - name: MARIADB_REPLICATION_PASSWORD\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"mariadb.fullname\" . }}\n            {{- end }}\n              key: mariadb-replication-password\n        ports:\n        - name: mysql\n          containerPort: 3306\n        {{- if .Values.slave.livenessProbe.enabled }}\n        livenessProbe:\n          exec:\n            command: [\"sh\", \"-c\", \"exec mysqladmin status -uroot -p$MARIADB_MASTER_ROOT_PASSWORD\"]\n          initialDelaySeconds: {{ .Values.slave.livenessProbe.initialDelaySeconds }}\n          periodSeconds: {{ .Values.slave.livenessProbe.periodSeconds }}\n          timeoutSeconds: {{ .Values.slave.livenessProbe.timeoutSeconds }}\n          successThreshold: {{ .Values.slave.livenessProbe.successThreshold }}\n          failureThreshold: {{ .Values.slave.livenessProbe.failureThreshold }}\n        {{- end }}\n        {{- if .Values.slave.readinessProbe.enabled }}\n        readinessProbe:\n          exec:\n            command: [\"sh\", \"-c\", \"exec mysqladmin status -uroot -p$MARIADB_MASTER_ROOT_PASSWORD\"]\n          initialDelaySeconds: {{ .Values.slave.readinessProbe.initialDelaySeconds }}\n          periodSeconds: {{ .Values.slave.readinessProbe.periodSeconds }}\n          timeoutSeconds: {{ .Values.slave.readinessProbe.timeoutSeconds }}\n          successThreshold: {{ .Values.slave.readinessProbe.successThreshold }}\n          failureThreshold: {{ .Values.slave.readinessProbe.failureThreshold }}\n        {{- end }}\n        resources:\n{{ toYaml .Values.slave.resources | indent 10 }}\n        volumeMounts:\n        - name: data\n          mountPath: /bitnami/mariadb\n{{- if .Values.slave.config }}\n        - name: config\n          mountPath: /opt/bitnami/mariadb/conf/my.cnf\n          subPath: my.cnf\n{{- end }}\n{{- if .Values.metrics.enabled }}\n      - name: metrics\n        image: {{ template \"metrics.image\" . }}\n        imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}\n        env:\n        - name: MARIADB_MASTER_ROOT_PASSWORD\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"mariadb.fullname\" . }}\n            {{- end }}\n              key: mariadb-root-password\n        command: [ 'sh', '-c', 'DATA_SOURCE_NAME=\"root:$MARIADB_MASTER_ROOT_PASSWORD@(localhost:3306)/\" /bin/mysqld_exporter' ]\n        ports:\n        - name: metrics\n          containerPort: 9104\n        livenessProbe:\n          httpGet:\n            path: /metrics\n            port: metrics\n          initialDelaySeconds: 15\n          timeoutSeconds: 5\n        readinessProbe:\n          httpGet:\n            path: /metrics\n            port: metrics\n          initialDelaySeconds: 5\n          timeoutSeconds: 1\n        resources:\n{{ toYaml .Values.metrics.resources | indent 10 }}\n{{- end }}\n      volumes:\n      {{- if .Values.slave.config }}\n        - name: config\n          configMap:\n            name: {{ template \"slave.fullname\" . }}\n      {{- end }}\n{{- if .Values.slave.persistence.enabled }}\n  volumeClaimTemplates:\n    - metadata:\n        name: data\n        labels:\n          app: \"{{ template \"mariadb.name\" . }}\"\n          component: \"slave\"\n          release: {{ .Release.Name | quote }}\n          heritage: {{ .Release.Service | quote }}\n      spec:\n        accessModes:\n        {{- range .Values.slave.persistence.accessModes }}\n          - {{ . | quote }}\n        {{- end }}\n        resources:\n          requests:\n            storage: {{ .Values.slave.persistence.size | quote }}\n      {{- if .Values.slave.persistence.storageClass }}\n      {{- if (eq \"-\" .Values.slave.persistence.storageClass) }}\n        storageClassName: \"\"\n      {{- else }}\n        storageClassName: {{ .Values.slave.persistence.storageClass | quote }}\n      {{- end }}\n      {{- end }}\n{{- else }}\n        - name: \"data\"\n          emptyDir: {}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/slave-svc.yaml",
    "content": "{{- if .Values.replication.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ template \"slave.fullname\" . }}\n  labels:\n    app: \"{{ template \"mariadb.name\" . }}\"\n    chart: {{ template \"mariadb.chart\" . }}\n    component: \"slave\"\n    release: {{ .Release.Name | quote }}\n    heritage: {{ .Release.Service | quote }}\n{{- if .Values.metrics.enabled }}\n  annotations:\n{{ toYaml .Values.metrics.annotations | indent 4 }}\n{{- end }}\nspec:\n  type: {{ .Values.service.type }}\n  {{- if eq .Values.service.type \"ClusterIP\" }}\n  {{- if .Values.service.clusterIp }}\n  clusterIP: {{ .Values.service.clusterIp }}\n  {{- end }}\n  {{- end }}\n  ports:\n  - name: mysql\n    port: {{ .Values.service.port }}\n    targetPort: mysql\n{{- if (eq .Values.service.type \"NodePort\") }}\n{{- if .Values.service.nodePort }}\n{{- if .Values.service.nodePort.slave }}\n    nodePort: {{ .Values.service.nodePort.slave }}\n{{- end }}\n{{- end }}\n{{- end }}\n{{- if .Values.metrics.enabled }}\n  - name: metrics\n    port: 9104\n    targetPort: metrics\n{{- end }}\n  selector:\n    app: \"{{ template \"mariadb.name\" . }}\"\n    component: \"slave\"\n    release: \"{{ .Release.Name }}\"\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/test-runner.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ template \"mariadb.fullname\" . }}-test-{{ randAlphaNum 5 | lower }}\"\n  annotations:\n    \"helm.sh/hook\": test-success\nspec:\n  initContainers:\n    - name: \"test-framework\"\n      image: \"dduportal/bats:0.4.0\"\n      command:\n        - \"bash\"\n        - \"-c\"\n        - |\n          set -ex\n          # copy bats to tools dir\n          cp -R /usr/local/libexec/ /tools/bats/\n      volumeMounts:\n      - mountPath: /tools\n        name: tools\n  containers:\n    - name: mariadb-test\n      image: {{ template \"mariadb.image\" . }}\n      imagePullPolicy: {{ .Values.image.pullPolicy | quote }}\n      command: [\"/tools/bats/bats\", \"-t\", \"/tests/run.sh\"]\n      env:\n        - name: MARIADB_ROOT_PASSWORD\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"mariadb.fullname\" . }}\n            {{- end }}\n              key: mariadb-root-password\n      volumeMounts:\n      - mountPath: /tests\n        name: tests\n        readOnly: true\n      - mountPath: /tools\n        name: tools\n  volumes:\n  - name: tests\n    configMap:\n      name: {{ template \"mariadb.fullname\" . }}-tests\n  - name: tools\n    emptyDir: {}\n  restartPolicy: Never\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/templates/tests.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"mariadb.fullname\" . }}-tests\ndata:\n  run.sh: |-\n    @test \"Testing MariaDB is accessible\" {\n      mysql -h {{ template \"mariadb.fullname\" . }} -uroot -p$MARIADB_ROOT_PASSWORD -e 'show databases;'\n    }\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/values-production.yaml",
    "content": "## Global Docker image registry\n## Please, note that this will override the image registry for all the images, including dependencies, configured to use the global value\n##\n# global:\n#   imageRegistry:\n\n## Bitnami MariaDB image\n## ref: https://hub.docker.com/r/bitnami/mariadb/tags/\n##\nimage:\n  registry: docker.io\n  repository: bitnami/mariadb\n  tag: 10.1.37\n  ## Specify a imagePullPolicy\n  ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n  ##\n  pullPolicy: IfNotPresent\n  ## Optionally specify an array of imagePullSecrets.\n  ## Secrets must be manually created in the namespace.\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n  ##\n  # pullSecrets:\n  #   - myRegistrKeySecretName\n\n  ## Set to true if you would like to see extra information on logs\n  ## It turns BASH and NAMI debugging in minideb\n  ## ref:  https://github.com/bitnami/minideb-extras/#turn-on-bash-debugging\n  debug: false\n\nservice:\n  ## Kubernetes service type, ClusterIP and NodePort are supported at present\n  type: ClusterIP\n  # clusterIp: None\n  port: 3306\n  ## Specify the nodePort value for the LoadBalancer and NodePort service types.\n  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n  ##\n  # nodePort:\n  #   master: 30001\n  #   slave: 30002\n\n## Pods Service Account\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\nserviceAccount:\n  ## Specifies whether a ServiceAccount should be created\n  ##\n  create: false\n  ## The name of the ServiceAccount to use.\n  ## If not set and create is true, a name is generated using the mariadb.fullname template\n  # name:\n\n## Pod Security Context\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n##\nsecurityContext:\n  enabled: true\n  fsGroup: 1001\n  runAsUser: 1001\n\n# # Use existing secret (ignores root, db and replication passwords)\n# existingSecret:\n\nrootUser:\n  ## MariaDB admin password\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#setting-the-root-password-on-first-run\n  ##\n  password:\n  ##\n  ## Option to force users to specify a password. That is required for 'helm upgrade' to work properly.\n  ## If it is not force, a random password will be generated.\n  forcePassword: true\n\ndb:\n  ## MariaDB username and password\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#creating-a-database-user-on-first-run\n  ##\n  user:\n  password:\n  ## Password is ignored if existingSecret is specified.\n  ## Database to create\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#creating-a-database-on-first-run\n  ##\n  name: my_database\n  ## Option to force users to specify a password. That is required for 'helm upgrade' to work properly.\n  ## If it is not force, a random password will be generated.\n  forcePassword: true\n\nreplication:\n  ## Enable replication. This enables the creation of replicas of MariaDB. If false, only a\n  ## master deployment would be created\n  enabled: true\n  ##\n  ## MariaDB replication user\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#setting-up-a-replication-cluster\n  ##\n  user: replicator\n  ## MariaDB replication user password\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#setting-up-a-replication-cluster\n  ##\n  password:\n  ## Password is ignored if existingSecret is specified.\n  ##\n  ## Option to force users to specify a password. That is required for 'helm upgrade' to work properly.\n  ## If it is not force, a random password will be generated.\n  forcePassword: true\n\n## initdb scripts\n## Specify dictionnary of scripts to be run at first boot\n## Alternatively, you can put your scripts under the files/docker-entrypoint-initdb.d directory\n##\n# initdbScripts:\n#   my_init_script.sh: |\n#      #!/bin/sh\n#      echo \"Do something.\"\n#\n## ConfigMap with scripts to be run at first boot\n## Note: This will override initdbScripts\n# initdbScriptsConfigMap:\n\nmaster:\n  ## Mariadb Master additional pod annotations\n  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/\n  # annotations:\n  #   - key: key1\n  #     value: value1\n\n  ## Affinity for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ##\n  affinity: {}\n\n  ## Kept for backwards compatibility. You can now disable it by removing it.\n  ## if you wish to set it through master.affinity.podAntiAffinity instead.\n  ##\n  antiAffinity: soft\n\n  ## Tolerations for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n\n  ## Enable persistence using Persistent Volume Claims\n  ## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/\n  ##\n  persistence:\n    ## If true, use a Persistent Volume Claim, If false, use emptyDir\n    ##\n    enabled: true\n    # Enable persistence using an existing PVC\n    # existingClaim:\n    mountPath: /bitnami/mariadb\n    ## Persistent Volume Storage Class\n    ## If defined, storageClassName: <storageClass>\n    ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n    ## If undefined (the default) or set to null, no storageClassName spec is\n    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on\n    ##   GKE, AWS & OpenStack)\n    ##\n    # storageClass: \"-\"\n    ## Persistent Volume Claim annotations\n    ##\n    annotations: {}\n    ## Persistent Volume Access Mode\n    ##\n    accessModes:\n    - ReadWriteOnce\n    ## Persistent Volume size\n    ##\n    size: 8Gi\n    ##\n  extraInitContainers: |\n  # - name: do-something\n  #   image: busybox\n  #   command: ['do', 'something']\n\n  ## Configure MySQL with a custom my.cnf file\n  ## ref: https://mysql.com/kb/en/mysql/configuring-mysql-with-mycnf/#example-of-configuration-file\n  ##\n  config: |-\n    [mysqld]\n    skip-name-resolve\n    explicit_defaults_for_timestamp\n    basedir=/opt/bitnami/mariadb\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    tmpdir=/opt/bitnami/mariadb/tmp\n    max_allowed_packet=16M\n    bind-address=0.0.0.0\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n    log-error=/opt/bitnami/mariadb/logs/mysqld.log\n    character-set-server=UTF8\n    collation-server=utf8_general_ci\n\n    [client]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    default-character-set=UTF8\n\n    [manager]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n\n  ## Configure master resource requests and limits\n  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n  ##\n  resources: {}\n  livenessProbe:\n    enabled: true\n    ##\n    ## Initializing the database could take some time\n    initialDelaySeconds: 120\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 15\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n\nslave:\n  replicas: 2\n\n\n  ## Mariadb Slave additional pod annotations\n  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/\n  # annotations:\n  #   - key: key1\n  #     value: value1\n\n  ## Affinity for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ##\n  affinity: {}\n\n  ## Kept for backwards compatibility. You can now disable it by removing it.\n  ## if you wish to set it through slave.affinity.podAntiAffinity instead.\n  ##\n  antiAffinity: soft\n\n  ## Tolerations for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n\n  persistence:\n    ## If true, use a Persistent Volume Claim, If false, use emptyDir\n    ##\n    enabled: true\n    # storageClass: \"-\"\n    annotations:\n    accessModes:\n    - ReadWriteOnce\n    ## Persistent Volume size\n    ##\n    size: 8Gi\n    ##\n  extraInitContainers: |\n  # - name: do-something\n  #   image: busybox\n  #   command: ['do', 'something']\n\n  ## Configure MySQL slave with a custom my.cnf file\n  ## ref: https://mysql.com/kb/en/mysql/configuring-mysql-with-mycnf/#example-of-configuration-file\n  ##\n  config: |-\n    [mysqld]\n    skip-name-resolve\n    explicit_defaults_for_timestamp\n    basedir=/opt/bitnami/mariadb\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    tmpdir=/opt/bitnami/mariadb/tmp\n    max_allowed_packet=16M\n    bind-address=0.0.0.0\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n    log-error=/opt/bitnami/mariadb/logs/mysqld.log\n    character-set-server=UTF8\n    collation-server=utf8_general_ci\n\n    [client]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    default-character-set=UTF8\n\n    [manager]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n\n  ##\n  ## Configure slave resource requests and limits\n  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n  ##\n  resources: {}\n  livenessProbe:\n    enabled: true\n    ##\n    ## Initializing the database could take some time\n    initialDelaySeconds: 120\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 15\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n\nmetrics:\n  enabled: true\n  image:\n    registry: docker.io\n    repository: prom/mysqld-exporter\n    tag: v0.10.0\n    pullPolicy: IfNotPresent\n  resources: {}\n  annotations:\n    prometheus.io/scrape: \"true\"\n    prometheus.io/port: \"9104\"\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/mariadb/values.yaml",
    "content": "## Global Docker image registry\n## Please, note that this will override the image registry for all the images, including dependencies, configured to use the global value\n##\n# global:\n#   imageRegistry:\n\n## Bitnami MariaDB image\n## ref: https://hub.docker.com/r/bitnami/mariadb/tags/\n##\nimage:\n  registry: docker.io\n  repository: bitnami/mariadb\n  tag: 10.1.37\n  ## Specify a imagePullPolicy\n  ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n  ##\n  pullPolicy: IfNotPresent\n  ## Optionally specify an array of imagePullSecrets.\n  ## Secrets must be manually created in the namespace.\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n  ##\n  # pullSecrets:\n  #   - myRegistrKeySecretName\n\n  ## Set to true if you would like to see extra information on logs\n  ## It turns BASH and NAMI debugging in minideb\n  ## ref:  https://github.com/bitnami/minideb-extras/#turn-on-bash-debugging\n  debug: false\n\nservice:\n  ## Kubernetes service type, ClusterIP and NodePort are supported at present\n  type: ClusterIP\n  # clusterIp: None\n  port: 3306\n  ## Specify the nodePort value for the LoadBalancer and NodePort service types.\n  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n  ##\n  # nodePort:\n  #   master: 30001\n  #   slave: 30002\n\n## Pods Service Account\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\nserviceAccount:\n  ## Specifies whether a ServiceAccount should be created\n  ##\n  create: false\n  ## The name of the ServiceAccount to use.\n  ## If not set and create is true, a name is generated using the mariadb.fullname template\n  # name:\n\n## Pod Security Context\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n##\nsecurityContext:\n  enabled: true\n  fsGroup: 1001\n  runAsUser: 1001\n\n# # Use existing secret (ignores root, db and replication passwords)\n# existingSecret:\n\nrootUser:\n  ## MariaDB admin password\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#setting-the-root-password-on-first-run\n  ##\n  password:\n  ##\n  ## Option to force users to specify a password. That is required for 'helm upgrade' to work properly.\n  ## If it is not force, a random password will be generated.\n  forcePassword: false\n\ndb:\n  ## MariaDB username and password\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#creating-a-database-user-on-first-run\n  ##\n  user:\n  password:\n  ## Password is ignored if existingSecret is specified.\n  ## Database to create\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#creating-a-database-on-first-run\n  ##\n  name: my_database\n  ## Option to force users to specify a password. That is required for 'helm upgrade' to work properly.\n  ## If it is not force, a random password will be generated.\n  forcePassword: false\n\nreplication:\n  ## Enable replication. This enables the creation of replicas of MariaDB. If false, only a\n  ## master deployment would be created\n  enabled: true\n  ##\n  ## MariaDB replication user\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#setting-up-a-replication-cluster\n  ##\n  user: replicator\n  ## MariaDB replication user password\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#setting-up-a-replication-cluster\n  ##\n  password:\n  ## Password is ignored if existingSecret is specified.\n  ##\n  ## Option to force users to specify a password. That is required for 'helm upgrade' to work properly.\n  ## If it is not force, a random password will be generated.\n  forcePassword: false\n\n## initdb scripts\n## Specify dictionnary of scripts to be run at first boot\n## Alternatively, you can put your scripts under the files/docker-entrypoint-initdb.d directory\n##\n# initdbScripts:\n#   my_init_script.sh: |\n#      #!/bin/sh\n#      echo \"Do something.\"\n#\n## ConfigMap with scripts to be run at first boot\n## Note: This will override initdbScripts\n# initdbScriptsConfigMap:\n\nmaster:\n  ## Mariadb Master additional pod annotations\n  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/\n  # annotations:\n  #   - key: key1\n  #     value: value1\n\n  ## Affinity for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ##\n  affinity: {}\n\n  ## Kept for backwards compatibility. You can now disable it by removing it.\n  ## if you wish to set it through master.affinity.podAntiAffinity instead.\n  ##\n  antiAffinity: soft\n\n  ## Tolerations for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n\n  ## Enable persistence using Persistent Volume Claims\n  ## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/\n  ##\n  persistence:\n    ## If true, use a Persistent Volume Claim, If false, use emptyDir\n    ##\n    enabled: true\n    # Enable persistence using an existing PVC\n    # existingClaim:\n    mountPath: /bitnami/mariadb\n    ## Persistent Volume Storage Class\n    ## If defined, storageClassName: <storageClass>\n    ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n    ## If undefined (the default) or set to null, no storageClassName spec is\n    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on\n    ##   GKE, AWS & OpenStack)\n    ##\n    # storageClass: \"-\"\n    ## Persistent Volume Claim annotations\n    ##\n    annotations: {}\n    ## Persistent Volume Access Mode\n    ##\n    accessModes:\n    - ReadWriteOnce\n    ## Persistent Volume size\n    ##\n    size: 8Gi\n    ##\n  extraInitContainers: |\n  # - name: do-something\n  #   image: busybox\n  #   command: ['do', 'something']\n\n  ## Configure MySQL with a custom my.cnf file\n  ## ref: https://mysql.com/kb/en/mysql/configuring-mysql-with-mycnf/#example-of-configuration-file\n  ##\n  config: |-\n    [mysqld]\n    skip-name-resolve\n    explicit_defaults_for_timestamp\n    basedir=/opt/bitnami/mariadb\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    tmpdir=/opt/bitnami/mariadb/tmp\n    max_allowed_packet=16M\n    bind-address=0.0.0.0\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n    log-error=/opt/bitnami/mariadb/logs/mysqld.log\n    character-set-server=UTF8\n    collation-server=utf8_general_ci\n\n    [client]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    default-character-set=UTF8\n\n    [manager]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n\n  ## Configure master resource requests and limits\n  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n  ##\n  resources: {}\n  livenessProbe:\n    enabled: true\n    ##\n    ## Initializing the database could take some time\n    initialDelaySeconds: 120\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 30\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n\nslave:\n  replicas: 1\n\n  ## Mariadb Slave additional pod annotations\n  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/\n  # annotations:\n  #   - key: key1\n  #     value: value1\n\n  ## Affinity for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ##\n  affinity: {}\n\n  ## Kept for backwards compatibility. You can now disable it by removing it.\n  ## if you wish to set it through slave.affinity.podAntiAffinity instead.\n  ##\n  antiAffinity: soft\n\n  ## Tolerations for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n\n  persistence:\n    ## If true, use a Persistent Volume Claim, If false, use emptyDir\n    ##\n    enabled: true\n    # storageClass: \"-\"\n    annotations:\n    accessModes:\n    - ReadWriteOnce\n    ## Persistent Volume size\n    ##\n    size: 8Gi\n    ##\n  extraInitContainers: |\n  # - name: do-something\n  #   image: busybox\n  #   command: ['do', 'something']\n\n  ## Configure MySQL slave with a custom my.cnf file\n  ## ref: https://mysql.com/kb/en/mysql/configuring-mysql-with-mycnf/#example-of-configuration-file\n  ##\n  config: |-\n    [mysqld]\n    skip-name-resolve\n    explicit_defaults_for_timestamp\n    basedir=/opt/bitnami/mariadb\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    tmpdir=/opt/bitnami/mariadb/tmp\n    max_allowed_packet=16M\n    bind-address=0.0.0.0\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n    log-error=/opt/bitnami/mariadb/logs/mysqld.log\n    character-set-server=UTF8\n    collation-server=utf8_general_ci\n\n    [client]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    default-character-set=UTF8\n\n    [manager]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n\n  ##\n  ## Configure slave resource requests and limits\n  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n  ##\n  resources: {}\n  livenessProbe:\n    enabled: true\n    ##\n    ## Initializing the database could take some time\n    initialDelaySeconds: 120\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 45\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n\nmetrics:\n  enabled: false\n  image:\n    registry: docker.io\n    repository: prom/mysqld-exporter\n    tag: v0.10.0\n    pullPolicy: IfNotPresent\n  resources: {}\n  annotations:\n    prometheus.io/scrape: \"true\"\n    prometheus.io/port: \"9104\"\n"
  },
  {
    "path": "manifests/deprecated/mariadb-cluster/my-values.yaml",
    "content": "## Global Docker image registry\n## Please, note that this will override the image registry for all the images, including dependencies, configured to use the global value\n##\n# global:\n#   imageRegistry:\n\n## Bitnami MariaDB image\n## ref: https://hub.docker.com/r/bitnami/mariadb/tags/\n##\nimage:\n  registry: docker.io\n  repository: bitnami/mariadb\n  tag: 10.1.37\n  ## Specify a imagePullPolicy\n  ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n  ##\n  pullPolicy: IfNotPresent\n  ## Optionally specify an array of imagePullSecrets.\n  ## Secrets must be manually created in the namespace.\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n  ##\n  # pullSecrets:\n  #   - myRegistrKeySecretName\n\n  ## Set to true if you would like to see extra information on logs\n  ## It turns BASH and NAMI debugging in minideb\n  ## ref:  https://github.com/bitnami/minideb-extras/#turn-on-bash-debugging\n  debug: false\n\nservice:\n  ## Kubernetes service type, ClusterIP and NodePort are supported at present\n  type: NodePort\n  # clusterIp: None\n  port: 3306\n  ## Specify the nodePort value for the LoadBalancer and NodePort service types.\n  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n  ##\n  nodePort:\n    master: 33306\n    slave: 33307\n\n## Pods Service Account\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\nserviceAccount:\n  ## Specifies whether a ServiceAccount should be created\n  ##\n  create: false\n  ## The name of the ServiceAccount to use.\n  ## If not set and create is true, a name is generated using the mariadb.fullname template\n  # name:\n\n## Pod Security Context\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n##\nsecurityContext:\n  enabled: true\n  fsGroup: 1001\n  runAsUser: 1001\n\n# # Use existing secret (ignores root, db and replication passwords)\n# existingSecret:\n\nrootUser:\n  ## MariaDB admin password\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#setting-the-root-password-on-first-run\n  ##\n  password: test.c0m\n  ##\n  ## Option to force users to specify a password. That is required for 'helm upgrade' to work properly.\n  ## If it is not force, a random password will be generated.\n  forcePassword: true\n\ndb:\n  ## MariaDB username and password\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#creating-a-database-user-on-first-run\n  ##\n  user: hello\n  password: hello\n  ## Password is ignored if existingSecret is specified.\n  ## Database to create\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#creating-a-database-on-first-run\n  ##\n  name: hello\n  ## Option to force users to specify a password. That is required for 'helm upgrade' to work properly.\n  ## If it is not force, a random password will be generated.\n  forcePassword: true\n\nreplication:\n  ## Enable replication. This enables the creation of replicas of MariaDB. If false, only a\n  ## master deployment would be created\n  enabled: true\n  ##\n  ## MariaDB replication user\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#setting-up-a-replication-cluster\n  ##\n  user: replicator\n  ## MariaDB replication user password\n  ## ref: https://github.com/bitnami/bitnami-docker-mariadb#setting-up-a-replication-cluster\n  ##\n  password: R4%forep11CAT0r\n  ## Password is ignored if existingSecret is specified.\n  ##\n  ## Option to force users to specify a password. That is required for 'helm upgrade' to work properly.\n  ## If it is not force, a random password will be generated.\n  forcePassword: true\n\n## initdb scripts\n## Specify dictionnary of scripts to be run at first boot\n## Alternatively, you can put your scripts under the files/docker-entrypoint-initdb.d directory\n##\n# initdbScripts:\n#   my_init_script.sh: |\n#      #!/bin/sh\n#      echo \"Do something.\"\n#\n## ConfigMap with scripts to be run at first boot\n## Note: This will override initdbScripts\n# initdbScriptsConfigMap:\n\nmaster:\n  ## Mariadb Master additional pod annotations\n  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/\n  # annotations:\n  #   - key: key1\n  #     value: value1\n\n  ## Affinity for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ##\n  affinity: {}\n\n  ## Kept for backwards compatibility. You can now disable it by removing it.\n  ## if you wish to set it through master.affinity.podAntiAffinity instead.\n  ##\n  antiAffinity: soft\n\n  ## Tolerations for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n\n  ## Enable persistence using Persistent Volume Claims\n  ## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/\n  ##\n  persistence:\n    ## If true, use a Persistent Volume Claim, If false, use emptyDir\n    ##\n    enabled: true\n    # Enable persistence using an existing PVC\n    # existingClaim:\n    mountPath: /bitnami/mariadb\n    ## Persistent Volume Storage Class\n    ## If defined, storageClassName: <storageClass>\n    ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n    ## If undefined (the default) or set to null, no storageClassName spec is\n    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on\n    ##   GKE, AWS & OpenStack)\n    ##\n    storageClass: \"nfs-db\"\n    ## Persistent Volume Claim annotations\n    ##\n    annotations: {}\n    ## Persistent Volume Access Mode\n    ##\n    accessModes:\n    - ReadWriteOnce\n    ## Persistent Volume size\n    ##\n    size: 5Gi\n    ##\n  extraInitContainers: |\n  # - name: do-something\n  #   image: busybox\n  #   command: ['do', 'something']\n\n  ## Configure MySQL with a custom my.cnf file\n  ## ref: https://mysql.com/kb/en/mysql/configuring-mysql-with-mycnf/#example-of-configuration-file\n  ##\n  config: |-\n    [mysqld]\n    skip-name-resolve\n    explicit_defaults_for_timestamp\n    basedir=/opt/bitnami/mariadb\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    tmpdir=/opt/bitnami/mariadb/tmp\n    bind-address=0.0.0.0\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n    log-error=/opt/bitnami/mariadb/logs/mysqld.log\n    character-set-server=UTF8\n    collation-server=utf8_general_ci\n    # optimize\n    max_allowed_packet = 1024M\n    table_open_cache = 512\n    sort_buffer_size = 2M\n    read_buffer_size = 2M\n    read_rnd_buffer_size = 8M\n    thread_cache_size = 8\n    query_cache_size = 32M\n    max_heap_table_size=1024M\n    tmp_table_size=1024M\n    max_connections=65535\n    max_connect_errors=65535\n    wait_timeout=172800\n    interactive_timeout=172800\n    connect_timeout=30\n    # log settings\n    expire_logs_days=3\n\n    [client]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    default-character-set=UTF8\n\n    [manager]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n\n  ## Configure master resource requests and limits\n  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n  ##\n  resources: {}\n  livenessProbe:\n    enabled: true\n    ##\n    ## Initializing the database could take some time\n    initialDelaySeconds: 120\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 15\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n\nslave:\n  replicas: 1 \n\n\n  ## Mariadb Slave additional pod annotations\n  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/\n  # annotations:\n  #   - key: key1\n  #     value: value1\n\n  ## Affinity for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ##\n  affinity: {}\n\n  ## Kept for backwards compatibility. You can now disable it by removing it.\n  ## if you wish to set it through slave.affinity.podAntiAffinity instead.\n  ##\n  antiAffinity: soft\n\n  ## Tolerations for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n\n  persistence:\n    ## If true, use a Persistent Volume Claim, If false, use emptyDir\n    ##\n    enabled: false\n    # storageClass: \"-\"\n    annotations:\n    accessModes:\n    - ReadWriteOnce\n    ## Persistent Volume size\n    ##\n    size: 5Gi\n    ##\n  extraInitContainers: |\n  # - name: do-something\n  #   image: busybox\n  #   command: ['do', 'something']\n\n  ## Configure MySQL slave with a custom my.cnf file\n  ## ref: https://mysql.com/kb/en/mysql/configuring-mysql-with-mycnf/#example-of-configuration-file\n  ##\n  config: |-\n    [mysqld]\n    skip-name-resolve\n    explicit_defaults_for_timestamp\n    basedir=/opt/bitnami/mariadb\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    tmpdir=/opt/bitnami/mariadb/tmp\n    bind-address=0.0.0.0\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n    log-error=/opt/bitnami/mariadb/logs/mysqld.log\n    character-set-server=UTF8\n    collation-server=utf8_general_ci\n    # optimize\n    max_allowed_packet = 1024M\n    table_open_cache = 512\n    sort_buffer_size = 2M\n    read_buffer_size = 2M\n    read_rnd_buffer_size = 8M\n    thread_cache_size = 8\n    query_cache_size = 32M\n    max_heap_table_size=1024M\n    tmp_table_size=1024M\n    max_connections=65535\n    max_connect_errors=65535\n    wait_timeout=172800\n    interactive_timeout=172800\n    connect_timeout=30\n    # log settings\n    expire_logs_days=3\n\n    [client]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    default-character-set=UTF8\n\n    [manager]\n    port=3306\n    socket=/opt/bitnami/mariadb/tmp/mysql.sock\n    pid-file=/opt/bitnami/mariadb/tmp/mysqld.pid\n\n  ##\n  ## Configure slave resource requests and limits\n  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n  ##\n  resources: {}\n  livenessProbe:\n    enabled: true\n    ##\n    ## Initializing the database could take some time\n    initialDelaySeconds: 120\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 15\n    ##\n    ## Default Kubernetes values\n    periodSeconds: 10\n    timeoutSeconds: 1\n    successThreshold: 1\n    failureThreshold: 3\n\nmetrics:\n  enabled: false\n  image:\n    registry: docker.io\n    repository: prom/mysqld-exporter\n    tag: v0.10.0\n    pullPolicy: IfNotPresent\n  resources: {}\n  annotations:\n    prometheus.io/scrape: \"true\"\n    prometheus.io/port: \"9104\"\n"
  },
  {
    "path": "manifests/deprecated/mysql-cluster/mysql-configmap.yaml",
    "content": "# https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: mysql\n  labels:\n    app: mysql\n    app.kubernetes.io/name: mysql\ndata:\n  primary.cnf: |\n    # Apply this config only on the primary.\n    [mysqld]\n    log-bin\n  replica.cnf: |\n    # Apply this config only on replicas.\n    [mysqld]\n    super-read-only\n"
  },
  {
    "path": "manifests/deprecated/mysql-cluster/mysql-services.yaml",
    "content": "# https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/\n# Headless service for stable DNS entries of StatefulSet members.\napiVersion: v1\nkind: Service\nmetadata:\n  name: mysql\n  labels:\n    app: mysql\n    app.kubernetes.io/name: mysql\nspec:\n  ports:\n  - name: mysql\n    port: 3306\n  clusterIP: None\n  selector:\n    app: mysql\n---\n# Client service for connecting to any MySQL instance for reads.\n# For writes, you must instead connect to the primary: mysql-0.mysql.\napiVersion: v1\nkind: Service\nmetadata:\n  name: mysql-read\n  labels:\n    app: mysql\n    app.kubernetes.io/name: mysql\n    readonly: \"true\"\nspec:\n  ports:\n  - name: mysql\n    port: 3306\n  selector:\n    app: mysql\n"
  },
  {
    "path": "manifests/deprecated/mysql-cluster/mysql-statefulset.yaml",
    "content": "# https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: mysql\nspec:\n  selector:\n    matchLabels:\n      app: mysql\n      app.kubernetes.io/name: mysql\n  serviceName: mysql\n  replicas: 2\n  template:\n    metadata:\n      labels:\n        app: mysql\n        app.kubernetes.io/name: mysql\n    spec:\n      initContainers:\n      - name: init-mysql\n        image: mysql:5.7\n        command:\n        - bash\n        - \"-c\"\n        - |\n          set -ex\n          # Generate mysql server-id from pod ordinal index.\n          [[ $HOSTNAME =~ -([0-9]+)$ ]] || exit 1\n          ordinal=${BASH_REMATCH[1]}\n          echo [mysqld] > /mnt/conf.d/server-id.cnf\n          # Add an offset to avoid reserved server-id=0 value.\n          echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf\n          # Copy appropriate conf.d files from config-map to emptyDir.\n          if [[ $ordinal -eq 0 ]]; then\n            cp /mnt/config-map/primary.cnf /mnt/conf.d/\n          else\n            cp /mnt/config-map/replica.cnf /mnt/conf.d/\n          fi\n        volumeMounts:\n        - name: conf\n          mountPath: /mnt/conf.d\n        - name: config-map\n          mountPath: /mnt/config-map\n      - name: clone-mysql\n        #image: gcr.io/google-samples/xtrabackup:1.0\n        image: jmgao1983/xtrabackup:1.0\n        command:\n        - bash\n        - \"-c\"\n        - |\n          set -ex\n          # Skip the clone if data already exists.\n          [[ -d /var/lib/mysql/mysql ]] && exit 0\n          # Skip the clone on primary (ordinal index 0).\n          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1\n          ordinal=${BASH_REMATCH[1]}\n          [[ $ordinal -eq 0 ]] && exit 0\n          # Clone data from previous peer.\n          ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql\n          # Prepare the backup.\n          xtrabackup --prepare --target-dir=/var/lib/mysql\n        volumeMounts:\n        - name: data\n          mountPath: /var/lib/mysql\n          subPath: mysql\n        - name: conf\n          mountPath: /etc/mysql/conf.d\n      containers:\n      - name: mysql\n        image: mysql:5.7\n        env:\n        - name: MYSQL_ALLOW_EMPTY_PASSWORD\n          value: \"1\"\n        ports:\n        - name: mysql\n          containerPort: 3306\n        volumeMounts:\n        - name: data\n          mountPath: /var/lib/mysql\n          subPath: mysql\n        - name: conf\n          mountPath: /etc/mysql/conf.d\n        resources:\n          requests:\n            cpu: 500m\n            memory: 1Gi\n        livenessProbe:\n          exec:\n            command: [\"mysqladmin\", \"ping\"]\n          initialDelaySeconds: 30\n          periodSeconds: 10\n          timeoutSeconds: 5\n        readinessProbe:\n          exec:\n            # Check we can execute queries over TCP (skip-networking is off).\n            command: [\"mysql\", \"-h\", \"127.0.0.1\", \"-e\", \"SELECT 1\"]\n          initialDelaySeconds: 5\n          periodSeconds: 2\n          timeoutSeconds: 1\n      - name: xtrabackup\n        #image: gcr.io/google-samples/xtrabackup:1.0\n        image: jmgao1983/xtrabackup:1.0\n        ports:\n        - name: xtrabackup\n          containerPort: 3307\n        command:\n        - bash\n        - \"-c\"\n        - |\n          set -ex\n          cd /var/lib/mysql\n\n          # Determine binlog position of cloned data, if any.\n          if [[ -f xtrabackup_slave_info && \"x$(<xtrabackup_slave_info)\" != \"x\" ]]; then\n            # XtraBackup already generated a partial \"CHANGE MASTER TO\" query\n            # because we're cloning from an existing replica. (Need to remove the tailing semicolon!)\n            cat xtrabackup_slave_info | sed -E 's/;$//g' > change_master_to.sql.in\n            # Ignore xtrabackup_binlog_info in this case (it's useless).\n            rm -f xtrabackup_slave_info xtrabackup_binlog_info\n          elif [[ -f xtrabackup_binlog_info ]]; then\n            # We're cloning directly from primary. Parse binlog position.\n            [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1\n            rm -f xtrabackup_binlog_info xtrabackup_slave_info\n            echo \"CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\\\n                  MASTER_LOG_POS=${BASH_REMATCH[2]}\" > change_master_to.sql.in\n          fi\n\n          # Check if we need to complete a clone by starting replication.\n          if [[ -f change_master_to.sql.in ]]; then\n            echo \"Waiting for mysqld to be ready (accepting connections)\"\n            until mysql -h 127.0.0.1 -e \"SELECT 1\"; do sleep 1; done\n\n            echo \"Initializing replication from clone position\"\n            mysql -h 127.0.0.1 \\\n                  -e \"$(<change_master_to.sql.in), \\\n                          MASTER_HOST='mysql-0.mysql', \\\n                          MASTER_USER='root', \\\n                          MASTER_PASSWORD='', \\\n                          MASTER_CONNECT_RETRY=10; \\\n                        START SLAVE;\" || exit 1\n            # In case of container restart, attempt this at-most-once.\n            mv change_master_to.sql.in change_master_to.sql.orig\n          fi\n\n          # Start a server to send backups when requested by peers.\n          exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \\\n            \"xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root\"\n        volumeMounts:\n        - name: data\n          mountPath: /var/lib/mysql\n          subPath: mysql\n        - name: conf\n          mountPath: /etc/mysql/conf.d\n        resources:\n          requests:\n            cpu: 100m\n            memory: 100Mi\n      volumes:\n      - name: conf\n        emptyDir: {}\n      - name: config-map\n        configMap:\n          name: mysql\n  volumeClaimTemplates:\n  - metadata:\n      name: data\n    spec:\n      accessModes: [\"ReadWriteOnce\"]\n      storageClassName: \"local-path\"\n      resources:\n        requests:\n          storage: 10Gi\n"
  },
  {
    "path": "manifests/deprecated/mysql-cluster/mysql-test-client.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app: mycli\n  name: mysql-test-client\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: mycli\n  template:\n    metadata:\n      labels:\n        app: mycli\n    spec:\n      containers:\n      - name: mycli\n        image: mysql:5.7\n        command:\n        - tail\n        - \"-f\"\n        - \"/dev/null\"\n        env:\n        - name: TZ\n          value: \"Asia/Shanghai\"\n        - name: LANG\n          value: \"C.UTF-8\"\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/Chart.yaml",
    "content": "apiVersion: v1\nappVersion: 5.0.6\ndescription: Highly available Kubernetes implementation of Redis\nengine: gotpl\nhome: http://redis.io/\nicon: https://upload.wikimedia.org/wikipedia/en/thumb/6/6b/Redis_Logo.svg/1200px-Redis_Logo.svg.png\nkeywords:\n- redis\n- keyvalue\n- database\nmaintainers:\n- email: salimsalaues@gmail.com\n  name: ssalaues\n- email: aaron.layfield@gmail.com\n  name: dandydeveloper\nname: redis-ha\nsources:\n- https://redis.io/download\n- https://github.com/scality/Zenko/tree/development/1.0/kubernetes/zenko/charts/redis-ha\n- https://github.com/oliver006/redis_exporter\nversion: 4.4.4\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/OWNERS",
    "content": "approvers:\n- ssalaues\n- dandydeveloper\nreviewers:\n- ssalaues\n- dandydeveloper"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/README.md",
    "content": "# Redis\n\n----------------------------------------\n# Deprecation Warning\n*As part of the [deprecation timeline](https://github.com/helm/charts/#deprecation-timeline). We will move this to an official repository [here](https://github.com/DandyDeveloper/charts)*\n\nPlease make PRs / Issues here from now on\n\nWe will keep the changes in sync as best we can, but we will be notifying people to submit PRs here from now on instead. If you have any questions, feel free to get in touch with either of the maintainers. \n----------------------------------------\n\n[Redis](http://redis.io/) is an advanced key-value cache and store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets, sorted sets, bitmaps and hyperloglogs.\n\n## TL;DR;\n\n```bash\n$ helm install stable/redis-ha\n```\n\nBy default this chart install 3 pods total:\n * one pod containing a redis master and sentinel container (optional prometheus metrics exporter sidecar available)\n * two pods each containing a redis slave and sentinel containers (optional prometheus metrics exporter sidecars available)\n\n## Introduction\n\nThis chart bootstraps a [Redis](https://redis.io) highly available master/slave statefulset in a [Kubernetes](http://kubernetes.io) cluster using the Helm package manager.\n\n## Prerequisites\n\n- Kubernetes 1.8+ with Beta APIs enabled\n- PV provisioner support in the underlying infrastructure\n\n## Upgrading the Chart\n\nPlease note that there have been a number of changes simplifying the redis management strategy (for better failover and elections) in the 3.x version of this chart. These changes allow the use of official [redis](https://hub.docker.com/_/redis/) images that do not require special RBAC or ServiceAccount roles. As a result when upgrading from version >=2.0.1 to >=3.0.0 of this chart, `Role`, `RoleBinding`, and `ServiceAccount` resources should be deleted manually.\n\n### Upgrading the chart from 3.x to 4.x\n\nStarting from version `4.x` HAProxy sidecar prometheus-exporter removed and replaced by the embedded [HAProxy metrics endpoint](https://github.com/haproxy/haproxy/tree/master/contrib/prometheus-exporter), as a result when upgrading from version 3.x to 4.x section `haproxy.exporter` should be removed and the `haproxy.metrics` need to be configured for fit your needs.\n\n## Installing the Chart\n\nTo install the chart\n\n```bash\n$ helm install stable/redis-ha\n```\n\nThe command deploys Redis on the Kubernetes cluster in the default configuration. By default this chart install one master pod containing redis master container and sentinel container along with 2 redis slave pods each containing their own sentinel sidecars. The [configuration](#configuration) section lists the parameters that can be configured during installation.\n\n> **Tip**: List all releases using `helm list`\n\n## Uninstalling the Chart\n\nTo uninstall/delete the deployment:\n\n```bash\n$ helm delete <chart-name>\n```\n\nThe command removes all the Kubernetes components associated with the chart and deletes the release.\n\n## Configuration\n\nThe following table lists the configurable parameters of the Redis chart and their default values.\n\n| Parameter                 | Description                                                                                                                                                                                              | Default                                                                                    |\n|:--------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------|\n| `image`                   | Redis image                                                                                                                                                                                              | `redis`                                                                                    |\n| `imagePullSecrets`        | Reference to one or more secrets to be used when pulling redis images                                                                                                                                    | []                                                                                         |\n| `tag`                     | Redis tag                                                                                                                                                                                                | `5.0.6-alpine`                                                                             |\n| `replicas`                | Number of redis master/slave pods                                                                                                                                                                        | `3`                                                                                        |\n| `serviceAccount.create`   | Specifies whether a ServiceAccount should be created                                                                                                                                                     | `true`                                                                                     |\n| `serviceAccount.name`     | The name of the ServiceAccount to create                                                                                                                                                                 | Generated using the redis-ha.fullname template                                             |\n| `rbac.create`             | Create and use RBAC resources                                                                                                                                                                            | `true`                                                                                     |\n| `redis.port`              | Port to access the redis service                                                                                                                                                                         | `6379`                                                                                     |\n| `redis.masterGroupName`   | Redis convention for naming the cluster group: must match `^[\\\\w-\\\\.]+$` and can be templated                                                                                                            | `mymaster`                                                                                 |\n| `redis.config`            | Any valid redis config options in this section will be applied to each server (see below)                                                                                                                | see values.yaml                                                                            |\n| `redis.customConfig`      | Allows for custom redis.conf files to be applied. If this is used then `redis.config` is ignored                                                                                                         | ``                                                                                         |\n| `redis.resources`         | CPU/Memory for master/slave nodes resource requests/limits                                                                                                                                               | `{}`                                                                                       |\n| `sentinel.port`           | Port to access the sentinel service                                                                                                                                                                      | `26379`                                                                                    |\n| `sentinel.quorum`         | Minimum number of servers necessary to maintain quorum                                                                                                                                                   | `2`                                                                                        |\n| `sentinel.config`         | Valid sentinel config options in this section will be applied as config options to each sentinel (see below)                                                                                             | see values.yaml                                                                            |\n| `sentinel.customConfig`   | Allows for custom sentinel.conf files to be applied. If this is used then `sentinel.config` is ignored                                                                                                   | ``                                                                                         |\n| `sentinel.resources`      | CPU/Memory for sentinel node resource requests/limits                                                                                                                                                    | `{}`                                                                                       |\n| `init.resources`          | CPU/Memory for init Container node resource requests/limits                                                                                                                                              | `{}`                                                                                       |\n| `auth`                    | Enables or disables redis AUTH (Requires `redisPassword` to be set)                                                                                                                                      | `false`                                                                                    |\n| `redisPassword`           | A password that configures a `requirepass` and `masterauth` in the conf parameters (Requires `auth: enabled`)                                                                                            | ``                                                                                         |\n| `authKey`                 | The key holding the redis password in an existing secret.                                                                                                                                                | `auth`                                                                                     |\n| `existingSecret`          | An existing secret containing a key defined by `authKey` that configures `requirepass` and `masterauth` in the conf parameters (Requires `auth: enabled`, cannot be used in conjunction with `.Values.redisPassword`) | ``                                                                            |\n| `nodeSelector`            | Node labels for pod assignment                                                                                                                                                                           | `{}`                                                                                       |\n| `tolerations`             | Toleration labels for pod assignment                                                                                                                                                                     | `[]`                                                                                       |\n| `hardAntiAffinity`        | Whether the Redis server pods should be forced to run on separate nodes.                                                                                                                                 | `true`                                                                                     |\n| `additionalAffinities`    | Additional affinities to add to the Redis server pods.                                                                                                                                                   | `{}`                                                                                       |\n| `securityContext`         | Security context to be added to the Redis server pods.                                                                                                                                                   | `{runAsUser: 1000, fsGroup: 1000, runAsNonRoot: true}`                                     |\n| `affinity`                | Override all other affinity settings with a string.                                                                                                                                                      | `\"\"`                                                                                       |\n| `persistentVolume.size`          | Size for the volume                                                                                                                                                                               | 10Gi                                                                                       |\n| `persistentVolume.annotations`   | Annotations for the volume                                                                                                                                                                        | `{}`                                                                                       |\n| `persistentVolume.reclaimPolicy` | Method used to reclaim an obsoleted volume. `Delete` or `Retain`                                                                                                                                  | `\"\"`                                                                                       |\n| `emptyDir`                | Configuration of `emptyDir`, used only if persistentVolume is disabled and no hostPath specified                                                                                                                                  | `{}`                                                                                       |\n| `exporter.enabled`        | If `true`, the prometheus exporter sidecar is enabled                                                                                                                                                    | `false`                                                                                    |\n| `exporter.image`          | Exporter image                                                                                                                                                                                           | `oliver006/redis_exporter`                                                                 |\n| `exporter.tag`            | Exporter tag                                                                                                                                                                                             | `v0.31.0`                                                                                  |\n| `exporter.port`           | Exporter port                                                                                                                                                                                            | `9121`                                                                                     |\n| `exporter.annotations`    | Prometheus scrape annotations                                                                                                                                                                            | `{prometheus.io/path: /metrics, prometheus.io/port: \"9121\", prometheus.io/scrape: \"true\"}` |\n| `exporter.extraArgs`      | Additional args for the exporter                                                                                                                                                                         | `{}`                                                                                       |\n| `exporter.script`         | A custom custom Lua script that will be mounted to exporter for collection of custom metrics. Creates a ConfigMap and sets env var `REDIS_EXPORTER_SCRIPT`.                                                 |                                                                                            |\n| `exporter.serviceMonitor.enabled`       | Use servicemonitor from prometheus operator                                                                                                                                                | `false`                                                                                    |\n| `exporter.serviceMonitor.namespace`     | Namespace the service monitor is created in                                                                                                                                                | `default`                                                                                  |\n| `exporter.serviceMonitor.interval`      | Scrape interval, If not set, the Prometheus default scrape interval is used                                                                                                                | `nil`                                                                                      |\n| `exporter.serviceMonitor.telemetryPath` | Path to redis-exporter telemetry-path                                                                                                                                                      | `/metrics`                                                                                 |\n| `exporter.serviceMonitor.labels`        | Labels for the servicemonitor passed to Prometheus Operator                                                                                                                                | `{}`                                                                                       |\n| `exporter.serviceMonitor.timeout`       | How long until a scrape request times out. If not set, the Prometheus default scape timeout is used                                                                                        | `nil`                                                                                      |\n| `haproxy.enabled`         | Enabled HAProxy LoadBalancing/Proxy                                                                                                                                                                      | `false`                                                                                    |\n| `haproxy.replicas`        | Number of HAProxy instances                                                                                                                                                                              | `3`                                                                                        |\n| `haproxy.image.repository`| HAProxy Image Repository                                                                                                                                                                                 | `haproxy`                                                                                  |\n| `haproxy.image.tag`       | HAProxy Image Tag                                                                                                                                                                                        | `2.0.1`                                                                                    |\n| `haproxy.image.pullPolicy`| HAProxy Image PullPolicy                                                                                                                                                                                 | `IfNotPresent`                                                                             |\n| `haproxy.imagePullSecrets`| Reference to one or more secrets to be used when pulling haproxy images                                                                                                                                  | []                                                                                         |\n| `haproxy.annotations`     | HAProxy template annotations                                                                                                                                                                             | `{}`                                                                                       |\n| `haproxy.customConfig`    | Allows for custom config-haproxy.cfg file to be applied. If this is used then default config will be overwriten                                                                                          | ``                                                                                         |\n| `haproxy.extraConfig`     | Allows to place any additional configuration section to add to the default config-haproxy.cfg                                                                                                            | ``                                                                                         |\n| `haproxy.resources`       | HAProxy resources                                                                                                                                                                                        | `{}`                                                                                       |\n| `haproxy.emptyDir`        | Configuration of `emptyDir`                                                                                                                                  | `{}`                                                                                       |\n| `haproxy.service.type`    | HAProxy service type \"ClusterIP\", \"LoadBalancer\" or \"NodePort\"                                                                                                                                           | `ClusterIP`                                                                                |\n| `haproxy.service.nodePort`    | HAProxy service nodePort value (haproxy.service.type must be NodePort)                                                                                                                               | not set                                                                                    |\n| `haproxy.service.annotations` | HAProxy service annotations                                                                                                                                                                          | `{}`                                                                                       |\n| `haproxy.stickyBalancing` | HAProxy sticky load balancing to Redis nodes. Helps with connections shutdown.                                                                                                                           | `false`                                                                                    |\n| `haproxy.hapreadport.enable`  | Enable a read only port for redis slaves                                                                                                                                                             | `false`                                                                                    |\n| `haproxy.hapreadport.port`    | Haproxy port for read only redis slaves                                                                                                                                                              | `6380`                                                                                     |\n| `haproxy.metrics.enabled`     | HAProxy enable prometheus metric scraping                                                                                                                                                            | `false`                                                                                    |\n| `haproxy.metrics.port`        | HAProxy prometheus metrics scraping port                                                                                                                                                             | `9101`                                                                                     |\n| `haproxy.metrics.portName`    | HAProxy metrics scraping port name                                                                                                                                                                   | `exporter-port`                                                                            |\n| `haproxy.metrics.scrapePath`  | HAProxy prometheus metrics scraping port                                                                                                                                                             | `/metrics`                                                                                 |\n| `haproxy.metrics.serviceMonitor.enabled`       | Use servicemonitor from prometheus operator for HAProxy metrics                                                                                                                     | `false`                                                                                    |\n| `haproxy.metrics.serviceMonitor.namespace`     | Namespace the service monitor for HAProxy metrics is created in                                                                                                                     | `default`                                                                                  |\n| `haproxy.metrics.serviceMonitor.interval`      | Scrape interval, If not set, the Prometheus default scrape interval is used                                                                                                         | `nil`                                                                                      |\n| `haproxy.metrics.serviceMonitor.telemetryPath` | Path to HAProxy metrics telemetry-path                                                                                                                                              | `/metrics`                                                                                 |\n| `haproxy.metrics.serviceMonitor.labels`        | Labels for the HAProxy metrics servicemonitor passed to Prometheus Operator                                                                                                         | `{}`                                                                                       |\n| `haproxy.metrics.serviceMonitor.timeout`       | How long until a scrape request times out. If not set, the Prometheus default scape timeout is used                                                                                 | `nil`                                                                                      |\n| `haproxy.init.resources`       | Extra init resources                                                                                                                                                                                | `{}`                                                                                       |\n| `haproxy.timeout.connect`      | haproxy.cfg `timeout connect` setting                                                                                                                                                               | `4s`                                                                                       |\n| `haproxy.timeout.server`       | haproxy.cfg `timeout server` setting                                                                                                                                                                | `30s`                                                                                      |\n| `haproxy.timeout.client`       | haproxy.cfg `timeout client` setting                                                                                                                                                                | `30s`                                                                                      |\n| `haproxy.timeout.check`        | haproxy.cfg `timeout check` setting                                                                                                                                                                 | `2s`                                                                                       |\n| `haproxy.priorityClassName`    | priorityClassName for `haproxy` deployment                                                                                                                                                          | not set                                                                                    |\n| `haproxy.securityContext`      | Security context to be added to the HAProxy deployment.                                                                                                                                             | `{runAsUser: 1000, fsGroup: 1000, runAsNonRoot: true}`                                     |\n| `haproxy.hardAntiAffinity`     | Whether the haproxy pods should be forced to run on separate nodes.                                                                                                                                 | `true`                                                                                     |\n| `haproxy.affinity`             | Override all other haproxy affinity settings with a string.                                                                                                                                         | `\"\"`                                                                                       |\n| `haproxy.additionalAffinities` | Additional affinities to add to the haproxy server pods.                                                                                                                                            | `{}`                                                                                       |\n| `podDisruptionBudget`     | Pod Disruption Budget rules                                                                                                                                                                              | `{}`                                                                                       |\n| `priorityClassName`       | priorityClassName for `redis-ha-statefulset`                                                                                                                                                             | not set                                                                                    |\n| `hostPath.path`           | Use this path on the host for data storage                                                                                                                                                               | not set                                                                                    |\n| `hostPath.chown`          | Run an init-container as root to set ownership on the hostPath                                                                                                                                           | `true`                                                                                     |\n| `sysctlImage.enabled`     | Enable an init container to modify Kernel settings                                                                                                                                                       | `false`                                                                                    |\n| `sysctlImage.command`     | sysctlImage command to execute                                                                                                                                                                           | []                                                                                         |\n| `sysctlImage.registry`    | sysctlImage Init container registry                                                                                                                                                                      | `docker.io`                                                                                |\n| `sysctlImage.repository`  | sysctlImage Init container name                                                                                                                                                                          | `busybox`                                                                                  |\n| `sysctlImage.tag`         | sysctlImage Init container tag                                                                                                                                                                           | `1.31.1`                                                                                   |\n| `sysctlImage.pullPolicy`  | sysctlImage Init container pull policy                                                                                                                                                                   | `Always`                                                                                   |\n| `sysctlImage.mountHostSys`| Mount the host `/sys` folder to `/host-sys`                                                                                                                                                              | `false`                                                                                    |\n| `sysctlImage.resources`   | sysctlImage resources                                                                                                                                                                                    | `{}`                                                                                       |\n| `schedulerName`           | Alternate scheduler name                                                                                                                                                                                 | `nil`                                                                                      |\n\nSpecify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,\n\n```bash\n$ helm install \\\n  --set image=redis \\\n  --set tag=5.0.5-alpine \\\n    stable/redis-ha\n```\n\nThe above command sets the Redis server within `default` namespace.\n\nAlternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,\n\n```bash\n$ helm install -f values.yaml stable/redis-ha\n```\n\n> **Tip**: You can use the default [values.yaml](values.yaml)\n\n## Custom Redis and Sentinel config options\n\nThis chart allows for most redis or sentinel config options to be passed as a key value pair through the `values.yaml` under `redis.config` and `sentinel.config`. See links below for all available options.\n\n[Example redis.conf](http://download.redis.io/redis-stable/redis.conf)\n[Example sentinel.conf](http://download.redis.io/redis-stable/sentinel.conf)\n\nFor example `repl-timeout 60` would be added to the `redis.config` section of the `values.yaml` as:\n\n```yml\n    repl-timeout: \"60\"\n```\n\nNote:\n\n1. Some config options should be renamed by redis version，e.g.:\n\n   ```\n   # In redis 5.x，see https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf\n   min-replicas-to-write: 1\n   min-replicas-max-lag: 5\n\n   # In redis 4.x and redis 3.x，see https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf and https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf\n   min-slaves-to-write 1\n   min-slaves-max-lag 5\n   ```\n\nSentinel options supported must be in the the `sentinel <option> <master-group-name> <value>` format. For example, `sentinel down-after-milliseconds 30000` would be added to the `sentinel.config` section of the `values.yaml` as:\n\n```yml\n    down-after-milliseconds: 30000\n```\n\nIf more control is needed from either the redis or sentinel config then an entire config can be defined under `redis.customConfig` or `sentinel.customConfig`. Please note that these values will override any configuration options under their respective section. For example, if you define `sentinel.customConfig` then the `sentinel.config` is ignored.\n\n## Host Kernel Settings\nRedis may require some changes in the kernel of the host machine to work as expected, in particular increasing the `somaxconn` value and disabling transparent huge pages.\nTo do so, you can set up a privileged initContainer with the `sysctlImage` config values, for example:\n```\nsysctlImage:\n  enabled: true\n  mountHostSys: true\n  command:\n    - /bin/sh\n    - -xc\n    - |-\n      sysctl -w net.core.somaxconn=10000\n      echo never > /host-sys/kernel/mm/transparent_hugepage/enabled\n```\n\n## HAProxy startup\n\nWhen HAProxy is enabled, it will attempt to connect to each announce-service of each redis replica instance in its init container before starting.\nIt will fail if announce-service IP is not available fast enough (10 seconds max by announce-service).\nA such case could happen if the orchestator is pending the nomination of redis pods.\nRisk is limited because announce-service is using `publishNotReadyAddresses: true`, although, in such case, HAProxy pod will be rescheduled afterward by the orchestrator.\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/ci/haproxy-enabled-values.yaml",
    "content": "---\n## Enable HAProxy to manage Load Balancing\nhaproxy:\n  enabled: true\n  annotations:\n    any.domain/key: \"value\"\n  serviceAccount:\n    create: true\n  metrics:\n    enabled: true\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/NOTES.txt",
    "content": "Redis can be accessed via port {{ .Values.redis.port }} and Sentinel can be accessed via port {{ .Values.sentinel.port }} on the following DNS name from within your cluster:\n{{ template \"redis-ha.fullname\" . }}.{{ .Release.Namespace }}.svc.cluster.local\n\nTo connect to your Redis server:\n\n{{- if .Values.auth }}\n1. To retrieve the redis password:\n   echo $(kubectl get secret {{ template \"redis-ha.fullname\" . }} -o \"jsonpath={.data['auth']}\" | base64 --decode)\n\n2. Connect to the Redis master pod that you can use as a client. By default the {{ template \"redis-ha.fullname\" . }}-server-0 pod is configured as the master:\n\n   kubectl exec -it {{ template \"redis-ha.fullname\" . }}-server-0 sh -n {{ .Release.Namespace }}\n\n3. Connect using the Redis CLI (inside container):\n\n   redis-cli -a <REDIS-PASS-FROM-SECRET>\n{{- else }}\n1. Run a Redis pod that you can use as a client:\n\n   kubectl exec -it {{ template \"redis-ha.fullname\" . }}-server-0 sh -n {{ .Release.Namespace }}\n\n2. Connect using the Redis CLI:\n\n  redis-cli -h {{ template \"redis-ha.fullname\" . }}.{{ .Release.Namespace }}.svc.cluster.local\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/_configs.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n\n{{- define \"config-redis.conf\" }}\n{{- if .Values.redis.customConfig }}\n{{ tpl .Values.redis.customConfig . | indent 4 }}\n{{- else }}\n    dir \"/data\"\n    port {{ .Values.redis.port }}\n    {{- range $key, $value := .Values.redis.config }}\n    {{ $key }} {{ $value }}\n    {{- end }}\n{{- if .Values.auth }}\n    requirepass replace-default-auth\n    masterauth replace-default-auth\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"config-sentinel.conf\" }}\n{{- if .Values.sentinel.customConfig }}\n{{ tpl .Values.sentinel.customConfig . | indent 4 }}\n{{- else }}\n    dir \"/data\"\n    {{- range $key, $value := .Values.sentinel.config }}\n    {{- if eq \"maxclients\" $key  }}\n        {{ $key }} {{ $value }}\n    {{- else }}\n        sentinel {{ $key }} {{ template \"redis-ha.masterGroupName\" $ }} {{ $value }}\n    {{- end }}\n    {{- end }}\n{{- if .Values.auth }}\n    sentinel auth-pass {{ template \"redis-ha.masterGroupName\" . }} replace-default-auth\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{- define \"config-init.sh\" }}\n    HOSTNAME=\"$(hostname)\"\n    INDEX=\"${HOSTNAME##*-}\"\n    MASTER=\"$(redis-cli -h {{ template \"redis-ha.fullname\" . }} -p {{ .Values.sentinel.port }} sentinel get-master-addr-by-name {{ template \"redis-ha.masterGroupName\" . }} | grep -E '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}')\"\n    MASTER_GROUP=\"{{ template \"redis-ha.masterGroupName\" . }}\"\n    QUORUM=\"{{ .Values.sentinel.quorum }}\"\n    REDIS_CONF=/data/conf/redis.conf\n    REDIS_PORT={{ .Values.redis.port }}\n    SENTINEL_CONF=/data/conf/sentinel.conf\n    SENTINEL_PORT={{ .Values.sentinel.port }}\n    SERVICE={{ template \"redis-ha.fullname\" . }}\n    set -eu\n\n    sentinel_update() {\n        echo \"Updating sentinel config with master $MASTER\"\n        eval MY_SENTINEL_ID=\"\\${SENTINEL_ID_$INDEX}\"\n        sed -i \"1s/^/sentinel myid $MY_SENTINEL_ID\\\\n/\" \"$SENTINEL_CONF\"\n        sed -i \"2s/^/sentinel monitor $MASTER_GROUP $1 $REDIS_PORT $QUORUM \\\\n/\" \"$SENTINEL_CONF\"\n        echo \"sentinel announce-ip $ANNOUNCE_IP\" >> $SENTINEL_CONF\n        echo \"sentinel announce-port $SENTINEL_PORT\" >> $SENTINEL_CONF\n    }\n\n    redis_update() {\n        echo \"Updating redis config\"\n        echo \"slaveof $1 $REDIS_PORT\" >> \"$REDIS_CONF\"\n        echo \"slave-announce-ip $ANNOUNCE_IP\" >> $REDIS_CONF\n        echo \"slave-announce-port $REDIS_PORT\" >> $REDIS_CONF\n    }\n\n    copy_config() {\n        cp /readonly-config/redis.conf \"$REDIS_CONF\"\n        cp /readonly-config/sentinel.conf \"$SENTINEL_CONF\"\n    }\n\n    setup_defaults() {\n        echo \"Setting up defaults\"\n        if [ \"$INDEX\" = \"0\" ]; then\n            echo \"Setting this pod as the default master\"\n            redis_update \"$ANNOUNCE_IP\"\n            sentinel_update \"$ANNOUNCE_IP\"\n            sed -i \"s/^.*slaveof.*//\" \"$REDIS_CONF\"\n        else\n            DEFAULT_MASTER=\"$(getent hosts \"$SERVICE-announce-0\" | awk '{ print $1 }')\"\n            if [ -z \"$DEFAULT_MASTER\" ]; then\n                echo \"Unable to resolve host\"\n                exit 1\n            fi\n            echo \"Setting default slave config..\"\n            redis_update \"$DEFAULT_MASTER\"\n            sentinel_update \"$DEFAULT_MASTER\"\n        fi\n    }\n\n    find_master() {\n        echo \"Attempting to find master\"\n        if [ \"$(redis-cli -h \"$MASTER\"{{ if .Values.auth }} -a \"$AUTH\"{{ end }} ping)\" != \"PONG\" ]; then\n           echo \"Can't ping master, attempting to force failover\"\n           if redis-cli -h \"$SERVICE\" -p \"$SENTINEL_PORT\" sentinel failover \"$MASTER_GROUP\" | grep -q 'NOGOODSLAVE' ; then\n               setup_defaults\n               return 0\n           fi\n           sleep 10\n           MASTER=\"$(redis-cli -h $SERVICE -p $SENTINEL_PORT sentinel get-master-addr-by-name $MASTER_GROUP | grep -E '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}')\"\n           if [ \"$MASTER\" ]; then\n               sentinel_update \"$MASTER\"\n               redis_update \"$MASTER\"\n           else\n              echo \"Could not failover, exiting...\"\n              exit 1\n           fi\n        else\n            echo \"Found reachable master, updating config\"\n            sentinel_update \"$MASTER\"\n            redis_update \"$MASTER\"\n        fi\n    }\n\n    mkdir -p /data/conf/\n\n    echo \"Initializing config..\"\n    copy_config\n\n    ANNOUNCE_IP=$(getent hosts \"$SERVICE-announce-$INDEX\" | awk '{ print $1 }')\n    if [ -z \"$ANNOUNCE_IP\" ]; then\n        \"Could not resolve the announce ip for this pod\"\n        exit 1\n    elif [ \"$MASTER\" ]; then\n        find_master\n    else\n        setup_defaults\n    fi\n\n    if [ \"${AUTH:-}\" ]; then\n        echo \"Setting auth values\"\n        ESCAPED_AUTH=$(echo \"$AUTH\" | sed -e 's/[\\/&]/\\\\&/g');\n        sed -i \"s/replace-default-auth/${ESCAPED_AUTH}/\" \"$REDIS_CONF\" \"$SENTINEL_CONF\"\n    fi\n\n    echo \"Ready...\"\n{{- end }}\n\n{{- define \"config-haproxy.cfg\" }}\n{{- if .Values.haproxy.customConfig }}\n{{ .Values.haproxy.customConfig | indent 4}}\n{{- else }}\n    defaults REDIS\n      mode tcp\n      timeout connect {{ .Values.haproxy.timeout.connect }}\n      timeout server {{ .Values.haproxy.timeout.server }}\n      timeout client {{ .Values.haproxy.timeout.client }}\n      timeout check {{ .Values.haproxy.timeout.check }}\n\n    listen health_check_http_url\n      bind :8888\n      mode http\n      monitor-uri /healthz\n      option      dontlognull\n\n    {{- $root := . }}\n    {{- $fullName := include \"redis-ha.fullname\" . }}\n    {{- $replicas := int (toString .Values.replicas) }}\n    {{- $masterGroupName := include \"redis-ha.masterGroupName\" . }}\n    {{- range $i := until $replicas }}\n    # Check Sentinel and whether they are nominated master\n    backend check_if_redis_is_master_{{ $i }}\n      mode tcp\n      option tcp-check\n      tcp-check connect\n      {{- if $root.auth }}\n      tcp-check send AUTH\\ {{ $root.redisPassword }}\\r\\n\n      tcp-check expect string +OK\n      {{- end }}\n      tcp-check send PING\\r\\n\n      tcp-check expect string +PONG\n      tcp-check send SENTINEL\\ get-master-addr-by-name\\ {{ $masterGroupName }}\\r\\n\n      tcp-check expect string REPLACE_ANNOUNCE{{ $i }}\n      tcp-check send QUIT\\r\\n\n      tcp-check expect string +OK\n      {{- range $i := until $replicas }}\n      server R{{ $i }} {{ $fullName }}-announce-{{ $i }}:26379 check inter 1s\n      {{- end }}\n    {{- end }}\n\n    # decide redis backend to use\n    #master\n    frontend ft_redis_master\n      bind *:{{ $root.Values.redis.port }}\n      use_backend bk_redis_master\n    {{- if .Values.haproxy.readOnly.enabled }}\n    #slave\n    frontend ft_redis_slave\n      bind *:{{ .Values.haproxy.readOnly.port }}\n      use_backend bk_redis_slave\n    {{- end }}\n    # Check all redis servers to see if they think they are master\n    backend bk_redis_master\n      {{- if .Values.haproxy.stickyBalancing }}\n      balance source\n      hash-type consistent\n      {{- end }}\n      mode tcp\n      option tcp-check\n      tcp-check connect\n      {{- if .Values.auth }}\n      tcp-check send AUTH\\ REPLACE_AUTH_SECRET\\r\\n\n      tcp-check expect string +OK\n      {{- end }}\n      tcp-check send PING\\r\\n\n      tcp-check expect string +PONG\n      tcp-check send info\\ replication\\r\\n\n      tcp-check expect string role:master\n      tcp-check send QUIT\\r\\n\n      tcp-check expect string +OK\n      {{- range $i := until $replicas }}\n      use-server R{{ $i }} if { srv_is_up(R{{ $i }}) } { nbsrv(check_if_redis_is_master_{{ $i }}) ge 2 }\n      server R{{ $i }} {{ $fullName }}-announce-{{ $i }}:{{ $root.Values.redis.port }} check inter 1s fall 1 rise 1\n      {{- end }}\n    {{- if .Values.haproxy.readOnly.enabled }}\n    backend bk_redis_slave\n      {{- if .Values.haproxy.stickyBalancing }}\n      balance source\n      hash-type consistent\n      {{- end }}\n      mode tcp\n      option tcp-check\n      tcp-check connect\n      {{- if .Values.auth }}\n      tcp-check send AUTH\\ REPLACE_AUTH_SECRET\\r\\n\n      tcp-check expect string +OK\n      {{- end }}\n      tcp-check send PING\\r\\n\n      tcp-check expect string +PONG\n      tcp-check send info\\ replication\\r\\n\n      tcp-check expect  string role:slave\n      tcp-check send QUIT\\r\\n\n      tcp-check expect string +OK\n      {{- range $i := until $replicas }}\n      server R{{ $i }} {{ $fullName }}-announce-{{ $i }}:{{ $root.Values.redis.port }} check inter 1s fall 1 rise 1\n      {{- end }}\n    {{- end }}\n    {{- if .Values.haproxy.metrics.enabled }}\n    frontend metrics\n      mode http\n      bind *:{{ .Values.haproxy.metrics.port }}\n      option http-use-htx\n      http-request use-service prometheus-exporter if { path {{ .Values.haproxy.metrics.scrapePath }} }\n    {{- end }}\n{{- if .Values.haproxy.extraConfig }}\n    # Additional configuration\n{{ .Values.haproxy.extraConfig | indent 4 }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n\n{{- define \"config-haproxy_init.sh\" }}\n    HAPROXY_CONF=/data/haproxy.cfg\n    cp /readonly/haproxy.cfg \"$HAPROXY_CONF\"\n    {{- $fullName := include \"redis-ha.fullname\" . }}\n    {{- $replicas := int (toString .Values.replicas) }}\n    {{- range $i := until $replicas }}\n    for loop in $(seq 1 10); do\n      getent hosts {{ $fullName }}-announce-{{ $i }} && break\n      echo \"Waiting for service {{ $fullName }}-announce-{{ $i }} to be ready ($loop) ...\" && sleep 1\n    done\n    ANNOUNCE_IP{{ $i }}=$(getent hosts \"{{ $fullName }}-announce-{{ $i }}\" | awk '{ print $1 }')\n    if [ -z \"$ANNOUNCE_IP{{ $i }}\" ]; then\n      echo \"Could not resolve the announce ip for {{ $fullName }}-announce-{{ $i }}\"\n      exit 1\n    fi\n    sed -i \"s/REPLACE_ANNOUNCE{{ $i }}/$ANNOUNCE_IP{{ $i }}/\" \"$HAPROXY_CONF\"\n\n    if [ \"${AUTH:-}\" ]; then\n        echo \"Setting auth values\"\n        ESCAPED_AUTH=$(echo \"$AUTH\" | sed -e 's/[\\/&]/\\\\&/g');\n        sed -i \"s/REPLACE_AUTH_SECRET/${ESCAPED_AUTH}/\" \"$HAPROXY_CONF\"\n    fi\n    {{- end }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"redis-ha.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"redis-ha.fullname\" -}}\n{{- if .Values.fullnameOverride -}}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- if contains $name .Release.Name -}}\n{{- .Release.Name | trunc 63 | trimSuffix \"-\" -}}\n{{- else -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n{{- end -}}\n{{- end -}}\n\n\n{{/*\nReturn sysctl image\n*/}}\n{{- define \"redis.sysctl.image\" -}}\n{{- $registryName :=  default \"docker.io\" .Values.sysctlImage.registry -}}\n{{- $tag := default \"latest\" .Values.sysctlImage.tag | toString -}}\n{{- printf \"%s/%s:%s\" $registryName .Values.sysctlImage.repository $tag -}}\n{{- end -}}\n\n{{- /*\nCredit: @technosophos\nhttps://github.com/technosophos/common-chart/\nlabels.standard prints the standard Helm labels.\nThe standard labels are frequently used in metadata.\n*/ -}}\n{{- define \"labels.standard\" -}}\napp: {{ template \"redis-ha.name\" . }}\nheritage: {{ .Release.Service | quote }}\nrelease: {{ .Release.Name | quote }}\nchart: {{ template \"chartref\" . }}\n{{- end -}}\n\n{{- /*\nCredit: @technosophos\nhttps://github.com/technosophos/common-chart/\nchartref prints a chart name and version.\nIt does minimal escaping for use in Kubernetes labels.\nExample output:\n  zookeeper-1.2.3\n  wordpress-3.2.1_20170219\n*/ -}}\n{{- define \"chartref\" -}}\n  {{- replace \"+\" \"_\" .Chart.Version | printf \"%s-%s\" .Chart.Name -}}\n{{- end -}}\n\n{{/*\nCreate the name of the service account to use\n*/}}\n{{- define \"redis-ha.serviceAccountName\" -}}\n{{- if .Values.serviceAccount.create -}}\n    {{ default (include \"redis-ha.fullname\" .) .Values.serviceAccount.name }}\n{{- else -}}\n    {{ default \"default\" .Values.serviceAccount.name }}\n{{- end -}}\n{{- end -}}\n\n{{- define \"redis-ha.masterGroupName\" -}}\n{{- $masterGroupName := tpl ( .Values.redis.masterGroupName | default \"\") . -}}\n{{- $validMasterGroupName := regexMatch \"^[\\\\w-\\\\.]+$\" $masterGroupName -}}\n{{- if $validMasterGroupName -}}\n{{ $masterGroupName }}\n{{- else -}}\n{{ required \"A valid .Values.redis.masterGroupName entry is required (matching ^[\\\\w-\\\\.]+$)\" \"\"}}\n{{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-auth-secret.yaml",
    "content": "{{- if and .Values.auth (not .Values.existingSecret) -}}\napiVersion: v1\nkind: Secret\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n{{ include \"labels.standard\" . | indent 4 }}\ntype: Opaque\ndata:\n  {{ .Values.authKey }}: {{ .Values.redisPassword | b64enc | quote }}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-announce-service.yaml",
    "content": "{{- $fullName := include \"redis-ha.fullname\" . }}\n{{- $namespace := .Release.Namespace -}}\n{{- $replicas := int (toString .Values.replicas) }}\n{{- $root := . }}\n{{- range $i := until $replicas }}\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ $fullName }}-announce-{{ $i }}\n  namespace: {{ $namespace }}\n  labels:\n{{ include \"labels.standard\" $root | indent 4 }}\n  annotations:\n    service.alpha.kubernetes.io/tolerate-unready-endpoints: \"true\"\n  {{- if $root.Values.serviceAnnotations }}\n{{ toYaml $root.Values.serviceAnnotations | indent 4 }}\n  {{- end }}\nspec:\n  publishNotReadyAddresses: true\n  type: ClusterIP\n  ports:\n  - name: server\n    port: {{ $root.Values.redis.port }}\n    protocol: TCP\n    targetPort: redis\n  - name: sentinel\n    port: {{ $root.Values.sentinel.port }}\n    protocol: TCP\n    targetPort: sentinel\n  {{- if $root.Values.exporter.enabled }}\n  - name: exporter\n    port: {{ $root.Values.exporter.port }}\n    protocol: TCP\n    targetPort: exporter-port\n  {{- end }}\n  selector:\n    release: {{ $root.Release.Name }}\n    app: {{ include \"redis-ha.name\" $root }}\n    \"statefulset.kubernetes.io/pod-name\": {{ $fullName }}-server-{{ $i }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}-configmap\n  namespace: {{ .Release.Namespace }}\n  labels:\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    app: {{ template \"redis-ha.fullname\" . }}\ndata:\n  redis.conf: |\n{{- include \"config-redis.conf\" . }}\n\n  sentinel.conf: |\n{{- include \"config-sentinel.conf\" . }}\n\n  init.sh: |\n{{- include \"config-init.sh\" . }}\n{{ if .Values.haproxy.enabled }}\n  haproxy.cfg: |-\n{{- include \"config-haproxy.cfg\" . }}\n{{- end }}\n  haproxy_init.sh: |\n{{- include \"config-haproxy_init.sh\" . }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-exporter-script-configmap.yaml",
    "content": "{{- if .Values.exporter.script }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}-exporter-script-configmap\n  namespace: {{ .Release.Namespace }}\n  labels:\n{{ include \"labels.standard\" . | indent 4 }}\ndata:\n  script: {{ toYaml .Values.exporter.script | indent 2 }}\n{{- end }}"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-pdb.yaml",
    "content": "{{- if .Values.podDisruptionBudget -}}\napiVersion: policy/v1beta1\nkind: PodDisruptionBudget\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}-pdb\n  namespace: {{ .Release.Namespace }}\n  labels:\n{{ include \"labels.standard\" . | indent 4 }}\nspec:\n  selector:\n    matchLabels:\n      release: {{ .Release.Name }}\n      app: {{ template \"redis-ha.name\" . }}\n{{ toYaml .Values.podDisruptionBudget | indent 2 }}\n{{- end -}}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-role.yaml",
    "content": "{{- if and .Values.serviceAccount.create  .Values.rbac.create }}\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    app: {{ template \"redis-ha.fullname\" . }}\nrules:\n- apiGroups:\n    - \"\"\n  resources:\n    - endpoints\n  verbs:\n    - get\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-rolebinding.yaml",
    "content": "{{- if and .Values.serviceAccount.create .Values.rbac.create }}\nkind: RoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    app: {{ template \"redis-ha.fullname\" . }}\nsubjects:\n- kind: ServiceAccount\n  name: {{ template \"redis-ha.serviceAccountName\" . }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: Role\n  name: {{ template \"redis-ha.fullname\" . }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n{{ include \"labels.standard\" . | indent 4 }}\n{{- if and ( .Values.exporter.enabled ) ( .Values.exporter.serviceMonitor.enabled ) }}\n    servicemonitor: enabled\n{{- end }}\n  annotations:\n  {{- if .Values.serviceAnnotations }}\n{{ toYaml .Values.serviceAnnotations | indent 4 }}\n  {{- end }}\nspec:\n  type: ClusterIP\n  clusterIP: None\n  ports:\n  - name: server\n    port: {{ .Values.redis.port }}\n    protocol: TCP\n    targetPort: redis\n  - name: sentinel\n    port: {{ .Values.sentinel.port }}\n    protocol: TCP\n    targetPort: sentinel\n{{- if .Values.exporter.enabled }}\n  - name: exporter-port\n    port: {{ .Values.exporter.port }}\n    protocol: TCP\n    targetPort: exporter-port\n{{- end }}\n  selector:\n    release: {{ .Release.Name }}\n    app: {{ template \"redis-ha.name\" . }}"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-serviceaccount.yaml",
    "content": "{{- if .Values.serviceAccount.create }}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ template \"redis-ha.serviceAccountName\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    app: {{ template \"redis-ha.fullname\" . }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-servicemonitor.yaml",
    "content": "{{- if and ( .Capabilities.APIVersions.Has \"monitoring.coreos.com/v1\" ) ( .Values.exporter.serviceMonitor.enabled ) ( .Values.exporter.enabled ) }}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n{{- if .Values.exporter.serviceMonitor.labels }}\n  labels:\n{{ toYaml .Values.exporter.serviceMonitor.labels | indent 4}}\n{{- end }}\n  name: {{ template \"redis-ha.fullname\" . }}\n  namespace: {{ .Release.Namespace }}\n{{- if .Values.exporter.serviceMonitor.namespace }}\n  namespace: {{ .Values.exporter.serviceMonitor.namespace }}\n{{- end }}\nspec:\n  endpoints:\n  - targetPort: {{ .Values.exporter.port }}\n{{- if .Values.exporter.serviceMonitor.interval }}\n    interval: {{ .Values.exporter.serviceMonitor.interval }}\n{{- end }}\n{{- if .Values.exporter.serviceMonitor.telemetryPath }}\n    path: {{ .Values.exporter.serviceMonitor.telemetryPath }}\n{{- end }}\n{{- if .Values.exporter.serviceMonitor.timeout }}\n    scrapeTimeout: {{ .Values.exporter.serviceMonitor.timeout }}\n{{- end }}\n  jobLabel: {{ template \"redis-ha.fullname\" . }}\n  namespaceSelector:\n    matchNames:\n    - {{ .Release.Namespace }}\n  selector:\n    matchLabels:\n      app: {{ template \"redis-ha.name\" . }}\n      release: {{ .Release.Name }}\n      servicemonitor: enabled\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-ha-statefulset.yaml",
    "content": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}-server\n  namespace: {{ .Release.Namespace }}\n  labels:\n    {{ template \"redis-ha.fullname\" . }}: replica\n{{ include \"labels.standard\" . | indent 4 }}\nspec:\n  selector:\n    matchLabels:\n      release: {{ .Release.Name }}\n      app: {{ template \"redis-ha.name\" . }}\n  serviceName: {{ template \"redis-ha.fullname\" . }}\n  replicas: {{ .Values.replicas }}\n  podManagementPolicy: OrderedReady\n  updateStrategy:\n    type: RollingUpdate\n  template:\n    metadata:\n      annotations:\n        checksum/init-config: {{ print (include \"config-redis.conf\" .) (include \"config-init.sh\" .) | sha256sum }}\n      {{- if .Values.podAnnotations }}\n{{ toYaml .Values.podAnnotations | indent 8 }}\n      {{- end }}\n      {{- if .Values.exporter.enabled }}\n        prometheus.io/port: \"{{ .Values.exporter.port }}\"\n        prometheus.io/scrape: \"true\"\n        prometheus.io/path: {{ .Values.exporter.scrapePath }}\n      {{- end }}\n      labels:\n        release: {{ .Release.Name }}\n        app: {{ template \"redis-ha.name\" . }}\n        {{ template \"redis-ha.fullname\" . }}: replica\n        {{- range $key, $value := .Values.labels }}\n        {{ $key }}: {{ $value }}\n        {{- end }}\n    spec:\n      {{- if .Values.schedulerName }}\n      schedulerName: \"{{ .Values.schedulerName }}\"\n      {{- end }}\n      {{- if .Values.nodeSelector }}\n      nodeSelector:\n{{ toYaml .Values.nodeSelector | indent 8 }}\n      {{- end }}\n      {{- if .Values.tolerations }}\n      tolerations:\n{{ toYaml .Values.tolerations | indent 8 }}\n      {{- end }}\n      affinity:\n    {{- if .Values.affinity }}\n    {{- with .Values.affinity }}\n{{ tpl . $ | indent 8 }}\n    {{- end }}\n    {{- else }}\n    {{- if .Values.additionalAffinities }}\n{{ toYaml .Values.additionalAffinities | indent 8 }}\n    {{- end }}\n        podAntiAffinity:\n    {{- if .Values.hardAntiAffinity }}\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - labelSelector:\n                matchLabels:\n                  app: {{ template \"redis-ha.name\" . }}\n                  release: {{ .Release.Name }}\n                  {{ template \"redis-ha.fullname\" . }}: replica\n              topologyKey: kubernetes.io/hostname\n    {{- else }}\n          preferredDuringSchedulingIgnoredDuringExecution:\n            - labelSelector:\n                matchLabels:\n                  app: {{ template \"redis-ha.name\" . }}\n                  release: {{ .Release.Name }}\n                  {{ template \"redis-ha.fullname\" . }}: replica\n              topologyKey: kubernetes.io/hostname\n    {{- end }}\n          preferredDuringSchedulingIgnoredDuringExecution:\n            - weight: 100\n              podAffinityTerm:\n                labelSelector:\n                  matchLabels:\n                    app:  {{ template \"redis-ha.name\" . }}\n                    release: {{ .Release.Name }}\n                    {{ template \"redis-ha.fullname\" . }}: replica\n                topologyKey: failure-domain.beta.kubernetes.io/zone\n    {{- end }}\n      {{- if .Values.imagePullSecrets }}\n      imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }}\n      {{- end }}\n      securityContext:\n{{ toYaml .Values.securityContext | indent 8 }}\n      serviceAccountName: {{ template \"redis-ha.serviceAccountName\" . }}\n      initContainers:\n      {{- if .Values.sysctlImage.enabled }}\n      - name: init-sysctl\n        image: {{ template \"redis.sysctl.image\" . }}\n        imagePullPolicy: {{ .Values.sysctlImage.pullPolicy }}\n        resources:\n{{ toYaml .Values.sysctlImage.resources | indent 10 }}\n        {{- if .Values.sysctlImage.mountHostSys }}\n        volumeMounts:\n        - name: host-sys\n          mountPath: /host-sys\n        {{- end }}\n        command:\n{{ toYaml .Values.sysctlImage.command | indent 10 }}\n        securityContext:\n          runAsNonRoot: false\n          privileged: true\n          runAsUser: 0\n      {{- end }}\n{{- if and .Values.hostPath.path .Values.hostPath.chown }}\n      - name: hostpath-chown\n        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}\n        securityContext:\n          runAsNonRoot: false\n          runAsUser: 0\n        command:\n        - chown\n        - \"{{ .Values.securityContext.runAsUser }}\"\n        - /data\n        volumeMounts:\n        - name: data\n          mountPath: /data\n{{- end }}\n      - name: config-init\n        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}\n        imagePullPolicy: {{ .Values.image.pullPolicy }}\n        resources:\n{{ toYaml .Values.init.resources | indent 10 }}\n        command:\n        - sh\n        args:\n        - /readonly-config/init.sh\n        env:\n{{- $replicas := int (toString .Values.replicas) -}}\n{{- range $i := until $replicas }}\n        - name: SENTINEL_ID_{{ $i }}\n          value: {{ printf \"%s\\n%s\\nindex: %d\" (include \"redis-ha.name\" $) ($.Release.Name) $i | sha1sum }}\n{{ end -}}\n{{- if .Values.auth }}\n        - name: AUTH\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"redis-ha.fullname\" . }}\n            {{- end }}\n              key: {{ .Values.authKey }}\n{{- end }}\n        volumeMounts:\n        - name: config\n          mountPath: /readonly-config\n          readOnly: true\n        - name: data\n          mountPath: /data\n      containers:\n      - name: redis\n        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}\n        imagePullPolicy: {{ .Values.image.pullPolicy }}\n        command:\n        - redis-server\n        args:\n        - /data/conf/redis.conf\n        {{- if .Values.auth }}\n        env:\n        - name: AUTH\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"redis-ha.fullname\" . }}\n            {{- end }}\n              key: {{ .Values.authKey }}\n        {{- end }}\n        livenessProbe:\n          tcpSocket:\n            port: {{ .Values.redis.port }}\n          initialDelaySeconds: 15\n        resources:\n{{ toYaml .Values.redis.resources | indent 10 }}\n        ports:\n        - name: redis\n          containerPort: {{ .Values.redis.port }}\n        volumeMounts:\n        - mountPath: /data\n          name: data\n      - name: sentinel\n        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}\n        imagePullPolicy: {{ .Values.image.pullPolicy }}\n        command:\n          - redis-sentinel\n        args:\n          - /data/conf/sentinel.conf\n{{- if .Values.auth }}\n        env:\n        - name: AUTH\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"redis-ha.fullname\" . }}\n            {{- end }}\n              key: {{ .Values.authKey }}\n{{- end }}\n        livenessProbe:\n          tcpSocket:\n            port: {{ .Values.sentinel.port }}\n          initialDelaySeconds: 15\n        resources:\n{{ toYaml .Values.sentinel.resources | indent 10 }}\n        ports:\n          - name: sentinel\n            containerPort: {{ .Values.sentinel.port }}\n        volumeMounts:\n        - mountPath: /data\n          name: data\n{{- if .Values.exporter.enabled }}\n      - name: redis-exporter\n        image: \"{{ .Values.exporter.image }}:{{ .Values.exporter.tag }}\"\n        imagePullPolicy: {{ .Values.exporter.pullPolicy }}\n        args:\n        {{- range $key, $value := .Values.exporter.extraArgs }}\n          - --{{ $key }}={{ $value }}\n        {{- end }}\n        env:\n          - name: REDIS_ADDR\n            value: redis://localhost:{{ .Values.redis.port }}\n        {{- if .Values.auth }}\n          - name: REDIS_PASSWORD\n            valueFrom:\n              secretKeyRef:\n              {{- if .Values.existingSecret }}\n                name: {{ .Values.existingSecret }}\n              {{- else }}\n                name: {{ template \"redis-ha.fullname\" . }}\n              {{- end }}\n                key: {{ .Values.authKey }}\n        {{- end }}\n        {{- if .Values.exporter.script }}\n          - name: REDIS_EXPORTER_SCRIPT\n            value: /script/script.lua\n        {{- end }}\n        livenessProbe:\n          httpGet:\n            path: {{ .Values.exporter.scrapePath }}\n            port: {{ .Values.exporter.port }}\n          initialDelaySeconds: 15\n          timeoutSeconds: 1\n          periodSeconds: 15\n        resources:\n{{ toYaml .Values.exporter.resources | indent 10 }}\n        ports:\n          - name: exporter-port\n            containerPort: {{ .Values.exporter.port }}\n        {{- if .Values.exporter.script }}\n        volumeMounts:\n          - mountPath: /script\n            name: script-mount\n        {{- end }}\n{{- end }}\n{{- if .Values.priorityClassName }}\n      priorityClassName: {{ .Values.priorityClassName }}\n{{- end }}\n      volumes:\n      - name: config\n        configMap:\n          name: {{ template \"redis-ha.fullname\" . }}-configmap\n      {{- if .Values.sysctlImage.mountHostSys }}\n      - name: host-sys\n        hostPath:\n          path: /sys\n      {{- end }}\n      {{- if .Values.exporter.script }}\n      - name: script-mount\n        configMap:\n          name: {{ template \"redis-ha.fullname\" . }}-exporter-script-configmap\n          items:\n            - key: script\n              path: script.lua\n      {{- end }}\n{{- if .Values.persistentVolume.enabled }}\n  volumeClaimTemplates:\n  - metadata:\n      name: data\n      annotations:\n      {{- range $key, $value := .Values.persistentVolume.annotations }}\n        {{ $key }}: {{ $value }}\n      {{- end }}\n    spec:\n      accessModes:\n      {{- range .Values.persistentVolume.accessModes }}\n        - {{ . | quote }}\n      {{- end }}\n      resources:\n        requests:\n          storage: {{ .Values.persistentVolume.size | quote }}\n    {{- if .Values.persistentVolume.storageClass }}\n    {{- if (eq \"-\" .Values.persistentVolume.storageClass) }}\n      storageClassName: \"\"\n    {{- else }}\n      storageClassName: \"{{ .Values.persistentVolume.storageClass }}\"\n    {{- end }}\n    {{- end }}\n    {{- if .Values.persistentVolume.reclaimPolicy }}\n    persistentVolumeReclaimPolicy: \"{{ .Values.persistentVolume.reclaimPolicy }}\"\n    {{- end }}\n{{- else if .Values.hostPath.path }}\n      - name: data\n        hostPath:\n          path: {{ tpl .Values.hostPath.path .}}\n{{- else }}\n      - name: data\n        emptyDir:\n{{ toYaml .Values.emptyDir | indent 10 }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-haproxy-deployment.yaml",
    "content": "{{- if .Values.haproxy.enabled }}\nkind: Deployment\napiVersion: apps/v1\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}-haproxy\n  namespace: {{ .Release.Namespace }}\n  labels:\n{{ include \"labels.standard\" . | indent 4 }}\nspec:\n  strategy:\n    type: RollingUpdate\n  revisionHistoryLimit: 1\n  replicas: {{ .Values.haproxy.replicas }}\n  selector:\n    matchLabels:\n      app: {{ template \"redis-ha.name\" . }}-haproxy\n      release: {{ .Release.Name }}\n  template:\n    metadata:\n      name: {{ template \"redis-ha.fullname\" . }}-haproxy\n      labels:\n        app: {{ template \"redis-ha.name\" . }}-haproxy\n        release: {{ .Release.Name }}\n      annotations:\n      {{- if .Values.haproxy.metrics.enabled }}\n        prometheus.io/port: \"{{ .Values.haproxy.metrics.port }}\"\n        prometheus.io/scrape: \"true\"\n        prometheus.io/path: \"{{ .Values.haproxy.metrics.scrapePath }}\"\n      {{- end }}\n        checksum/config: {{ print (include \"config-haproxy.cfg\" .) (include \"config-haproxy_init.sh\" .) | sha256sum }}\n      {{- if .Values.haproxy.annotations }}\n{{ toYaml .Values.haproxy.annotations | indent 8 }}\n      {{- end }}\n    spec:\n      # Needed when using unmodified rbac-setup.yml\n      {{ if .Values.haproxy.serviceAccount.create }}\n      serviceAccountName: {{ template \"redis-ha.serviceAccountName\" . }}-haproxy\n      {{ end }}\n      nodeSelector:\n{{ toYaml .Values.nodeSelector | indent 8 }}\n      tolerations:\n{{ toYaml .Values.tolerations | indent 8 }}\n      affinity:\n    {{- if .Values.haproxy.affinity }}\n    {{- with .Values.haproxy.affinity }}\n{{ tpl . $ | indent 8 }}\n    {{- end }}\n    {{- else }}\n    {{- if .Values.haproxy.additionalAffinities }}\n{{ toYaml .Values.haproxy.additionalAffinities | indent 8 }}\n    {{- end }}\n        podAntiAffinity:\n    {{- if .Values.haproxy.hardAntiAffinity }}\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - labelSelector:\n                matchLabels:\n                  app: {{ template \"redis-ha.name\" . }}-haproxy\n                  release: {{ .Release.Name }}\n              topologyKey: kubernetes.io/hostname\n    {{- else }}\n          preferredDuringSchedulingIgnoredDuringExecution:\n            - labelSelector:\n                matchLabels:\n                  app: {{ template \"redis-ha.name\" . }}-haproxy\n                  release: {{ .Release.Name }}\n              topologyKey: kubernetes.io/hostname\n    {{- end }}\n          preferredDuringSchedulingIgnoredDuringExecution:\n            - weight: 100\n              podAffinityTerm:\n                labelSelector:\n                  matchLabels:\n                    app:  {{ template \"redis-ha.name\" . }}-haproxy\n                    release: {{ .Release.Name }}\n                topologyKey: failure-domain.beta.kubernetes.io/zone\n    {{- end }}\n      initContainers:\n      - name: config-init\n        image: {{ .Values.haproxy.image.repository }}:{{ .Values.haproxy.image.tag }}\n        imagePullPolicy: {{ .Values.haproxy.image.pullPolicy }}\n        resources:\n{{ toYaml .Values.haproxy.init.resources | indent 10 }}\n        command:\n        - sh\n        args:\n        - /readonly/haproxy_init.sh\n{{- if .Values.auth }}\n        env:\n        - name: AUTH\n          valueFrom:\n            secretKeyRef:\n            {{- if .Values.existingSecret }}\n              name: {{ .Values.existingSecret }}\n            {{- else }}\n              name: {{ template \"redis-ha.fullname\" . }}\n            {{- end }}\n              key: {{ .Values.authKey }}\n{{- end }}\n        volumeMounts:\n        - name: config-volume\n          mountPath: /readonly\n          readOnly: true\n        - name: data\n          mountPath: /data\n      {{- if .Values.haproxy.imagePullSecrets }}\n      imagePullSecrets: {{ toYaml .Values.haproxy.imagePullSecrets | nindent 8 }}\n      {{- end }}\n      securityContext:\n{{ toYaml .Values.haproxy.securityContext | indent 8 }}\n      containers:\n      - name: haproxy\n        image: {{ .Values.haproxy.image.repository }}:{{ .Values.haproxy.image.tag }}\n        imagePullPolicy: {{ .Values.haproxy.image.pullPolicy }}\n        livenessProbe:\n          httpGet:\n            path: /healthz\n            port: 8888\n          initialDelaySeconds: 5\n          periodSeconds: 3\n        ports:\n        - name: redis\n          containerPort: {{ default \"6379\" .Values.redis.port }}\n        {{- if .Values.haproxy.readOnly.enabled }}\n        - name: readonlyport\n          containerPort: {{ default \"6380\" .Values.haproxy.readOnly.port }}\n        {{- end }}\n        {{- if .Values.haproxy.metrics.enabled }}\n        - name: metrics-port\n          containerPort: {{ default \"9101\" .Values.haproxy.metrics.port }}\n        {{- end }}\n        resources:\n{{ toYaml .Values.haproxy.resources | indent 10 }}\n        volumeMounts:\n        - name: data\n          mountPath: /usr/local/etc/haproxy\n        - name: shared-socket\n          mountPath: /run/haproxy\n{{- if .Values.haproxy.priorityClassName }}\n      priorityClassName: {{ .Values.haproxy.priorityClassName }}\n{{- end }}\n      volumes:\n      - name: config-volume\n        configMap:\n          name: {{ template \"redis-ha.fullname\" . }}-configmap\n      - name: shared-socket\n        emptyDir: \n{{ toYaml .Values.haproxy.emptyDir | indent 10 }}\n      - name: data\n        emptyDir: \n{{ toYaml .Values.haproxy.emptyDir | indent 10 }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-haproxy-service.yaml",
    "content": "{{- if .Values.haproxy.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}-haproxy\n  namespace: {{ .Release.Namespace }}\n  labels:\n{{ include \"labels.standard\" . | indent 4 }}\n    component: {{ template \"redis-ha.fullname\" . }}-haproxy\n  annotations:\n  {{- if .Values.haproxy.service.annotations }}\n{{ toYaml .Values.haproxy.service.annotations | indent 4 }}\n  {{- end }}\nspec:\n  type: {{ default \"ClusterIP\" .Values.haproxy.service.type }}\n  {{- if and (eq .Values.haproxy.service.type \"LoadBalancer\") .Values.haproxy.service.loadBalancerIP }}\n  loadBalancerIP: {{ .Values.haproxy.service.loadBalancerIP }}\n  {{- end }}\n  ports:\n  - name: haproxy\n    port: {{ .Values.redis.port }}\n    protocol: TCP\n    targetPort: redis\n  {{- if and (eq .Values.haproxy.service.type \"NodePort\") .Values.haproxy.service.nodePort }}\n    nodePort: {{ .Values.haproxy.service.nodePort }}\n  {{- end }}\n{{- if .Values.haproxy.readOnly.enabled }}\n  - name: haproxyreadonly\n    port: {{ .Values.haproxy.readOnly.port }}\n    protocol: TCP\n    targetPort: {{ .Values.haproxy.readOnly.port }}\n{{- end }}\n{{- if .Values.haproxy.metrics.enabled }}\n  - name: {{ .Values.haproxy.metrics.portName }}\n    port: {{ .Values.haproxy.metrics.port }}\n    protocol: TCP\n    targetPort: metrics-port\n{{- end }}\n  selector:\n    release: {{ .Release.Name }}\n    app: {{ template \"redis-ha.name\" . }}-haproxy\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-haproxy-serviceaccount.yaml",
    "content": "{{- if and .Values.haproxy.serviceAccount.create .Values.haproxy.enabled }}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ template \"redis-ha.serviceAccountName\" . }}-haproxy\n  namespace: {{ .Release.Namespace }}\n  labels:\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    app: {{ template \"redis-ha.fullname\" . }}\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/redis-haproxy-servicemonitor.yaml",
    "content": "{{- if and ( .Capabilities.APIVersions.Has \"monitoring.coreos.com/v1\" ) ( .Values.haproxy.metrics.serviceMonitor.enabled ) ( .Values.haproxy.metrics.enabled ) }}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n{{- with .Values.haproxy.metrics.serviceMonitor.labels }}\n  labels: {{ toYaml . | nindent 4}}\n{{- end }}\n  name: {{ template \"redis-ha.fullname\" . }}-haproxy\n  namespace: {{ .Release.Namespace }}\n{{- if .Values.haproxy.metrics.serviceMonitor.namespace }}\n  namespace: {{ .Values.haproxy.metrics.serviceMonitor.namespace }}\n{{- end }}\nspec:\n  endpoints:\n  - targetPort: {{ .Values.haproxy.metrics.port }}\n{{- if .Values.haproxy.metrics.serviceMonitor.interval }}\n    interval: {{ .Values.haproxy.metrics.serviceMonitor.interval }}\n{{- end }}\n{{- if .Values.haproxy.metrics.serviceMonitor.telemetryPath }}\n    path: {{ .Values.haproxy.metrics.serviceMonitor.telemetryPath }}\n{{- end }}\n{{- if .Values.haproxy.metrics.serviceMonitor.timeout }}\n    scrapeTimeout: {{ .Values.haproxy.metrics.serviceMonitor.timeout }}\n{{- end }}\n  jobLabel: {{ template \"redis-ha.fullname\" . }}-haproxy\n  namespaceSelector:\n    matchNames:\n    - {{ .Release.Namespace }}\n  selector:\n    matchLabels:\n      app: {{ template \"redis-ha.name\" . }}\n      release: {{ .Release.Name }}\n      component: {{ template \"redis-ha.fullname\" . }}-haproxy\n{{- end }}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/tests/test-redis-ha-configmap.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}-configmap-test\n  labels:\n{{ include \"labels.standard\" . | indent 4 }}\n  annotations:\n    \"helm.sh/hook\": test-success\nspec:\n  containers:\n  - name: check-init\n    image: koalaman/shellcheck:v0.5.0\n    args:\n    - --shell=sh\n    - /readonly-config/init.sh\n    volumeMounts:\n    - name: config\n      mountPath: /readonly-config\n      readOnly: true\n  {{- if .Values.imagePullSecrets }}\n  imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 4 }}\n  {{- end }}\n  restartPolicy: Never\n  volumes:\n  - name: config\n    configMap:\n      name: {{ template \"redis-ha.fullname\" . }}-configmap\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/templates/tests/test-redis-ha-pod.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: {{ template \"redis-ha.fullname\" . }}-service-test\n  labels:\n{{ include \"labels.standard\" . | indent 4 }}\n  annotations:\n    \"helm.sh/hook\": test-success\nspec:\n  containers:\n  - name: \"{{ .Release.Name }}-service-test\"\n    image: {{ .Values.image.repository }}:{{ .Values.image.tag }}\n    command:\n      - sh\n      - -c\n      - redis-cli -h {{ template \"redis-ha.fullname\" . }} -p {{ .Values.redis.port }} info server\n  {{- if .Values.imagePullSecrets }}\n  imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 4 }}\n  {{- end }}\n  restartPolicy: Never\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/redis-ha/values.yaml",
    "content": "## Configure resource requests and limits\n## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n##\nimage:\n  repository: redis\n  tag: 5.0.6-alpine\n  pullPolicy: IfNotPresent\n\n## Reference to one or more secrets to be used when pulling images\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n## This imagePullSecrets is only for redis images\n##\nimagePullSecrets: []\n# - name: \"image-pull-secret\"\n\n## replicas number for each component\nreplicas: 3\n\n## Kubernetes priorityClass name for the redis-ha-server pod\n# priorityClassName: \"\"\n\n## Custom labels for the redis pod\nlabels: {}\n\n## Pods Service Account\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\nserviceAccount:\n  ## Specifies whether a ServiceAccount should be created\n  ##\n  create: true\n  ## The name of the ServiceAccount to use.\n  ## If not set and create is true, a name is generated using the redis-ha.fullname template\n  # name:\n\n## Enables a HA Proxy for better LoadBalancing / Sentinel Master support. Automatically proxies to Redis master.\n## Recommend for externally exposed Redis clusters.\n## ref: https://cbonte.github.io/haproxy-dconv/1.9/intro.html\nhaproxy:\n  enabled: false\n  # Enable if you want a dedicated port in haproxy for redis-slaves\n  readOnly:\n    enabled: false\n    port: 6380\n  replicas: 3\n  image:\n    repository: haproxy\n    tag: 2.0.4\n    pullPolicy: IfNotPresent\n\n  ## Reference to one or more secrets to be used when pulling images\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n  ##\n  imagePullSecrets: []\n  # - name: \"image-pull-secret\"\n\n  annotations: {}\n  resources: {}\n  emptyDir: {}\n  ## Enable sticky sessions to Redis nodes via HAProxy\n  ## Very useful for long-living connections as in case of Sentry for example\n  stickyBalancing: false\n  ## Kubernetes priorityClass name for the haproxy pod\n  # priorityClassName: \"\"\n  ## Service type for HAProxy\n  ##\n  service:\n    type: ClusterIP\n    loadBalancerIP:\n    annotations: {}\n  serviceAccount:\n    create: true\n  ## Official HAProxy embedded prometheus metrics settings.\n  ## Ref: https://github.com/haproxy/haproxy/tree/master/contrib/prometheus-exporter\n  ##\n  metrics:\n    enabled: false\n    # prometheus port & scrape path\n    port: 9101\n    portName: exporter-port\n    scrapePath: /metrics\n\n    serviceMonitor:\n      # When set true then use a ServiceMonitor to configure scraping\n      enabled: false\n      # Set the namespace the ServiceMonitor should be deployed\n      # namespace: monitoring\n      # Set how frequently Prometheus should scrape\n      # interval: 30s\n      # Set path to redis-exporter telemtery-path\n      # telemetryPath: /metrics\n      # Set labels for the ServiceMonitor, use this to define your scrape label for Prometheus Operator\n      # labels: {}\n      # Set timeout for scrape\n      # timeout: 10s\n  init:\n    resources: {}\n  timeout:\n    connect: 4s\n    server: 30s\n    client: 30s\n    check: 2s\n  securityContext:\n    runAsUser: 1000\n    fsGroup: 1000\n    runAsNonRoot: true\n\n  ## Whether the haproxy pods should be forced to run on separate nodes.\n  hardAntiAffinity: true\n\n  ## Additional affinities to add to the haproxy pods.\n  additionalAffinities: {}\n\n  ## Override all other affinity settings for the haproxy pods with a string.\n  affinity: |\n\n  ## Custom config-haproxy.cfg files used to override default settings. If this file is\n  ## specified then the config-haproxy.cfg above will be ignored.\n  # customConfig: |-\n      # Define configuration here\n  ## Place any additional configuration section to add to the default config-haproxy.cfg\n  # extraConfig: |-\n      # Define configuration here\n\n\n## Role Based Access\n## Ref: https://kubernetes.io/docs/admin/authorization/rbac/\n##\nrbac:\n  create: true\n\nsysctlImage:\n  enabled: false\n  command: []\n  registry: docker.io\n  repository: busybox\n  tag: 1.31.1\n  pullPolicy: Always\n  mountHostSys: false\n  resources: {}\n\n## Use an alternate scheduler, e.g. \"stork\".\n## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n##\n# schedulerName:\n\n## Redis specific configuration options\nredis:\n  port: 6379\n  masterGroupName: \"mymaster\"       # must match ^[\\\\w-\\\\.]+$) and can be templated\n  config:\n    ## Additional redis conf options can be added below\n    ## For all available options see http://download.redis.io/redis-stable/redis.conf\n    min-replicas-to-write: 1\n    min-replicas-max-lag: 5   # Value in seconds\n    maxmemory: \"0\"       # Max memory to use for each redis instance. Default is unlimited.\n    maxmemory-policy: \"volatile-lru\"  # Max memory policy to use for each redis instance. Default is volatile-lru.\n    # Determines if scheduled RDB backups are created. Default is false.\n    # Please note that local (on-disk) RDBs will still be created when re-syncing with a new slave. The only way to prevent this is to enable diskless replication.\n    save: \"900 1\"\n    # When enabled, directly sends the RDB over the wire to slaves, without using the disk as intermediate storage. Default is false.\n    repl-diskless-sync: \"yes\"\n    rdbcompression: \"yes\"\n    rdbchecksum: \"yes\"\n\n\n  ## Custom redis.conf files used to override default settings. If this file is\n  ## specified then the redis.config above will be ignored.\n  # customConfig: |-\n      # Define configuration here\n\n  resources: {}\n  #  requests:\n  #    memory: 200Mi\n  #    cpu: 100m\n  #  limits:\n  #    memory: 700Mi\n\n## Sentinel specific configuration options\nsentinel:\n  port: 26379\n  quorum: 2\n  config:\n    ## Additional sentinel conf options can be added below. Only options that\n    ## are expressed in the format simialar to 'sentinel xxx mymaster xxx' will\n    ## be properly templated expect maxclients option.\n    ## For available options see http://download.redis.io/redis-stable/sentinel.conf\n    down-after-milliseconds: 10000\n    ## Failover timeout value in milliseconds\n    failover-timeout: 180000\n    parallel-syncs: 5\n    maxclients: 10000\n\n  ## Custom sentinel.conf files used to override default settings. If this file is\n  ## specified then the sentinel.config above will be ignored.\n  # customConfig: |-\n      # Define configuration here\n\n  resources: {}\n  #  requests:\n  #    memory: 200Mi\n  #    cpu: 100m\n  #  limits:\n  #    memory: 200Mi\n\nsecurityContext:\n  runAsUser: 1000\n  fsGroup: 1000\n  runAsNonRoot: true\n\n## Node labels, affinity, and tolerations for pod assignment\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\nnodeSelector: {}\n\n## Whether the Redis server pods should be forced to run on separate nodes.\n## This is accomplished by setting their AntiAffinity with requiredDuringSchedulingIgnoredDuringExecution as opposed to preferred.\n## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity-beta-feature\n##\nhardAntiAffinity: true\n\n## Additional affinities to add to the Redis server pods.\n##\n## Example:\n##   nodeAffinity:\n##     preferredDuringSchedulingIgnoredDuringExecution:\n##       - weight: 50\n##         preference:\n##           matchExpressions:\n##             - key: spot\n##               operator: NotIn\n##               values:\n##                 - \"true\"\n##\n## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n##\nadditionalAffinities: {}\n\n## Override all other affinity settings for the Redis server pods with a string.\n##\n## Example:\n## affinity: |\n##   podAntiAffinity:\n##     requiredDuringSchedulingIgnoredDuringExecution:\n##       - labelSelector:\n##           matchLabels:\n##             app: {{ template \"redis-ha.name\" . }}\n##             release: {{ .Release.Name }}\n##         topologyKey: kubernetes.io/hostname\n##     preferredDuringSchedulingIgnoredDuringExecution:\n##       - weight: 100\n##         podAffinityTerm:\n##           labelSelector:\n##             matchLabels:\n##               app:  {{ template \"redis-ha.name\" . }}\n##               release: {{ .Release.Name }}\n##           topologyKey: failure-domain.beta.kubernetes.io/zone\n##\naffinity: |\n\n# Prometheus exporter specific configuration options\nexporter:\n  enabled: false\n  image: oliver006/redis_exporter\n  tag: v1.3.2\n  pullPolicy: IfNotPresent\n\n  # prometheus port & scrape path\n  port: 9121\n  scrapePath: /metrics\n\n  # cpu/memory resource limits/requests\n  resources: {}\n\n  # Additional args for redis exporter\n  extraArgs: {}\n\n  # Used to mount a LUA-Script via config map and use it for metrics-collection\n  # script: |\n  #   -- Example script copied from: https://github.com/oliver006/redis_exporter/blob/master/contrib/sample_collect_script.lua\n  #   -- Example collect script for -script option\n  #   -- This returns a Lua table with alternating keys and values.\n  #   -- Both keys and values must be strings, similar to a HGETALL result.\n  #   -- More info about Redis Lua scripting: https://redis.io/commands/eval\n  #\n  #   local result = {}\n  #\n  #   -- Add all keys and values from some hash in db 5\n  #   redis.call(\"SELECT\", 5)\n  #   local r = redis.call(\"HGETALL\", \"some-hash-with-stats\")\n  #   if r ~= nil then\n  #   for _,v in ipairs(r) do\n  #   table.insert(result, v) -- alternating keys and values\n  #   end\n  #   end\n  #\n  #   -- Set foo to 42\n  #   table.insert(result, \"foo\")\n  #   table.insert(result, \"42\") -- note the string, use tostring() if needed\n  #\n  #   return result\n\n  serviceMonitor:\n    # When set true then use a ServiceMonitor to configure scraping\n    enabled: false\n    # Set the namespace the ServiceMonitor should be deployed\n    # namespace: monitoring\n    # Set how frequently Prometheus should scrape\n    # interval: 30s\n    # Set path to redis-exporter telemtery-path\n    # telemetryPath: /metrics\n    # Set labels for the ServiceMonitor, use this to define your scrape label for Prometheus Operator\n    # labels: {}\n    # Set timeout for scrape\n    # timeout: 10s\n\npodDisruptionBudget: {}\n  # maxUnavailable: 1\n  # minAvailable: 1\n\n## Configures redis with AUTH (requirepass & masterauth conf params)\nauth: false\n# redisPassword:\n\n## Use existing secret containing key `authKey` (ignores redisPassword)\n# existingSecret:\n\n## Defines the key holding the redis password in existing secret.\nauthKey: auth\n\npersistentVolume:\n  enabled: true\n  ## redis-ha data Persistent Volume Storage Class\n  ## If defined, storageClassName: <storageClass>\n  ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n  ## If undefined (the default) or set to null, no storageClassName spec is\n  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on\n  ##   GKE, AWS & OpenStack)\n  ##\n  # storageClass: \"-\"\n  accessModes:\n    - ReadWriteOnce\n  size: 10Gi\n  annotations: {}\n  # reclaimPolicy per https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming\n  reclaimPolicy: \"\"\ninit:\n  resources: {}\n\n# To use a hostPath for data, set persistentVolume.enabled to false\n# and define hostPath.path.\n# Warning: this might overwrite existing folders on the host system!\nhostPath:\n  ## path is evaluated as template so placeholders are replaced\n  # path: \"/data/{{ .Release.Name }}\"\n\n  # if chown is true, an init-container with root permissions is launched to\n  # change the owner of the hostPath folder to the user defined in the\n  # security context\n  chown: true\n\nemptyDir: {}\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/start.sh",
    "content": "#!/bin/sh\nset -x\n\nROOT=$(cd `dirname $0`; pwd)\ncd $ROOT\n\nhelm install redis \\\n\t--create-namespace \\\n\t--namespace dependency \\\n\t-f ./values.yaml \\\n\t./redis-ha\n"
  },
  {
    "path": "manifests/deprecated/redis-cluster/values.yaml",
    "content": "image:\n  repository: redis\n  tag: 5.0.6-alpine\n\nreplicas: 2\n\n## Redis specific configuration options\nredis:\n  port: 6379\n  masterGroupName: \"mymaster\"       # must match ^[\\\\w-\\\\.]+$) and can be templated\n  config:\n    ## For all available options see http://download.redis.io/redis-stable/redis.conf\n    min-replicas-to-write: 1\n    min-replicas-max-lag: 5   # Value in seconds\n    maxmemory: \"4g\"       # Max memory to use for each redis instance. Default is unlimited.\n    maxmemory-policy: \"allkeys-lru\"  # Max memory policy to use for each redis instance. Default is volatile-lru.\n    repl-diskless-sync: \"yes\"\n    rdbcompression: \"yes\"\n    rdbchecksum: \"yes\"\n\n  resources:\n    requests:\n      memory: 200Mi\n      cpu: 100m\n    limits:\n      memory: 4000Mi\n\n## Sentinel specific configuration options\nsentinel:\n  port: 26379\n  quorum: 1\n\n  resources:\n    requests:\n      memory: 200Mi\n      cpu: 100m\n    limits:\n      memory: 200Mi\n\nhardAntiAffinity: true\n\n## Configures redis with AUTH (requirepass & masterauth conf params)\nauth: false\n\npersistentVolume:\n  enabled: false\n\nhostPath:\n  path: \"/data/mcs-redis/{{ .Release.Name }}\"\n"
  },
  {
    "path": "manifests/deprecated/storage/local-storage/example-sts.yml",
    "content": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: local-test\nspec:\n  serviceName: \"\"\n  replicas: 2\n  selector:\n    matchLabels:\n      app: local-test\n  template:\n    metadata:\n      labels:\n        app: local-test\n    spec:\n      containers:\n      - name: test-container\n        image: busybox\n        command:\n        - \"/bin/sh\"\n        args:\n        - \"-c\"\n        - \"sleep 100000\"\n        volumeMounts:\n        - name: local-vol\n          mountPath: /usr/test-pod\n  volumeClaimTemplates:\n  - metadata:\n      name: local-vol\n    spec:\n      accessModes: [ \"ReadWriteOnce\" ]\n      storageClassName: \"local-storage\"\n      resources:\n        requests:\n          storage: 5Gi\n"
  },
  {
    "path": "manifests/deprecated/storage/local-storage/local-pv1.yml",
    "content": "apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: local-pv1\nspec:\n  capacity:\n    storage: 5Gi\n  volumeMode: Filesystem\n  accessModes:\n  - ReadWriteOnce\n  persistentVolumeReclaimPolicy: Delete\n  storageClassName: local-storage\n  local:\n    path: /mnt/disks/vol1\n  nodeAffinity:\n    required:\n      nodeSelectorTerms:\n      - matchExpressions:\n        - key: kubernetes.io/hostname\n          operator: In\n          values:\n          - 192.168.1.2\n          - 192.168.1.3\n"
  },
  {
    "path": "manifests/deprecated/storage/local-storage/local-pv2.yml",
    "content": "apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: local-pv2\nspec:\n  capacity:\n    storage: 5Gi\n  volumeMode: Filesystem\n  accessModes:\n  - ReadWriteOnce\n  persistentVolumeReclaimPolicy: Delete\n  storageClassName: local-storage\n  local:\n    path: /mnt/disks/vol2\n  nodeAffinity:\n    required:\n      nodeSelectorTerms:\n      - matchExpressions:\n        - key: kubernetes.io/hostname\n          operator: In\n          values:\n          - 192.168.1.4\n"
  },
  {
    "path": "manifests/deprecated/storage/local-storage/local-storage-class.yml",
    "content": "kind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n  name: local-storage\nprovisioner: kubernetes.io/no-provisioner\nvolumeBindingMode: WaitForFirstConsumer\n"
  },
  {
    "path": "manifests/deprecated/storage/test.yaml",
    "content": "kind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: test-claim\nspec:\n  storageClassName: nfs-dynamic-class\n  accessModes:\n    - ReadWriteMany\n  resources:\n    requests:\n      storage: 1Mi\n\n---\nkind: Pod\napiVersion: v1\nmetadata:\n  name: test\nspec:\n  containers:\n  - name: test\n    image: busybox:1.28.4\n    imagePullPolicy: IfNotPresent\n    command:\n      - \"/bin/sh\"\n    args:\n      - \"-c\"\n      - \"echo 'hello k8s' > /mnt/SUCCESS && sleep 36000 || exit 1\"\n    volumeMounts:\n      - name: nfs-pvc\n        mountPath: \"/mnt\"\n  restartPolicy: \"Never\"\n  volumes:\n    - name: nfs-pvc\n      persistentVolumeClaim:\n        claimName: test-claim\n"
  },
  {
    "path": "playbooks/01.prepare.yml",
    "content": "# [optional] to synchronize system time of nodes with 'chrony' \n- hosts:\n  - kube_master\n  - kube_node\n  - etcd\n  - ex_lb\n  - chrony\n  roles:\n  - { role: os-harden, when: \"OS_HARDEN|bool\" }\n  - { role: chrony, when: \"groups['chrony']|length > 0\" }\n\n# to create CA, kubeconfig, kube-proxy.kubeconfig etc.\n- hosts: localhost\n  roles:\n  - deploy\n\n# prepare tasks for all nodes\n- hosts:\n  - kube_master\n  - kube_node\n  - etcd\n  roles:\n  - prepare\n"
  },
  {
    "path": "playbooks/02.etcd.yml",
    "content": "# to install etcd cluster\n- hosts: etcd\n  roles:\n  - etcd\n"
  },
  {
    "path": "playbooks/03.runtime.yml",
    "content": "# to install a container runtime\n- hosts:\n  - kube_master\n  - kube_node\n  roles:\n  - { role: docker, when: \"CONTAINER_RUNTIME == 'docker'\" }\n  - { role: containerd, when: \"CONTAINER_RUNTIME == 'containerd'\" }\n"
  },
  {
    "path": "playbooks/04.kube-master.yml",
    "content": "# to set up 'kube_master' nodes\n- hosts: kube_master\n  roles:\n  - kube-lb\n  - kube-master\n  - kube-node\n"
  },
  {
    "path": "playbooks/05.kube-node.yml",
    "content": "# to set up 'kube_node' nodes\n- hosts: kube_node\n  roles:\n  - { role: kube-lb, when: \"inventory_hostname not in groups['kube_master']\" }\n  - { role: kube-node, when: \"inventory_hostname not in groups['kube_master']\" }\n"
  },
  {
    "path": "playbooks/06.network.yml",
    "content": "# to install network plugin, only one can be choosen \n- hosts:\n  - kube_master\n  - kube_node\n  roles:\n  - { role: calico, when: \"CLUSTER_NETWORK == 'calico'\" }\n  - { role: cilium, when: \"CLUSTER_NETWORK == 'cilium'\" }\n  - { role: flannel, when: \"CLUSTER_NETWORK == 'flannel'\" }\n  - { role: kube-router, when: \"CLUSTER_NETWORK == 'kube-router'\" }\n  - { role: kube-ovn, when: \"CLUSTER_NETWORK == 'kube-ovn'\" }\n"
  },
  {
    "path": "playbooks/07.cluster-addon.yml",
    "content": "# to install clust-addons\n- hosts: localhost\n  roles:\n  - cluster-addon\n"
  },
  {
    "path": "playbooks/10.ex-lb.yml",
    "content": "- hosts: ex_lb\n  roles:\n  - ex-lb\n"
  },
  {
    "path": "playbooks/11.harbor.yml",
    "content": "# [optional] to set up a HARBOR, and to integrate the HARBOR with k8s cluster\n# read the guide: 'guide/harbor.md'\n\n### --- install harbor ---\n- hosts: harbor\n  roles:\n  - { role: os-harden, when: \"NEW_INSTALL|bool and OS_HARDEN|bool\" }\n  - { role: chrony, when: \"NEW_INSTALL|bool and groups['chrony']|length > 0\" }\n  - { role: prepare, when: \"NEW_INSTALL|bool\" }\n  - { role: docker, when: \"NEW_INSTALL|bool\" }\n  - { role: harbor, when: \"NEW_INSTALL|bool\" }\n\n### --- config k8s nodes to work with harbor ---\n- hosts: \n  - kube_master\n  - kube_node\n  tasks:\n  # [optional] if you have a DNS server, add an 'A record' instead\n  - name: Adding an '/etc/hosts' entry for the HARBOR DOMAIN\n    lineinfile:\n      dest: /etc/hosts\n      state: present\n      regexp: '{{ HARBOR_DOMAIN }}'\n      line: \"{{ groups['harbor'][0] }} {{ HARBOR_DOMAIN }}\"\n    when: \"hostvars[groups.harbor[0]]['HARBOR_DOMAIN'] != ''\"\n"
  },
  {
    "path": "playbooks/21.addetcd.yml",
    "content": "# add new-etcd node, one at a time\n- hosts: \"{{ NODE_TO_ADD }}\"\n  tasks:\n  # step1: find a healthy member in the etcd cluster\n  - block:\n    - name: set NODE_IPS of the etcd cluster\n      set_fact: NODE_IPS=\"{% for host in groups['etcd'] %}{{ host }} {% endfor %}\"\n\n    - name: get etcd cluster status\n      shell: 'for ip in {{ NODE_IPS }};do \\\n                ETCDCTL_API=3 {{ base_dir }}/bin/etcdctl \\\n                --endpoints=https://\"$ip\":2379 \\\n                --cacert={{ cluster_dir }}/ssl/ca.pem \\\n                --cert={{ cluster_dir }}/ssl/etcd.pem \\\n                --key={{ cluster_dir }}/ssl/etcd-key.pem \\\n                endpoint health; \\\n              done'\n      register: ETCD_CLUSTER_STATUS\n\n    - debug: var=\"ETCD_CLUSTER_STATUS\"\n\n    - name: get a running ectd node\n      shell: 'echo -e \"{{ ETCD_CLUSTER_STATUS.stdout }}\" \\\n               \"{{ ETCD_CLUSTER_STATUS.stderr }}\" \\\n               |grep \"is healthy\"|sed -n \"1p\"|cut -d: -f2|cut -d/ -f3'\n      register: RUNNING_NODE\n\n    - debug: var=\"RUNNING_NODE.stdout\"\n    connection: local\n\n  # step2: add a new member in the etcd cluster\n  - name: add a new etcd member\n    shell: \"ETCDCTL_API=3 {{ bin_dir }}/etcdctl member add etcd-{{ NODE_TO_ADD }} \\\n            --peer-urls=https://{{ NODE_TO_ADD }}:2380\"\n    delegate_to: \"{{ RUNNING_NODE.stdout }}\"\n\n# step3: start the new-etcd node\n- hosts: \"{{ NODE_TO_ADD }}\"\n  vars:\n    CLUSTER_STATE: existing\n  roles:\n  - { role: os-harden, when: \"OS_HARDEN|bool\" }\n  - { role: chrony, when: \"groups['chrony']|length > 0\" }\n  - prepare\n  - etcd\n"
  },
  {
    "path": "playbooks/22.addnode.yml",
    "content": "# Note: this playbook can not run independently\n\n- hosts: \"{{ NODE_TO_ADD }}\" \n  roles:\n  - { role: os-harden, when: \"OS_HARDEN|bool\" }\n  - { role: chrony, when: \"groups['chrony']|length > 0\" } \n  - prepare\n  - { role: docker, when: \"CONTAINER_RUNTIME == 'docker'\" }\n  - { role: containerd, when: \"CONTAINER_RUNTIME == 'containerd'\" }\n  - kube-lb\n  - kube-node\n  - { role: calico, when: \"CLUSTER_NETWORK == 'calico'\" }\n  - { role: cilium, when: \"CLUSTER_NETWORK == 'cilium'\" }\n  - { role: flannel, when: \"CLUSTER_NETWORK == 'flannel'\" }\n  - { role: kube-router, when: \"CLUSTER_NETWORK == 'kube-router'\" }\n"
  },
  {
    "path": "playbooks/23.addmaster.yml",
    "content": "# Note: this playbook cann't run independently\n\n- hosts: \"{{ NODE_TO_ADD }}\" \n  roles:\n  - { role: os-harden, when: \"OS_HARDEN|bool\" }\n  - { role: chrony, when: \"groups['chrony']|length > 0\" } \n  - prepare\n  - { role: docker, when: \"CONTAINER_RUNTIME == 'docker'\" }\n  - { role: containerd, when: \"CONTAINER_RUNTIME == 'containerd'\" }\n  - kube-lb\n  - kube-master\n  - kube-node\n  - { role: calico, when: \"CLUSTER_NETWORK == 'calico'\" }\n  - { role: cilium, when: \"CLUSTER_NETWORK == 'cilium'\" }\n  - { role: flannel, when: \"CLUSTER_NETWORK == 'flannel'\" }\n  - { role: kube-router, when: \"CLUSTER_NETWORK == 'kube-router'\" }\n  - { role: kube-ovn, when: \"CLUSTER_NETWORK == 'kube-ovn'\" }\n"
  },
  {
    "path": "playbooks/31.deletcd.yml",
    "content": "# WARNNING:  this playbook will clean the etcd {{ ETCD_TO_DEL }} \n\n- hosts: localhost \n  vars_prompt:\n  - name: \"ETCD_TO_DEL\"\n    prompt: \"which etcd node is about to be deleted?(e.g 192.168.1.1)\"\n    private: no\n    confirm: yes\n  tasks:\n  # step0: run prechecks\n  - fail: msg=\"{{ ETCD_TO_DEL }} is NOT a member of etcd cluster!\"\n    when: \"ETCD_TO_DEL not in groups['etcd']\" \n\n  - fail: msg=\"you CAN NOT delete the last member of etcd cluster!\"\n    when: \"groups['etcd']|length < 2\" \n\n  - block:\n    # step1: find a healthy member in the etcd cluster\n    - name: set NODE_IPS of the etcd cluster\n      set_fact: NODE_IPS=\"{% for host in groups['etcd'] %}{{ host }} {% endfor %}\"\n\n    - name: get etcd cluster status\n      shell: 'for ip in {{ NODE_IPS }};do \\\n                ETCDCTL_API=3 {{ base_dir }}/bin/etcdctl \\\n                --endpoints=https://\"$ip\":2379 \\\n                --cacert={{ cluster_dir }}/ssl/ca.pem \\\n                --cert={{ cluster_dir }}/ssl/etcd.pem \\\n                --key={{ cluster_dir }}/ssl/etcd-key.pem \\\n                endpoint health; \\\n              done'\n      register: ETCD_CLUSTER_STATUS\n      ignore_errors: true\n\n    - debug: var=\"ETCD_CLUSTER_STATUS\"\n\n    - name: get a running ectd node\n      shell: 'echo -e \"{{ ETCD_CLUSTER_STATUS.stdout }}\" \\\n               \"{{ ETCD_CLUSTER_STATUS.stderr }}\" \\\n               |grep \"is healthy\"|sed -n \"1p\"|cut -d: -f2|cut -d/ -f3'\n      register: RUNNING_NODE\n\n    - debug: var=\"RUNNING_NODE.stdout\"\n\n    # step2: remove jobs run on the healthy member\n    - name: get ID of etcd node to delete\n      shell: \"ETCDCTL_API=3 {{ bin_dir }}/etcdctl member list \\\n              |grep {{ ETCD_TO_DEL }}:2380|cut -d',' -f1\"\n      register: ETCD_ID\n      delegate_to: \"{{ RUNNING_NODE.stdout }}\"\n  \n    - name: get NAME of etcd node to delete\n      shell: \"ETCDCTL_API=3 {{ bin_dir }}/etcdctl member list \\\n              |grep {{ ETCD_TO_DEL }}:2380|cut -d' ' -f3|cut -d',' -f1\"\n      register: ETCD_NAME\n      delegate_to: \"{{ RUNNING_NODE.stdout }}\"\n  \n    - debug: var=\"ETCD_NAME.stdout\"\n\n    - name: delete a etcd member\n      shell: \"ETCDCTL_API=3 {{ bin_dir }}/etcdctl member remove {{ ETCD_ID.stdout }}\"\n      delegate_to: \"{{ RUNNING_NODE.stdout }}\"\n      when: \"ETCD_ID.stdout != ''\"\n  \n    - name: clean etcd {{ ETCD_TO_DEL }}\n      shell: \"cd {{ base_dir }} && ansible-playbook -i clusters/{{ CLUSTER }}/hosts \\\n                roles/clean/clean_node.yml \\\n                -e NODE_TO_CLEAN={{ ETCD_TO_DEL }} \\\n                -e DEL_ETCD=yes >> /tmp/ansible-`date +'%Y%m%d%H%M%S'`.log 2>&1 \\\n              || echo 'data not cleaned on {{ ETCD_TO_DEL }}'\"\n      register: CLEAN_STATUS\n\n    - debug: var=\"CLEAN_STATUS\"\n\n    # lineinfile is inadequate to delete lines between some specific line range\n    - name: remove the etcd's node entry in hosts\n      shell: 'sed -i \"/^\\[etcd/,/^\\[kube_master/ {/^{{ ETCD_TO_DEL }}$/d}\" {{ base_dir }}/clusters/{{ CLUSTER }}/hosts'\n\n    # lineinfile is inadequate to delete lines between some specific line range\n    - name: remove the etcd's node entry in hosts\n      shell: 'sed -i \"/^\\[etcd/,/^\\[kube_master/ {/^{{ ETCD_TO_DEL }} /d}\" {{ base_dir }}/clusters/{{ CLUSTER }}/hosts'\n    when: \"groups['etcd']|length > 1 and ETCD_TO_DEL in groups['etcd']\" \n"
  },
  {
    "path": "playbooks/32.delnode.yml",
    "content": "# WARNNING:  this playbook will clean the node {{ NODE_TO_DEL }}\n\n- hosts: localhost \n  tasks:\n  - fail: msg=\"you CAN NOT delete the last member of kube_master!\"\n    when: \"groups['kube_master']|length < 2 and NODE_TO_DEL in groups['kube_master']\"\n\n  - name: 注册变量 K8S 主版本\n    shell: echo {{ K8S_VER }}|awk -F. '{print $1\".\"$2}'\n    register: K8S_VER_MAIN\n\n  - name: 设置kubectl drain 参数\n    set_fact: DRAIN_OPT=\"--delete-emptydir-data --ignore-daemonsets --force\"\n    when: \"K8S_VER_MAIN.stdout|float > 1.19\"\n\n  - name: 设置kubectl drain 参数\n    set_fact: DRAIN_OPT=\"--delete-local-data --ignore-daemonsets --force\"\n    when: \"K8S_VER_MAIN.stdout|float < 1.20\"\n\n  - name: debug info\n    debug: var=\"DRAIN_OPT\"\n\n  - name: get the node name to delete\n    shell: \"{{ base_dir }}/bin/kubectl get node -owide|grep ' {{ NODE_TO_DEL }} '|awk '{print $1}'\"\n    register: NODE_NAME\n\n  - debug: var=\"NODE_NAME.stdout\"\n\n  - name: run kubectl drain @{{ NODE_NAME.stdout }}\n    shell: \"{{ base_dir }}/bin/kubectl drain {{ NODE_NAME.stdout }} {{ DRAIN_OPT }}\"\n    #ignore_errors: true\n\n  - name: clean node {{ NODE_TO_DEL }}\n    shell: \"cd {{ base_dir }} && ansible-playbook -i clusters/{{ CLUSTER }}/hosts \\\n              roles/clean/clean_node.yml \\\n              -e NODE_TO_CLEAN={{ NODE_TO_DEL }} \\\n              -e DEL_NODE=yes \\\n              -e DEL_LB=yes >> /tmp/ansible-`date +'%Y%m%d%H%M%S'`.log 2>&1 \\\n            || echo 'data not cleaned on {{ NODE_TO_DEL }}'\"\n    register: CLEAN_STATUS\n\n  - debug: var=\"CLEAN_STATUS\"\n\n  - name: run kubectl delete node {{ NODE_NAME.stdout }}\n    shell: \"{{ base_dir }}/bin/kubectl delete node {{ NODE_NAME.stdout }}\"\n    ignore_errors: true\n\n  # lineinfile is inadequate to delete lines between some specific line range\n  - name: remove the node's entry in hosts\n    shell: 'sed -i \"/^\\[kube_node/,/^\\[harbor/ {/^{{ NODE_TO_DEL }}$/d}\" {{ base_dir }}/clusters/{{ CLUSTER }}/hosts'\n\n  # lineinfile is inadequate to delete lines between some specific line range\n  - name: remove the node's entry in hosts\n    shell: 'sed -i \"/^\\[kube_node/,/^\\[harbor/ {/^{{ NODE_TO_DEL }} /d}\" {{ base_dir }}/clusters/{{ CLUSTER }}/hosts'\n"
  },
  {
    "path": "playbooks/33.delmaster.yml",
    "content": "# WARNNING:  this playbook will clean the kube_master node {{ NODE_TO_DEL }}\n\n- hosts: localhost\n  tasks:\n  - fail: msg=\"you CAN NOT delete the last member of kube_master!\"\n    when: \"groups['kube_master']|length < 2 and NODE_TO_DEL in groups['kube_master']\"\n\n  - name: 注册变量 K8S 主版本\n    shell: echo {{ K8S_VER }}|awk -F. '{print $1\".\"$2}'\n    register: K8S_VER_MAIN\n\n  - name: 设置kubectl drain 参数\n    set_fact: DRAIN_OPT=\"--delete-emptydir-data --ignore-daemonsets --force\"\n    when: \"K8S_VER_MAIN.stdout|float > 1.19\"\n\n  - name: 设置kubectl drain 参数\n    set_fact: DRAIN_OPT=\"--delete-local-data --ignore-daemonsets --force\"\n    when: \"K8S_VER_MAIN.stdout|float < 1.20\"\n\n  - name: debug info\n    debug: var=\"DRAIN_OPT\"\n\n  - name: get the node name to delete\n    shell: \"{{ base_dir }}/bin/kubectl get node -owide|grep ' {{ NODE_TO_DEL }} '|awk '{print $1}'\"\n    register: NODE_NAME\n\n  - debug: var=\"NODE_NAME.stdout\"\n\n  - name: run kubectl drain @{{ NODE_NAME.stdout }}\n    shell: \"{{ base_dir }}/bin/kubectl drain {{ NODE_NAME.stdout }} {{ DRAIN_OPT }}\"\n    #ignore_errors: true\n\n  - name: clean node {{ NODE_TO_DEL }}\n    shell: \"cd {{ base_dir }} && ansible-playbook -i clusters/{{ CLUSTER }}/hosts \\\n              roles/clean/clean_node.yml \\\n              -e NODE_TO_CLEAN={{ NODE_TO_DEL }} \\\n              -e DEL_MASTER=yes \\\n              -e DEL_NODE=yes \\\n              -e DEL_LB=yes >> /tmp/ansible-`date +'%Y%m%d%H%M%S'`.log 2>&1 \\\n            || echo 'data not cleaned on {{ NODE_TO_DEL }}'\"\n    register: CLEAN_STATUS\n\n  - debug: var=\"CLEAN_STATUS\"\n\n  # lineinfile is inadequate to delete lines between some specific line range\n  - name: remove the master's entry in hosts\n    shell: 'sed -i \"/^\\[kube_master/,/^\\[harbor/ {/^{{ NODE_TO_DEL }}$/d}\" {{ base_dir }}/clusters/{{ CLUSTER }}/hosts'\n\n  # lineinfile is inadequate to delete lines between some specific line range\n  - name: remove the master's entry in hosts\n    shell: 'sed -i \"/^\\[kube_master/,/^\\[harbor/ {/^{{ NODE_TO_DEL }} /d}\" {{ base_dir }}/clusters/{{ CLUSTER }}/hosts'\n"
  },
  {
    "path": "playbooks/90.setup.yml",
    "content": "# [optional] to synchronize time of nodes with 'chrony'\n- hosts:\n  - kube_master\n  - kube_node\n  - etcd\n  - ex_lb\n  - chrony\n  roles:\n  - { role: os-harden, when: \"OS_HARDEN|bool\" }\n  - { role: chrony, when: \"groups['chrony']|length > 0\" }\n\n# to create CA, kubeconfig, kube-proxy.kubeconfig etc.\n- hosts: localhost\n  roles:\n  - deploy\n\n# prepare tasks for all nodes\n- hosts:\n  - kube_master\n  - kube_node\n  - etcd\n  roles:\n  - prepare\n\n# to install etcd cluster\n- hosts: etcd\n  roles:\n  - etcd\n\n# to install container runtime\n- hosts:\n  - kube_master\n  - kube_node\n  roles:\n  - { role: docker, when: \"CONTAINER_RUNTIME == 'docker'\" }\n  - { role: containerd, when: \"CONTAINER_RUNTIME == 'containerd'\" }\n\n# to set up 'kube_master' nodes\n- hosts: kube_master\n  roles:\n  - kube-lb\n  - kube-master\n  - kube-node\n\n# to set up 'kube_node' nodes\n- hosts: kube_node\n  roles:\n  - { role: kube-lb, when: \"inventory_hostname not in groups['kube_master']\" }\n  - { role: kube-node, when: \"inventory_hostname not in groups['kube_master']\" }\n\n# to install network plugin, only one can be choosen\n- hosts:\n  - kube_master\n  - kube_node\n  roles:\n  - { role: calico, when: \"CLUSTER_NETWORK == 'calico'\" }\n  - { role: cilium, when: \"CLUSTER_NETWORK == 'cilium'\" }\n  - { role: flannel, when: \"CLUSTER_NETWORK == 'flannel'\" }\n  - { role: kube-router, when: \"CLUSTER_NETWORK == 'kube-router'\" }\n  - { role: kube-ovn, when: \"CLUSTER_NETWORK == 'kube-ovn'\" }\n\n# to install cluster-addons\n- hosts: localhost\n  roles:\n  - cluster-addon\n"
  },
  {
    "path": "playbooks/91.start.yml",
    "content": "- hosts: etcd\n  tasks:\n  - name: starting etcd cluster\n    service: name=etcd state=started enabled=yes\n\n- hosts:\n  - kube_master\n  - kube_node\n  tasks:\n  - name: starting kube-lb\n    service: name=kube-lb state=started enabled=yes\n\n- hosts: kube_master\n  tasks:\n  - name: starting kube_master services\n    service: name={{ item }} state=started enabled=yes\n    with_items:\n    - kube-apiserver\n    - kube-controller-manager\n    - kube-scheduler\n\n- hosts:\n  - kube_master\n  - kube_node\n  tasks:\n  - name: starting docker\n    service: name=docker state=started enabled=yes\n    when: \"CONTAINER_RUNTIME == 'docker'\"\n\n  - name: starting containerd\n    service: name=containerd state=started enabled=yes\n    when: \"CONTAINER_RUNTIME == 'containerd'\"\n\n  - name: starting kube_node services\n    service: name={{ item }} state=started enabled=yes\n    with_items:\n    - kubelet\n    - kube-proxy\n\n- hosts: ex_lb\n  tasks:\n  - name: starting external loadbalance\n    service: name={{ item }} state=started enabled=yes\n    with_items:\n    - l4lb\n    - keepalived\n"
  },
  {
    "path": "playbooks/92.stop.yml",
    "content": "- hosts: kube_master\n  tasks:\n  - name: stopping kube_master services\n    service: name={{ item }} state=stopped enabled=no\n    with_items:\n    - kube-apiserver\n    - kube-controller-manager\n    - kube-scheduler\n\n- hosts: etcd\n  tasks:\n  - name: stopping etcd cluster\n    service: name=etcd state=stopped enabled=no\n\n- hosts: ex_lb\n  tasks:\n  - name: stopping external loadbalance\n    service: name={{ item }} state=stopped enabled=no\n    with_items:\n    - l4lb\n    - keepalived\n\n- hosts:\n  - kube_master\n  - kube_node\n  tasks:\n  - name: stopping kube_node services\n    service: name={{ item }} state=stopped enabled=no\n    with_items:\n    - kube-lb\n    - kubelet\n    - kube-proxy\n\n  - name: stopping docker\n    service: name=docker state=stopped enabled=no\n    when: \"CONTAINER_RUNTIME == 'docker'\"\n\n  - name: stopping containerd\n    service: name=containerd state=stopped enabled=no\n    when: \"CONTAINER_RUNTIME == 'containerd'\"\n"
  },
  {
    "path": "playbooks/93.upgrade.yml",
    "content": "# WARNING: Upgrade the k8s cluster can be risky. Make sure you know what you are doing.\n# Read the guide: 'op/upgrade.md' .\n# Usage: ezctl upgrade <cluster_name>\n\n# check k8s version\n- hosts: kube_master\n  tasks:\n  - name: get running k8s version\n    shell: \"{{ bin_dir }}/kube-apiserver --version\"\n    register: RUNNING_VER\n    run_once: true\n\n  - name: print running version\n    debug: var=\"RUNNING_VER.stdout\"\n    run_once: true\n\n  - name: get update version\n    shell: \"{{ base_dir }}/bin/kube-apiserver --version\"\n    register: UPDATE_VER\n    run_once: true\n    connection: local\n\n  - name: print update version\n    debug: var=\"UPDATE_VER.stdout\"\n    run_once: true\n\n  - name: check version\n    fail: msg=\"running version is the same as the update version, UPDATE ABORT.\"\n    when: \"RUNNING_VER.stdout == UPDATE_VER.stdout\"\n\n# update masters\n- hosts: \n  - kube_master\n  roles:\n  - kube-master\n  - kube-node\n\n# update nodes\n- hosts: \n  - kube_node\n  roles:\n  - { role: kube-node, when: \"inventory_hostname not in groups['kube_master']\" }\n"
  },
  {
    "path": "playbooks/94.backup.yml",
    "content": "# cluster-backup playbook\n# read the guide: 'op/cluster_restore.md'\n\n- hosts:\n  - localhost\n  tasks:\n  # step1: find a healthy member in the etcd cluster\n  - name: set NODE_IPS of the etcd cluster\n    set_fact: NODE_IPS=\"{% for host in groups['etcd'] %}{{ host }} {% endfor %}\"\n\n  - name: get etcd cluster status\n    shell: 'for ip in {{ NODE_IPS }};do \\\n              ETCDCTL_API=3 {{ base_dir }}/bin/etcdctl \\\n              --endpoints=https://\"$ip\":2379 \\\n              --cacert={{ cluster_dir }}/ssl/ca.pem \\\n              --cert={{ cluster_dir }}/ssl/etcd.pem \\\n              --key={{ cluster_dir }}/ssl/etcd-key.pem \\\n              endpoint health; \\\n            done'\n    register: ETCD_CLUSTER_STATUS\n    ignore_errors: true\n\n  - debug: var=\"ETCD_CLUSTER_STATUS\"\n\n  - name: get a running ectd node\n    shell: 'echo -e \"{{ ETCD_CLUSTER_STATUS.stdout }}\" \\\n             \"{{ ETCD_CLUSTER_STATUS.stderr }}\" \\\n             |grep \"is healthy\"|sed -n \"1p\"|cut -d: -f2|cut -d/ -f3'\n    register: RUNNING_NODE\n\n  - debug: var=\"RUNNING_NODE.stdout\"\n\n  - name: get current time\n    shell: \"date +'%Y%m%d%H%M'\"\n    register: timestamp\n\n  # step2: backup data to the ansible node \n  - name: make a backup on the etcd node\n    shell: \"mkdir -p {{ cluster_dir }}/backup && cd {{ cluster_dir }}/backup && \\\n        ETCDCTL_API=3 {{ base_dir }}/bin/etcdctl \\\n              --endpoints=https://{{ RUNNING_NODE.stdout }}:2379 \\\n              --cacert={{ cluster_dir }}/ssl/ca.pem \\\n              --cert={{ cluster_dir }}/ssl/etcd.pem \\\n              --key={{ cluster_dir }}/ssl/etcd-key.pem \\\n        snapshot save snapshot_{{ timestamp.stdout }}.db\"\n\n  - name: update the latest backup\n    shell: 'cd {{ cluster_dir }}/backup/ && /bin/cp -f snapshot_{{ timestamp.stdout }}.db snapshot.db'\n"
  },
  {
    "path": "playbooks/95.restore.yml",
    "content": "# cluster-restore playbook\n# read the guide: 'op/cluster_restore.md'\n# https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#restoring-an-etcd-cluster\n\n- hosts: kube_master\n  tasks:\n  - name: stopping kube_master services\n    service: name={{ item }} state=stopped\n    with_items:\n    - kube-apiserver\n    - kube-controller-manager\n    - kube-scheduler\n\n- hosts:\n  - kube_master\n  - kube_node\n  tasks:\n  - name: stopping kube_node services\n    service: name={{ item }} state=stopped\n    with_items:\n    - kubelet\n    - kube-proxy\n\n- hosts: etcd\n  roles:\n  - cluster-restore\n\n- hosts: kube_master\n  tasks:\n  - name: starting kube_master services\n    service: name={{ item }} state=started enabled=yes\n    with_items:\n    - kube-apiserver\n    - kube-controller-manager\n    - kube-scheduler\n\n- hosts:\n  - kube_master\n  - kube_node\n  tasks:\n  - name: starting kube_node services\n    service: name={{ item }} state=started enabled=yes\n    with_items:\n    - kubelet\n    - kube-proxy\n"
  },
  {
    "path": "playbooks/96.update-certs.yml",
    "content": "# Note: this scripts should be used with caution.\n# Force to recreate CA certs and all of the others certs used in the cluster. \n# It should be used when the admin.conf leaked, and a new one will be created in place of the leaked one.\n\n# backup old certs\n- hosts: localhost\n  tasks:\n  - name: backup old certs\n    shell: \"cd {{ cluster_dir }} && \\\n         cp -r ssl ssl-$(date +'%Y%m%d%H%M')\"\n    tags: force_change_certs\n\n# to create CA, kubeconfig, kube-proxy.kubeconfig etc.\n# need to set 'CHANGE_CA=true'\n- hosts: localhost\n  roles:\n  - deploy\n\n# to install etcd cluster\n# to run with '-t force_change_certs'\n- hosts: etcd\n  roles:\n  - etcd\n\n# to set up 'kube_master' nodes\n# to run with '-t force_change_certs'\n- hosts: kube_master\n  roles:\n  - kube-master\n\n# to set up 'kube_node' nodes\n# to run with '-t force_change_certs'\n- hosts:\n  - kube_master\n  - kube_node\n  roles:\n  - kube-node \n\n# to install network plugin, only one can be choosen\n# to run with '-t force_change_certs'\n- hosts:\n  - kube_master\n  - kube_node\n  roles:\n  - { role: calico, when: \"CLUSTER_NETWORK == 'calico'\" }\n  - { role: cilium, when: \"CLUSTER_NETWORK == 'cilium'\" }\n  - { role: flannel, when: \"CLUSTER_NETWORK == 'flannel'\" }\n  - { role: kube-router, when: \"CLUSTER_NETWORK == 'kube-router'\" }\n  - { role: kube-ovn, when: \"CLUSTER_NETWORK == 'kube-ovn'\" }\n\n# to install cluster-addons\n- hosts: localhost\n  roles:\n  - cluster-addon\n"
  },
  {
    "path": "playbooks/99.clean.yml",
    "content": "# WARNING: This playbook will erase the entire k8s-cluster, include PODs, ETCD data etc.\n# Make sure you know what you are doing.\n\n- hosts:\n  - kube_master\n  - kube_node\n  - ex_lb\n  - etcd\n  vars:\n    DEL_MASTER: \"yes\"\n    DEL_NODE: \"yes\"\n    DEL_ETCD: \"yes\"\n    DEL_LB: \"yes\"\n    DEL_CHRONY: \"yes\"\n    DEL_ENV: \"yes\"\n  roles:\n  - clean\n"
  },
  {
    "path": "roles/calico/tasks/calico-rr.yml",
    "content": "- block:\n    - name: 选择rr节点(master节点)\n      set_fact: NODE_IPS=\"{% for host in groups['kube_master'] %}{{ host }} {% endfor %}\"\n      when: \"CALICO_RR_NODES|length == 0\"\n\n    - name: 选择rr节点\n      set_fact: NODE_IPS=\"{% for host in CALICO_RR_NODES %}{{ host }} {% endfor %}\"\n      when: \"CALICO_RR_NODES|length > 0\"\n\n    - name: 显示rr节点\n      debug: var=\"NODE_IPS\"\n\n    - name: 配置routeReflectorClusterID\n      shell: 'for ip in {{ NODE_IPS }};do \\\n                node_name=$({{ bin_dir }}/calicoctl get node -owide|grep \" $ip/\"|cut -d\" \" -f1) && \\\n                {{ bin_dir }}/calicoctl patch node \"$node_name\" \\\n                  -p \"{\\\"spec\\\": {\\\"bgp\\\": {\\\"routeReflectorClusterID\\\": \\\"244.0.0.1\\\"}}}\"; \\\n             done'\n\n    - name: node label\n      shell: 'for ip in {{ NODE_IPS }};do \\\n                node_name=$({{ bin_dir }}/calicoctl get node -owide|grep \" $ip/\"|cut -d\" \" -f1) && \\\n                {{ base_dir }}/bin/kubectl label node \"$node_name\" route-reflector=true --overwrite;\n             done'\n      connection: local\n\n    - name: 配置 calico bgp yaml文件\n      template: src={{ item }}.j2 dest=/etc/calico/{{ item }}\n      with_items:\n      - \"bgp-default.yaml\"\n      - \"bgp-rr.yaml\"\n\n    - name: 应用 calico bgp 配置\n      shell: \"{{ bin_dir }}/calicoctl apply -f /etc/calico/bgp-rr.yaml && \\\n            sleep 5 && \\\n            {{ bin_dir }}/calicoctl apply -f /etc/calico/bgp-default.yaml && sleep 2\"\n  run_once: true\n\n- name: 查看bgp连接\n  shell: \"{{ bin_dir }}/calicoctl node status\"\n  register: bgp_status\n\n- debug: var=\"bgp_status.stdout_lines\"\n"
  },
  {
    "path": "roles/calico/tasks/main.yml",
    "content": "- block:\n    - name: 创建calico 证书请求\n      template: src=calico-csr.json.j2 dest={{ cluster_dir }}/ssl/calico-csr.json\n\n    - name: 创建 calico证书和私钥\n      shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n            -ca=ca.pem \\\n            -ca-key=ca-key.pem \\\n            -config=ca-config.json \\\n            -profile=kubernetes calico-csr.json|{{ base_dir }}/bin/cfssljson -bare calico\"\n\n    - name: 删除旧 calico-etcd-secrets\n      shell: \"{{ base_dir }}/bin/kubectl -n kube-system delete secrets calico-etcd-secrets || echo NotFound\"\n\n    - name: 创建 calico-etcd-secrets\n      shell: \"cd {{ cluster_dir }}/ssl && \\\n            {{ base_dir }}/bin/kubectl create secret generic -n kube-system calico-etcd-secrets \\\n            --from-file=etcd-ca=ca.pem \\\n            --from-file=etcd-key=calico-key.pem \\\n            --from-file=etcd-cert=calico.pem\"\n\n    - name: 配置 calico DaemonSet yaml文件\n      template: src=calico-{{ calico_ver_main }}.yaml.j2 dest={{ cluster_dir }}/yml/calico.yaml\n\n    - name: 删除 calico网络\n      shell: \"{{ base_dir }}/bin/kubectl delete -f {{ cluster_dir }}/yml/calico.yaml || echo NotFound; sleep 3\"\n      when: 'CHANGE_CA|bool'\n\n    - name: 运行 calico网络\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/calico.yaml\"\n  run_once: true\n  connection: local\n  tags: force_change_certs\n\n- name: 在节点创建相关目录\n  file: name={{ item }} state=directory\n  with_items:\n  - /etc/calico/ssl\n\n- name: 分发calico证书相关\n  copy: src={{ cluster_dir }}/ssl/{{ item }} dest=/etc/calico/ssl/{{ item }}\n  with_items:\n  - ca.pem\n  - calico.pem\n  - calico-key.pem\n  tags: force_change_certs\n\n- name: 删除默认cni配置\n  file: path=/etc/cni/net.d/10-default.conf state=absent\n\n- name: 下载calicoctl 客户端\n  copy: src={{ base_dir }}/bin/{{ item }} dest={{ bin_dir }}/{{ item }} mode=0755\n  with_items:\n  #- calico\n  - calicoctl\n  ignore_errors: true\n\n- name: 准备 calicoctl配置文件\n  template: src=calicoctl.cfg.j2 dest=/etc/calico/calicoctl.cfg\n\n- name: 轮询等待calico-node 运行\n  shell: \"{{ base_dir }}/bin/kubectl get pod -n kube-system -o wide|grep 'calico-node'|grep ' {{ K8S_NODENAME }} '|awk '{print $3}'\"\n  register: pod_status\n  until: pod_status.stdout == \"Running\"\n  retries: 15\n  delay: 15\n  ignore_errors: true\n  connection: local\n  tags: force_change_certs\n\n- import_tasks: calico-rr.yml\n  when: 'CALICO_RR_ENABLED|bool'\n  tags: force_change_certs\n"
  },
  {
    "path": "roles/calico/templates/bgp-default.yaml.j2",
    "content": "apiVersion: projectcalico.org/v3\nkind: BGPConfiguration\nmetadata:\n  name: default\nspec:\n  logSeverityScreen: Info\n  nodeToNodeMeshEnabled: false\n  asNumber: {{ CALICO_AS_NUMBER }}\n"
  },
  {
    "path": "roles/calico/templates/bgp-rr.yaml.j2",
    "content": "kind: BGPPeer\napiVersion: projectcalico.org/v3\nmetadata:\n  name: peer-with-route-reflectors\nspec:\n  nodeSelector: all()\n  peerSelector: route-reflector == 'true'\n"
  },
  {
    "path": "roles/calico/templates/calico-csr.json.j2",
    "content": "{\n  \"CN\": \"calico\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/calico/templates/calico-v3.24.yaml.j2",
    "content": "---\n# download Release archive (https://github.com/projectcalico/calico/releases/download/v3.24.5/release-v3.24.5.tgz)\n# Release notes: https://projectcalico.docs.tigera.io/archive/v3.24/release-notes/\n\n# Datastore: etcd, using Typha is redundant and not recommended.\n# Kubeasz uses cmd-line-way( kubectl create) to create etcd-secrets, see more in 'roles/calico/tasks/main.yml'\n\n# source from: release-v3.24.5/manifests/calico-etcd.yaml\n\n# Source: calico/templates/calico-kube-controllers.yaml\n# This manifest creates a Pod Disruption Budget for Controller to allow K8s Cluster Autoscaler to evict\n\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: calico-kube-controllers\n  namespace: kube-system\n  labels:\n    k8s-app: calico-kube-controllers\nspec:\n  maxUnavailable: 1\n  selector:\n    matchLabels:\n      k8s-app: calico-kube-controllers\n---\n# Source: calico/templates/calico-kube-controllers.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: calico-kube-controllers\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: calico-node\n  namespace: kube-system\n---\n# Source: calico/templates/calico-config.yaml\n# This ConfigMap is used to configure a self-hosted Calico installation.\nkind: ConfigMap\napiVersion: v1\nmetadata:\n  name: calico-config\n  namespace: kube-system\ndata:\n  # Configure this with the location of your etcd cluster.\n  etcd_endpoints: \"{{ ETCD_ENDPOINTS }}\"\n  # If you're using TLS enabled etcd uncomment the following.\n  # You must also populate the Secret below with these files.\n  etcd_ca: \"/calico-secrets/etcd-ca\"\n  etcd_cert: \"/calico-secrets/etcd-cert\"\n  etcd_key: \"/calico-secrets/etcd-key\"\n  # Typha is disabled.\n  typha_service_name: \"none\"\n  # Configure the backend to use.\n  calico_backend: \"{{ CALICO_NETWORKING_BACKEND }}\"\n\n  # Configure the MTU to use for workload interfaces and tunnels.\n  # By default, MTU is auto-detected, and explicitly setting this field should not be required.\n  # You can override auto-detection by providing a non-zero value.\n  veth_mtu: \"0\"\n\n  # The CNI network configuration to install on each node. The special\n  # values in this config will be automatically populated.\n  cni_network_config: |-\n    {\n      \"name\": \"k8s-pod-network\",\n      \"cniVersion\": \"0.3.1\",\n      \"plugins\": [\n        {\n          \"type\": \"calico\",\n          \"log_level\": \"info\",\n          \"log_file_path\": \"/var/log/calico/cni/cni.log\",\n          \"etcd_endpoints\": \"{{ ETCD_ENDPOINTS }}\",\n          \"etcd_key_file\": \"/etc/calico/ssl/calico-key.pem\",\n          \"etcd_cert_file\": \"/etc/calico/ssl/calico.pem\",\n          \"etcd_ca_cert_file\": \"{{ ca_dir }}/ca.pem\",\n          \"mtu\": __CNI_MTU__,\n          \"ipam\": {\n              \"type\": \"calico-ipam\"\n          },\n          \"policy\": {\n              \"type\": \"k8s\"\n          },\n          \"kubernetes\": {\n              \"kubeconfig\": \"/etc/cni/net.d/calico-kubeconfig\"\n          }\n        },\n        {\n          \"type\": \"portmap\",\n          \"snat\": true,\n          \"capabilities\": {\"portMappings\": true}\n        },\n        {\n          \"type\": \"bandwidth\",\n          \"capabilities\": {\"bandwidth\": true}\n        }\n      ]\n    }\n---\n# Source: calico/templates/calico-kube-controllers-rbac.yaml\n# Include a clusterrole for the kube-controllers component,\n# and bind it to the calico-kube-controllers serviceaccount.\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-kube-controllers\nrules:\n  # Pods are monitored for changing labels.\n  # The node controller monitors Kubernetes nodes.\n  # Namespace and serviceaccount labels are used for policy.\n  - apiGroups: [\"\"]\n    resources:\n      - pods\n      - nodes\n      - namespaces\n      - serviceaccounts\n    verbs:\n      - watch\n      - list\n      - get\n  # Watch for changes to Kubernetes NetworkPolicies.\n  - apiGroups: [\"networking.k8s.io\"]\n    resources:\n      - networkpolicies\n    verbs:\n      - watch\n      - list\n---\n# Source: calico/templates/calico-node-rbac.yaml\n# Include a clusterrole for the calico-node DaemonSet,\n# and bind it to the calico-node serviceaccount.\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-node\nrules:\n  # Used for creating service account tokens to be used by the CNI plugin\n  - apiGroups: [\"\"]\n    resources:\n      - serviceaccounts/token\n    resourceNames:\n      - calico-node\n    verbs:\n      - create\n  # The CNI plugin needs to get pods, nodes, and namespaces.\n  - apiGroups: [\"\"]\n    resources:\n      - pods\n      - nodes\n      - namespaces\n    verbs:\n      - get\n  # EndpointSlices are used for Service-based network policy rule\n  # enforcement.\n  - apiGroups: [\"discovery.k8s.io\"]\n    resources:\n      - endpointslices\n    verbs:\n      - watch\n      - list\n  - apiGroups: [\"\"]\n    resources:\n      - endpoints\n      - services\n    verbs:\n      # Used to discover service IPs for advertisement.\n      - watch\n      - list\n  # Pod CIDR auto-detection on kubeadm needs access to config maps.\n  - apiGroups: [\"\"]\n    resources:\n      - configmaps\n    verbs:\n      - get\n  - apiGroups: [\"\"]\n    resources:\n      - nodes/status\n    verbs:\n      # Needed for clearing NodeNetworkUnavailable flag.\n      - patch\n---\n# Source: calico/templates/calico-kube-controllers-rbac.yaml\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-kube-controllers\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: calico-kube-controllers\nsubjects:\n- kind: ServiceAccount\n  name: calico-kube-controllers\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node-rbac.yaml\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: calico-node\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: calico-node\nsubjects:\n- kind: ServiceAccount\n  name: calico-node\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node.yaml\n# This manifest installs the calico-node container, as well\n# as the CNI plugins and network config on\n# each master and worker node in a Kubernetes cluster.\nkind: DaemonSet\napiVersion: apps/v1\nmetadata:\n  name: calico-node\n  namespace: kube-system\n  labels:\n    k8s-app: calico-node\nspec:\n  selector:\n    matchLabels:\n      k8s-app: calico-node\n  updateStrategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxUnavailable: 1\n  template:\n    metadata:\n      labels:\n        k8s-app: calico-node\n    spec:\n      nodeSelector:\n        kubernetes.io/os: linux\n      hostNetwork: true\n      tolerations:\n        # Make sure calico-node gets scheduled on all nodes.\n        - effect: NoSchedule\n          operator: Exists\n        # Mark the pod as a critical add-on for rescheduling.\n        - key: CriticalAddonsOnly\n          operator: Exists\n        - effect: NoExecute\n          operator: Exists\n      serviceAccountName: calico-node\n      # Minimize downtime during a rolling upgrade or deletion; tell Kubernetes to do a \"force\n      # deletion\": https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods.\n      terminationGracePeriodSeconds: 0\n      priorityClassName: system-node-critical\n      initContainers:\n        # This container installs the CNI binaries\n        # and CNI network config file on each node.\n        - name: install-cni\n          image: easzlab.io.local:5000/easzlab/cni:{{ calico_ver }}\n          imagePullPolicy: IfNotPresent\n          command: [\"/opt/cni/bin/install\"]\n          envFrom:\n          - configMapRef:\n              # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.\n              name: kubernetes-services-endpoint\n              optional: true\n          env:\n            # Name of the CNI config file to create.\n            - name: CNI_CONF_NAME\n              value: \"10-calico.conflist\"\n            # The CNI network config to install on each node.\n            - name: CNI_NETWORK_CONFIG\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: cni_network_config\n            # The location of the etcd cluster.\n            - name: ETCD_ENDPOINTS\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_endpoints\n            # CNI MTU Config variable\n            - name: CNI_MTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # Prevents the container from sleeping forever.\n            - name: SLEEP\n              value: \"false\"\n          volumeMounts:\n            - mountPath: /host/opt/cni/bin\n              name: cni-bin-dir\n            - mountPath: /host/etc/cni/net.d\n              name: cni-net-dir\n            - mountPath: /calico-secrets\n              name: etcd-certs\n          securityContext:\n            privileged: true\n        # This init container mounts the necessary filesystems needed by the BPF data plane\n        # i.e. bpf at /sys/fs/bpf and cgroup2 at /run/calico/cgroup. Calico-node initialisation is executed\n        # in best effort fashion, i.e. no failure for errors, to not disrupt pod creation in iptable mode.\n        - name: \"mount-bpffs\"\n          image: easzlab.io.local:5000/easzlab/node:{{ calico_ver }} \n          imagePullPolicy: IfNotPresent\n          command: [\"calico-node\", \"-init\", \"-best-effort\"]\n          volumeMounts:\n            - mountPath: /sys/fs\n              name: sys-fs\n              # Bidirectional is required to ensure that the new mount we make at /sys/fs/bpf propagates to the host\n              # so that it outlives the init container.\n              mountPropagation: Bidirectional\n            - mountPath: /var/run/calico\n              name: var-run-calico\n              # Bidirectional is required to ensure that the new mount we make at /run/calico/cgroup propagates to the host\n              # so that it outlives the init container.\n              mountPropagation: Bidirectional\n            # Mount /proc/ from host which usually is an init program at /nodeproc. It's needed by mountns binary,\n            # executed by calico-node, to mount root cgroup2 fs at /run/calico/cgroup to attach CTLB programs correctly.\n            - mountPath: /nodeproc\n              name: nodeproc\n              readOnly: true\n          securityContext:\n            privileged: true\n      containers:\n        # Runs calico-node container on each Kubernetes node. This\n        # container programs network policy and routes on each\n        # host.\n        - name: calico-node\n          image: easzlab.io.local:5000/easzlab/node:{{ calico_ver }}\n          imagePullPolicy: IfNotPresent\n          envFrom:\n          - configMapRef:\n              # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.\n              name: kubernetes-services-endpoint\n              optional: true\n          env:\n            # The location of the etcd cluster.\n            - name: ETCD_ENDPOINTS\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_endpoints\n            # Location of the CA certificate for etcd.\n            - name: ETCD_CA_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_ca\n            # Location of the client key for etcd.\n            - name: ETCD_KEY_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_key\n            # Location of the client certificate for etcd.\n            - name: ETCD_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_cert\n            # Set noderef for node controller.\n            - name: CALICO_K8S_NODE_REF\n              valueFrom:\n                fieldRef:\n                  fieldPath: spec.nodeName\n            # Choose the backend to use.\n            - name: CALICO_NETWORKING_BACKEND\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: calico_backend\n            # Cluster type to identify the deployment type\n            - name: CLUSTER_TYPE\n              value: \"k8s,bgp\"\n            # Auto-detect the BGP IP address.\n            - name: IP\n              value: \"autodetect\"\n            - name: IP_AUTODETECTION_METHOD\n              value: \"{{ IP_AUTODETECTION_METHOD }}\"\n            # Enable IPIP\n{% if CALICO_NETWORKING_BACKEND == \"bird\" %}\n            - name: CALICO_IPV4POOL_IPIP\n              value: \"{{ CALICO_ENABLE_OVERLAY }}\"\n{% endif %}\n            # Enable or Disable VXLAN on the default IP pool.\n{% if CALICO_NETWORKING_BACKEND == \"vxlan\" %}\n            - name: CALICO_IPV4POOL_VXLAN\n              value: \"{{ CALICO_ENABLE_OVERLAY }}\"\n            - name: CALICO_IPV6POOL_VXLAN\n              value: \"{{ CALICO_ENABLE_OVERLAY }}\"\n{% endif %}\n            # Set MTU for tunnel device used if ipip is enabled\n            - name: FELIX_IPINIPMTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # Set MTU for the VXLAN tunnel device.\n            - name: FELIX_VXLANMTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # Set MTU for the Wireguard tunnel device.\n            - name: FELIX_WIREGUARDMTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # The default IPv4 pool to create on startup if none exists. Pod IPs will be\n            # chosen from this range. Changing this value after installation will have\n            # no effect. This should fall within `--cluster-cidr`.\n            - name: CALICO_IPV4POOL_CIDR\n              value: \"{{ CLUSTER_CIDR }}\"\n            # Disable file logging so `kubectl logs` works.\n            - name: CALICO_DISABLE_FILE_LOGGING\n              value: \"true\"\n            # Set Felix endpoint to host default action to ACCEPT.\n            - name: FELIX_DEFAULTENDPOINTTOHOSTACTION\n              value: \"ACCEPT\"\n            # Disable IPv6 on Kubernetes.\n            - name: FELIX_IPV6SUPPORT\n              value: \"false\"\n            - name: FELIX_HEALTHENABLED\n              value: \"true\"\n            # Set Kubernetes NodePorts: If services do use NodePorts outside Calico’s expected range,\n            # Calico will treat traffic to those ports as host traffic instead of pod traffic.\n            - name: FELIX_KUBENODEPORTRANGES\n              value: \"{{ NODE_PORT_RANGE.split('-')[0] }}:{{ NODE_PORT_RANGE.split('-')[1] }}\"\n            - name: FELIX_PROMETHEUSMETRICSENABLED\n              value: \"false\"\n          securityContext:\n            privileged: true\n          resources:\n            requests:\n              cpu: 250m\n          lifecycle:\n            preStop:\n              exec:\n                command:\n                - /bin/calico-node\n                - -shutdown\n          livenessProbe:\n            exec:\n              command:\n              - /bin/calico-node\n              - -felix-live\n{% if CALICO_NETWORKING_BACKEND == \"bird\" %}\n              - -bird-live\n{% endif %}\n            periodSeconds: 10\n            initialDelaySeconds: 10\n            failureThreshold: 6\n            timeoutSeconds: 10\n          readinessProbe:\n            exec:\n              command:\n              - /bin/calico-node\n              - -felix-ready\n{% if CALICO_NETWORKING_BACKEND == \"bird\" %}\n              - -bird-ready\n{% endif %}\n            periodSeconds: 10\n            timeoutSeconds: 10\n          volumeMounts:\n            # For maintaining CNI plugin API credentials.\n            - mountPath: /host/etc/cni/net.d\n              name: cni-net-dir\n              readOnly: false\n            - mountPath: /lib/modules\n              name: lib-modules\n              readOnly: true\n            - mountPath: /run/xtables.lock\n              name: xtables-lock\n              readOnly: false\n            - mountPath: /var/run/calico\n              name: var-run-calico\n              readOnly: false\n            - mountPath: /var/lib/calico\n              name: var-lib-calico\n              readOnly: false\n            - mountPath: /calico-secrets\n              name: etcd-certs\n            - name: policysync\n              mountPath: /var/run/nodeagent\n            # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the\n            # parent directory.\n            - name: bpffs\n              mountPath: /sys/fs/bpf\n            - name: cni-log-dir\n              mountPath: /var/log/calico/cni\n              readOnly: true\n      volumes:\n        # Used by calico-node.\n        - name: lib-modules\n          hostPath:\n            path: /lib/modules\n        - name: var-run-calico\n          hostPath:\n            path: /var/run/calico\n        - name: var-lib-calico\n          hostPath:\n            path: /var/lib/calico\n        - name: xtables-lock\n          hostPath:\n            path: /run/xtables.lock\n            type: FileOrCreate\n        - name: sys-fs\n          hostPath:\n            path: /sys/fs/\n            type: DirectoryOrCreate\n        - name: bpffs\n          hostPath:\n            path: /sys/fs/bpf\n            type: Directory\n        # mount /proc at /nodeproc to be used by mount-bpffs initContainer to mount root cgroup2 fs.\n        - name: nodeproc\n          hostPath:\n            path: /proc\n        # Used to install CNI.\n        - name: cni-bin-dir\n          hostPath:\n            path: /opt/cni/bin \n        - name: cni-net-dir\n          hostPath:\n            path: /etc/cni/net.d\n        # Used to access CNI logs.\n        - name: cni-log-dir\n          hostPath:\n            path: /var/log/calico/cni\n        # Mount in the etcd TLS secrets with mode 400.\n        # See https://kubernetes.io/docs/concepts/configuration/secret/\n        - name: etcd-certs\n          secret:\n            secretName: calico-etcd-secrets\n            defaultMode: 0400\n        # Used to create per-pod Unix Domain Sockets\n        - name: policysync\n          hostPath:\n            type: DirectoryOrCreate\n            path: /var/run/nodeagent\n---\n# Source: calico/templates/calico-kube-controllers.yaml\n# See https://github.com/projectcalico/kube-controllers\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: calico-kube-controllers\n  namespace: kube-system\n  labels:\n    k8s-app: calico-kube-controllers\nspec:\n  # The controllers can only have a single active instance.\n  replicas: 1\n  selector:\n    matchLabels:\n      k8s-app: calico-kube-controllers\n  strategy:\n    type: Recreate\n  template:\n    metadata:\n      name: calico-kube-controllers\n      namespace: kube-system\n      labels:\n        k8s-app: calico-kube-controllers\n    spec:\n      nodeSelector:\n        kubernetes.io/os: linux\n      tolerations:\n        # Mark the pod as a critical add-on for rescheduling.\n        - key: CriticalAddonsOnly\n          operator: Exists\n        - key: node-role.kubernetes.io/master\n          effect: NoSchedule\n        - key: node-role.kubernetes.io/control-plane\n          effect: NoSchedule\n      serviceAccountName: calico-kube-controllers\n      priorityClassName: system-cluster-critical\n      # The controllers must run in the host network namespace so that\n      # it isn't governed by policy that would prevent it from working.\n      hostNetwork: true\n      containers:\n        - name: calico-kube-controllers\n          image: easzlab.io.local:5000/easzlab/kube-controllers:{{ calico_ver }}\n          imagePullPolicy: IfNotPresent\n          env:\n            # The location of the etcd cluster.\n            - name: ETCD_ENDPOINTS\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_endpoints\n            # Location of the CA certificate for etcd.\n            - name: ETCD_CA_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_ca\n            # Location of the client key for etcd.\n            - name: ETCD_KEY_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_key\n            # Location of the client certificate for etcd.\n            - name: ETCD_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_cert\n            # Choose which controllers to run.\n            - name: ENABLED_CONTROLLERS\n              value: policy,namespace,serviceaccount,workloadendpoint,node\n          volumeMounts:\n            # Mount in the etcd TLS secrets.\n            - mountPath: /calico-secrets\n              name: etcd-certs\n          livenessProbe:\n            exec:\n              command:\n              - /usr/bin/check-status\n              - -l\n            periodSeconds: 10\n            initialDelaySeconds: 10\n            failureThreshold: 6\n            timeoutSeconds: 10\n          readinessProbe:\n            exec:\n              command:\n              - /usr/bin/check-status\n              - -r\n            periodSeconds: 10\n      volumes:\n        # Mount in the etcd TLS secrets with mode 400.\n        # See https://kubernetes.io/docs/concepts/configuration/secret/\n        - name: etcd-certs\n          secret:\n            secretName: calico-etcd-secrets\n            defaultMode: 0440\n"
  },
  {
    "path": "roles/calico/templates/calico-v3.26.yaml.j2",
    "content": "---\n# download Release archive: https://github.com/projectcalico/calico/releases/download/v3.26.4/release-v3.26.4.tgz\n# Release notes: https://projectcalico.docs.tigera.io/archive/v3.26/release-notes/\n\n# Datastore: etcd, using Typha is redundant and not recommended.\n# Kubeasz uses command ( kubectl create) to create etcd-secrets, see more in 'roles/calico/tasks/main.yml'\n\n# source from: release-v3.26.4/manifests/calico-etcd.yaml\n\n# Source: calico/templates/calico-kube-controllers.yaml\n# This manifest creates a Pod Disruption Budget for Controller to allow K8s Cluster Autoscaler to evict\n\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: calico-kube-controllers\n  namespace: kube-system\n  labels:\n    k8s-app: calico-kube-controllers\nspec:\n  maxUnavailable: 1\n  selector:\n    matchLabels:\n      k8s-app: calico-kube-controllers\n---\n# Source: calico/templates/calico-kube-controllers.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: calico-kube-controllers\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: calico-node\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: calico-cni-plugin\n  namespace: kube-system\n---\n# Source: calico/templates/calico-config.yaml\n# This ConfigMap is used to configure a self-hosted Calico installation.\nkind: ConfigMap\napiVersion: v1\nmetadata:\n  name: calico-config\n  namespace: kube-system\ndata:\n  # Configure this with the location of your etcd cluster.\n  etcd_endpoints: \"{{ ETCD_ENDPOINTS }}\"\n  # If you're using TLS enabled etcd uncomment the following.\n  # You must also populate the Secret below with these files.\n  etcd_ca: \"/calico-secrets/etcd-ca\"\n  etcd_cert: \"/calico-secrets/etcd-cert\"\n  etcd_key: \"/calico-secrets/etcd-key\"\n  # Typha is disabled.\n  typha_service_name: \"none\"\n  # Configure the backend to use.\n  calico_backend: \"{{ CALICO_NETWORKING_BACKEND }}\"\n\n  # Configure the MTU to use for workload interfaces and tunnels.\n  # By default, MTU is auto-detected, and explicitly setting this field should not be required.\n  # You can override auto-detection by providing a non-zero value.\n  veth_mtu: \"0\"\n\n  # The CNI network configuration to install on each node. The special\n  # values in this config will be automatically populated.\n  cni_network_config: |-\n    {\n      \"name\": \"k8s-pod-network\",\n      \"cniVersion\": \"0.3.1\",\n      \"plugins\": [\n        {\n          \"type\": \"calico\",\n          \"log_level\": \"info\",\n          \"log_file_path\": \"/var/log/calico/cni/cni.log\",\n          \"etcd_endpoints\": \"{{ ETCD_ENDPOINTS }}\",\n          \"etcd_key_file\": \"/etc/calico/ssl/calico-key.pem\",\n          \"etcd_cert_file\": \"/etc/calico/ssl/calico.pem\",\n          \"etcd_ca_cert_file\": \"{{ ca_dir }}/ca.pem\",\n          \"mtu\": __CNI_MTU__,\n          \"ipam\": {\n              \"type\": \"calico-ipam\"\n          },\n          \"policy\": {\n              \"type\": \"k8s\"\n          },\n          \"kubernetes\": {\n              \"kubeconfig\": \"/etc/cni/net.d/calico-kubeconfig\"\n          }\n        },\n        {\n          \"type\": \"portmap\",\n          \"snat\": true,\n          \"capabilities\": {\"portMappings\": true}\n        },\n        {\n          \"type\": \"bandwidth\",\n          \"capabilities\": {\"bandwidth\": true}\n        }\n      ]\n    }\n---\n# Source: calico/templates/calico-kube-controllers-rbac.yaml\n# Include a clusterrole for the kube-controllers component,\n# and bind it to the calico-kube-controllers serviceaccount.\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-kube-controllers\nrules:\n  # Pods are monitored for changing labels.\n  # The node controller monitors Kubernetes nodes.\n  # Namespace and serviceaccount labels are used for policy.\n  - apiGroups: [\"\"]\n    resources:\n      - pods\n      - nodes\n      - namespaces\n      - serviceaccounts\n    verbs:\n      - watch\n      - list\n      - get\n  # Watch for changes to Kubernetes NetworkPolicies.\n  - apiGroups: [\"networking.k8s.io\"]\n    resources:\n      - networkpolicies\n    verbs:\n      - watch\n      - list\n---\n# Source: calico/templates/calico-node-rbac.yaml\n# Include a clusterrole for the calico-node DaemonSet,\n# and bind it to the calico-node serviceaccount.\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-node\nrules:\n  # Used for creating service account tokens to be used by the CNI plugin\n  - apiGroups: [\"\"]\n    resources:\n      - serviceaccounts/token\n    resourceNames:\n      - calico-cni-plugin\n    verbs:\n      - create\n  # The CNI plugin needs to get pods, nodes, and namespaces.\n  - apiGroups: [\"\"]\n    resources:\n      - pods\n      - nodes\n      - namespaces\n    verbs:\n      - get\n  # EndpointSlices are used for Service-based network policy rule\n  # enforcement.\n  - apiGroups: [\"discovery.k8s.io\"]\n    resources:\n      - endpointslices\n    verbs:\n      - watch\n      - list\n  - apiGroups: [\"\"]\n    resources:\n      - endpoints\n      - services\n    verbs:\n      # Used to discover service IPs for advertisement.\n      - watch\n      - list\n  # Pod CIDR auto-detection on kubeadm needs access to config maps.\n  - apiGroups: [\"\"]\n    resources:\n      - configmaps\n    verbs:\n      - get\n  - apiGroups: [\"\"]\n    resources:\n      - nodes/status\n    verbs:\n      # Needed for clearing NodeNetworkUnavailable flag.\n      - patch\n---\n# Source: calico/templates/calico-node-rbac.yaml\n# CNI cluster role\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-cni-plugin\nrules:\n  - apiGroups: [\"\"]\n    resources:\n      - pods\n      - nodes\n      - namespaces\n    verbs:\n      - get\n---\n# Source: calico/templates/calico-kube-controllers-rbac.yaml\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-kube-controllers\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: calico-kube-controllers\nsubjects:\n- kind: ServiceAccount\n  name: calico-kube-controllers\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node-rbac.yaml\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: calico-node\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: calico-node\nsubjects:\n- kind: ServiceAccount\n  name: calico-node\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node-rbac.yaml\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: calico-cni-plugin\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: calico-cni-plugin\nsubjects:\n- kind: ServiceAccount\n  name: calico-cni-plugin\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node.yaml\n# This manifest installs the calico-node container, as well\n# as the CNI plugins and network config on\n# each master and worker node in a Kubernetes cluster.\nkind: DaemonSet\napiVersion: apps/v1\nmetadata:\n  name: calico-node\n  namespace: kube-system\n  labels:\n    k8s-app: calico-node\nspec:\n  selector:\n    matchLabels:\n      k8s-app: calico-node\n  updateStrategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxUnavailable: 1\n  template:\n    metadata:\n      labels:\n        k8s-app: calico-node\n    spec:\n      nodeSelector:\n        kubernetes.io/os: linux\n      hostNetwork: true\n      tolerations:\n        # Make sure calico-node gets scheduled on all nodes.\n        - effect: NoSchedule\n          operator: Exists\n        # Mark the pod as a critical add-on for rescheduling.\n        - key: CriticalAddonsOnly\n          operator: Exists\n        - effect: NoExecute\n          operator: Exists\n      serviceAccountName: calico-node\n      # Minimize downtime during a rolling upgrade or deletion; tell Kubernetes to do a \"force\n      # deletion\": https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods.\n      terminationGracePeriodSeconds: 0\n      priorityClassName: system-node-critical\n      initContainers:\n        # This container installs the CNI binaries\n        # and CNI network config file on each node.\n        - name: install-cni\n          image: easzlab.io.local:5000/easzlab/cni:{{ calico_ver }}\n          imagePullPolicy: IfNotPresent\n          command: [\"/opt/cni/bin/install\"]\n          envFrom:\n          - configMapRef:\n              # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.\n              name: kubernetes-services-endpoint\n              optional: true\n          env:\n            # Name of the CNI config file to create.\n            - name: CNI_CONF_NAME\n              value: \"10-calico.conflist\"\n            # The CNI network config to install on each node.\n            - name: CNI_NETWORK_CONFIG\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: cni_network_config\n            # The location of the etcd cluster.\n            - name: ETCD_ENDPOINTS\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_endpoints\n            # CNI MTU Config variable\n            - name: CNI_MTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # Prevents the container from sleeping forever.\n            - name: SLEEP\n              value: \"false\"\n          volumeMounts:\n            - mountPath: /host/opt/cni/bin\n              name: cni-bin-dir\n            - mountPath: /host/etc/cni/net.d\n              name: cni-net-dir\n            - mountPath: /calico-secrets\n              name: etcd-certs\n          securityContext:\n            privileged: true\n        # This init container mounts the necessary filesystems needed by the BPF data plane\n        # i.e. bpf at /sys/fs/bpf and cgroup2 at /run/calico/cgroup. Calico-node initialisation is executed\n        # in best effort fashion, i.e. no failure for errors, to not disrupt pod creation in iptable mode.\n        - name: \"mount-bpffs\"\n          image: easzlab.io.local:5000/easzlab/node:{{ calico_ver }} \n          imagePullPolicy: IfNotPresent\n          command: [\"calico-node\", \"-init\", \"-best-effort\"]\n          volumeMounts:\n            - mountPath: /sys/fs\n              name: sys-fs\n              # Bidirectional is required to ensure that the new mount we make at /sys/fs/bpf propagates to the host\n              # so that it outlives the init container.\n              mountPropagation: Bidirectional\n            - mountPath: /var/run/calico\n              name: var-run-calico\n              # Bidirectional is required to ensure that the new mount we make at /run/calico/cgroup propagates to the host\n              # so that it outlives the init container.\n              mountPropagation: Bidirectional\n            # Mount /proc/ from host which usually is an init program at /nodeproc. It's needed by mountns binary,\n            # executed by calico-node, to mount root cgroup2 fs at /run/calico/cgroup to attach CTLB programs correctly.\n            - mountPath: /nodeproc\n              name: nodeproc\n              readOnly: true\n          securityContext:\n            privileged: true\n      containers:\n        # Runs calico-node container on each Kubernetes node. This\n        # container programs network policy and routes on each\n        # host.\n        - name: calico-node\n          image: easzlab.io.local:5000/easzlab/node:{{ calico_ver }}\n          imagePullPolicy: IfNotPresent\n          envFrom:\n          - configMapRef:\n              # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.\n              name: kubernetes-services-endpoint\n              optional: true\n          env:\n            # The location of the etcd cluster.\n            - name: ETCD_ENDPOINTS\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_endpoints\n            # Location of the CA certificate for etcd.\n            - name: ETCD_CA_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_ca\n            # Location of the client key for etcd.\n            - name: ETCD_KEY_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_key\n            # Location of the client certificate for etcd.\n            - name: ETCD_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_cert\n            # Set noderef for node controller.\n            - name: CALICO_K8S_NODE_REF\n              valueFrom:\n                fieldRef:\n                  fieldPath: spec.nodeName\n            # Choose the backend to use.\n            - name: CALICO_NETWORKING_BACKEND\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: calico_backend\n            # Cluster type to identify the deployment type\n            - name: CLUSTER_TYPE\n              value: \"k8s,bgp\"\n            # Auto-detect the BGP IP address.\n            - name: IP\n              value: \"autodetect\"\n            - name: IP_AUTODETECTION_METHOD\n              value: \"{{ IP_AUTODETECTION_METHOD }}\"\n            # Enable IPIP\n{% if CALICO_NETWORKING_BACKEND == \"bird\" %}\n            - name: CALICO_IPV4POOL_IPIP\n              value: \"{{ CALICO_ENABLE_OVERLAY }}\"\n{% endif %}\n            # Enable or Disable VXLAN on the default IP pool.\n{% if CALICO_NETWORKING_BACKEND == \"vxlan\" %}\n            - name: CALICO_IPV4POOL_VXLAN\n              value: \"{{ CALICO_ENABLE_OVERLAY }}\"\n            - name: CALICO_IPV6POOL_VXLAN\n              value: \"{{ CALICO_ENABLE_OVERLAY }}\"\n{% endif %}\n            # Set MTU for tunnel device used if ipip is enabled\n            - name: FELIX_IPINIPMTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # Set MTU for the VXLAN tunnel device.\n            - name: FELIX_VXLANMTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # Set MTU for the Wireguard tunnel device.\n            - name: FELIX_WIREGUARDMTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # The default IPv4 pool to create on startup if none exists. Pod IPs will be\n            # chosen from this range. Changing this value after installation will have\n            # no effect. This should fall within `--cluster-cidr`.\n            - name: CALICO_IPV4POOL_CIDR\n              value: \"{{ CLUSTER_CIDR }}\"\n            # Disable file logging so `kubectl logs` works.\n            - name: CALICO_DISABLE_FILE_LOGGING\n              value: \"true\"\n            # Set Felix endpoint to host default action to ACCEPT.\n            - name: FELIX_DEFAULTENDPOINTTOHOSTACTION\n              value: \"ACCEPT\"\n            # Disable IPv6 on Kubernetes.\n            - name: FELIX_IPV6SUPPORT\n              value: \"false\"\n            - name: FELIX_HEALTHENABLED\n              value: \"true\"\n            # Set Kubernetes NodePorts: If services do use NodePorts outside Calico’s expected range,\n            # Calico will treat traffic to those ports as host traffic instead of pod traffic.\n            - name: FELIX_KUBENODEPORTRANGES\n              value: \"{{ NODE_PORT_RANGE.split('-')[0] }}:{{ NODE_PORT_RANGE.split('-')[1] }}\"\n            - name: FELIX_PROMETHEUSMETRICSENABLED\n              value: \"false\"\n          securityContext:\n            privileged: true\n          resources:\n            requests:\n              cpu: 250m\n          lifecycle:\n            preStop:\n              exec:\n                command:\n                - /bin/calico-node\n                - -shutdown\n          livenessProbe:\n            exec:\n              command:\n              - /bin/calico-node\n              - -felix-live\n{% if CALICO_NETWORKING_BACKEND == \"bird\" %}\n              - -bird-live\n{% endif %}\n            periodSeconds: 10\n            initialDelaySeconds: 10\n            failureThreshold: 6\n            timeoutSeconds: 10\n          readinessProbe:\n            exec:\n              command:\n              - /bin/calico-node\n              - -felix-ready\n{% if CALICO_NETWORKING_BACKEND == \"bird\" %}\n              - -bird-ready\n{% endif %}\n            periodSeconds: 10\n            timeoutSeconds: 10\n          volumeMounts:\n            # For maintaining CNI plugin API credentials.\n            - mountPath: /host/etc/cni/net.d\n              name: cni-net-dir\n              readOnly: false\n            - mountPath: /lib/modules\n              name: lib-modules\n              readOnly: true\n            - mountPath: /run/xtables.lock\n              name: xtables-lock\n              readOnly: false\n            - mountPath: /var/run/calico\n              name: var-run-calico\n              readOnly: false\n            - mountPath: /var/lib/calico\n              name: var-lib-calico\n              readOnly: false\n            - mountPath: /calico-secrets\n              name: etcd-certs\n            - name: policysync\n              mountPath: /var/run/nodeagent\n            # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the\n            # parent directory.\n            - name: bpffs\n              mountPath: /sys/fs/bpf\n            - name: cni-log-dir\n              mountPath: /var/log/calico/cni\n              readOnly: true\n      volumes:\n        # Used by calico-node.\n        - name: lib-modules\n          hostPath:\n            path: /lib/modules\n        - name: var-run-calico\n          hostPath:\n            path: /var/run/calico\n        - name: var-lib-calico\n          hostPath:\n            path: /var/lib/calico\n        - name: xtables-lock\n          hostPath:\n            path: /run/xtables.lock\n            type: FileOrCreate\n        - name: sys-fs\n          hostPath:\n            path: /sys/fs/\n            type: DirectoryOrCreate\n        - name: bpffs\n          hostPath:\n            path: /sys/fs/bpf\n            type: Directory\n        # mount /proc at /nodeproc to be used by mount-bpffs initContainer to mount root cgroup2 fs.\n        - name: nodeproc\n          hostPath:\n            path: /proc\n        # Used to install CNI.\n        - name: cni-bin-dir\n          hostPath:\n            path: /opt/cni/bin\n        - name: cni-net-dir\n          hostPath:\n            path: /etc/cni/net.d\n        # Used to access CNI logs.\n        - name: cni-log-dir\n          hostPath:\n            path: /var/log/calico/cni\n        # Mount in the etcd TLS secrets with mode 400.\n        # See https://kubernetes.io/docs/concepts/configuration/secret/\n        - name: etcd-certs\n          secret:\n            secretName: calico-etcd-secrets\n            defaultMode: 0400\n        # Used to create per-pod Unix Domain Sockets\n        - name: policysync\n          hostPath:\n            type: DirectoryOrCreate\n            path: /var/run/nodeagent\n---\n# Source: calico/templates/calico-kube-controllers.yaml\n# See https://github.com/projectcalico/kube-controllers\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: calico-kube-controllers\n  namespace: kube-system\n  labels:\n    k8s-app: calico-kube-controllers\nspec:\n  # The controllers can only have a single active instance.\n  replicas: 1\n  selector:\n    matchLabels:\n      k8s-app: calico-kube-controllers\n  strategy:\n    type: Recreate\n  template:\n    metadata:\n      name: calico-kube-controllers\n      namespace: kube-system\n      labels:\n        k8s-app: calico-kube-controllers\n    spec:\n      nodeSelector:\n        kubernetes.io/os: linux\n      tolerations:\n        # Mark the pod as a critical add-on for rescheduling.\n        - key: CriticalAddonsOnly\n          operator: Exists\n        - key: node-role.kubernetes.io/master\n          effect: NoSchedule\n        - key: node-role.kubernetes.io/control-plane\n          effect: NoSchedule\n      serviceAccountName: calico-kube-controllers\n      priorityClassName: system-cluster-critical\n      # The controllers must run in the host network namespace so that\n      # it isn't governed by policy that would prevent it from working.\n      hostNetwork: true\n      containers:\n        - name: calico-kube-controllers\n          image: easzlab.io.local:5000/easzlab/kube-controllers:{{ calico_ver }}\n          imagePullPolicy: IfNotPresent\n          env:\n            # The location of the etcd cluster.\n            - name: ETCD_ENDPOINTS\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_endpoints\n            # Location of the CA certificate for etcd.\n            - name: ETCD_CA_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_ca\n            # Location of the client key for etcd.\n            - name: ETCD_KEY_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_key\n            # Location of the client certificate for etcd.\n            - name: ETCD_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_cert\n            # Choose which controllers to run.\n            - name: ENABLED_CONTROLLERS\n              value: policy,namespace,serviceaccount,workloadendpoint,node\n          volumeMounts:\n            # Mount in the etcd TLS secrets.\n            - mountPath: /calico-secrets\n              name: etcd-certs\n          livenessProbe:\n            exec:\n              command:\n              - /usr/bin/check-status\n              - -l\n            periodSeconds: 10\n            initialDelaySeconds: 10\n            failureThreshold: 6\n            timeoutSeconds: 10\n          readinessProbe:\n            exec:\n              command:\n              - /usr/bin/check-status\n              - -r\n            periodSeconds: 10\n      volumes:\n        # Mount in the etcd TLS secrets with mode 400.\n        # See https://kubernetes.io/docs/concepts/configuration/secret/\n        - name: etcd-certs\n          secret:\n            secretName: calico-etcd-secrets\n            defaultMode: 0440\n"
  },
  {
    "path": "roles/calico/templates/calico-v3.28.yaml.j2",
    "content": "---\n# download Release archive: https://github.com/projectcalico/calico/releases/download/v3.28.2/release-v3.28.2.tgz\n# Release notes: https://projectcalico.docs.tigera.io/archive/v3.28/release-notes/\n\n# Datastore: etcd, using Typha is redundant and not recommended.\n# Kubeasz uses command ( kubectl create) to create etcd-secrets, see more in 'roles/calico/tasks/main.yml'\n\n# source from: release-v3.28.2/manifests/calico-etcd.yaml\n\n# Source: calico/templates/calico-kube-controllers.yaml\n# This manifest creates a Pod Disruption Budget for Controller to allow K8s Cluster Autoscaler to evict\n\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: calico-kube-controllers\n  namespace: kube-system\n  labels:\n    k8s-app: calico-kube-controllers\nspec:\n  maxUnavailable: 1\n  selector:\n    matchLabels:\n      k8s-app: calico-kube-controllers\n---\n# Source: calico/templates/calico-kube-controllers.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: calico-kube-controllers\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: calico-node\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node.yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: calico-cni-plugin\n  namespace: kube-system\n---\n# Source: calico/templates/calico-config.yaml\n# This ConfigMap is used to configure a self-hosted Calico installation.\nkind: ConfigMap\napiVersion: v1\nmetadata:\n  name: calico-config\n  namespace: kube-system\ndata:\n  # Configure this with the location of your etcd cluster.\n  etcd_endpoints: \"{{ ETCD_ENDPOINTS }}\"\n  # If you're using TLS enabled etcd uncomment the following.\n  # You must also populate the Secret below with these files.\n  etcd_ca: \"/calico-secrets/etcd-ca\"\n  etcd_cert: \"/calico-secrets/etcd-cert\"\n  etcd_key: \"/calico-secrets/etcd-key\"\n  # Typha is disabled.\n  typha_service_name: \"none\"\n  # Configure the backend to use.\n  calico_backend: \"{{ CALICO_NETWORKING_BACKEND }}\"\n\n  # Configure the MTU to use for workload interfaces and tunnels.\n  # By default, MTU is auto-detected, and explicitly setting this field should not be required.\n  # You can override auto-detection by providing a non-zero value.\n  veth_mtu: \"0\"\n\n  # The CNI network configuration to install on each node. The special\n  # values in this config will be automatically populated.\n  cni_network_config: |-\n    {\n      \"name\": \"k8s-pod-network\",\n      \"cniVersion\": \"0.3.1\",\n      \"plugins\": [\n        {\n          \"type\": \"calico\",\n          \"log_level\": \"info\",\n          \"log_file_path\": \"/var/log/calico/cni/cni.log\",\n          \"etcd_endpoints\": \"{{ ETCD_ENDPOINTS }}\",\n          \"etcd_key_file\": \"/etc/calico/ssl/calico-key.pem\",\n          \"etcd_cert_file\": \"/etc/calico/ssl/calico.pem\",\n          \"etcd_ca_cert_file\": \"{{ ca_dir }}/ca.pem\",\n          \"mtu\": __CNI_MTU__,\n          \"ipam\": {\n              \"type\": \"calico-ipam\"\n          },\n          \"policy\": {\n              \"type\": \"k8s\"\n          },\n          \"kubernetes\": {\n              \"kubeconfig\": \"/etc/cni/net.d/calico-kubeconfig\"\n          }\n        },\n        {\n          \"type\": \"portmap\",\n          \"snat\": true,\n          \"capabilities\": {\"portMappings\": true}\n        },\n        {\n          \"type\": \"bandwidth\",\n          \"capabilities\": {\"bandwidth\": true}\n        }\n      ]\n    }\n---\n# Source: calico/templates/calico-kube-controllers-rbac.yaml\n# Include a clusterrole for the kube-controllers component,\n# and bind it to the calico-kube-controllers serviceaccount.\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-kube-controllers\nrules:\n  # Pods are monitored for changing labels.\n  # The node controller monitors Kubernetes nodes.\n  # Namespace and serviceaccount labels are used for policy.\n  - apiGroups: [\"\"]\n    resources:\n      - pods\n      - nodes\n      - namespaces\n      - serviceaccounts\n    verbs:\n      - watch\n      - list\n      - get\n  # Watch for changes to Kubernetes NetworkPolicies.\n  - apiGroups: [\"networking.k8s.io\"]\n    resources:\n      - networkpolicies\n    verbs:\n      - watch\n      - list\n---\n# Source: calico/templates/calico-node-rbac.yaml\n# Include a clusterrole for the calico-node DaemonSet,\n# and bind it to the calico-node serviceaccount.\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-node\nrules:\n  # Used for creating service account tokens to be used by the CNI plugin\n  - apiGroups: [\"\"]\n    resources:\n      - serviceaccounts/token\n    resourceNames:\n      - calico-cni-plugin\n    verbs:\n      - create\n  # The CNI plugin needs to get pods, nodes, and namespaces.\n  - apiGroups: [\"\"]\n    resources:\n      - pods\n      - nodes\n      - namespaces\n    verbs:\n      - get\n  # EndpointSlices are used for Service-based network policy rule\n  # enforcement.\n  - apiGroups: [\"discovery.k8s.io\"]\n    resources:\n      - endpointslices\n    verbs:\n      - watch\n      - list\n  - apiGroups: [\"\"]\n    resources:\n      - endpoints\n      - services\n    verbs:\n      # Used to discover service IPs for advertisement.\n      - watch\n      - list\n  # Pod CIDR auto-detection on kubeadm needs access to config maps.\n  - apiGroups: [\"\"]\n    resources:\n      - configmaps\n    verbs:\n      - get\n  - apiGroups: [\"\"]\n    resources:\n      - nodes/status\n    verbs:\n      # Needed for clearing NodeNetworkUnavailable flag.\n      - patch\n---\n# Source: calico/templates/calico-node-rbac.yaml\n# CNI cluster role\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-cni-plugin\nrules:\n  - apiGroups: [\"\"]\n    resources:\n      - pods\n      - nodes\n      - namespaces\n    verbs:\n      - get\n---\n# Source: calico/templates/calico-kube-controllers-rbac.yaml\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: calico-kube-controllers\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: calico-kube-controllers\nsubjects:\n- kind: ServiceAccount\n  name: calico-kube-controllers\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node-rbac.yaml\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: calico-node\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: calico-node\nsubjects:\n- kind: ServiceAccount\n  name: calico-node\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node-rbac.yaml\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: calico-cni-plugin\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: calico-cni-plugin\nsubjects:\n- kind: ServiceAccount\n  name: calico-cni-plugin\n  namespace: kube-system\n---\n# Source: calico/templates/calico-node.yaml\n# This manifest installs the calico-node container, as well\n# as the CNI plugins and network config on\n# each master and worker node in a Kubernetes cluster.\nkind: DaemonSet\napiVersion: apps/v1\nmetadata:\n  name: calico-node\n  namespace: kube-system\n  labels:\n    k8s-app: calico-node\nspec:\n  selector:\n    matchLabels:\n      k8s-app: calico-node\n  updateStrategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxUnavailable: 1\n  template:\n    metadata:\n      labels:\n        k8s-app: calico-node\n    spec:\n      nodeSelector:\n        kubernetes.io/os: linux\n      hostNetwork: true\n      tolerations:\n        # Make sure calico-node gets scheduled on all nodes.\n        - effect: NoSchedule\n          operator: Exists\n        # Mark the pod as a critical add-on for rescheduling.\n        - key: CriticalAddonsOnly\n          operator: Exists\n        - effect: NoExecute\n          operator: Exists\n      serviceAccountName: calico-node\n      # Minimize downtime during a rolling upgrade or deletion; tell Kubernetes to do a \"force\n      # deletion\": https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods.\n      terminationGracePeriodSeconds: 0\n      priorityClassName: system-node-critical\n      initContainers:\n        # This container installs the CNI binaries\n        # and CNI network config file on each node.\n        - name: install-cni\n          image: easzlab.io.local:5000/easzlab/cni:{{ calico_ver }}\n          imagePullPolicy: IfNotPresent\n          command: [\"/opt/cni/bin/install\"]\n          envFrom:\n          - configMapRef:\n              # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.\n              name: kubernetes-services-endpoint\n              optional: true\n          env:\n            # Name of the CNI config file to create.\n            - name: CNI_CONF_NAME\n              value: \"10-calico.conflist\"\n            # The CNI network config to install on each node.\n            - name: CNI_NETWORK_CONFIG\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: cni_network_config\n            # The location of the etcd cluster.\n            - name: ETCD_ENDPOINTS\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_endpoints\n            # CNI MTU Config variable\n            - name: CNI_MTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # Prevents the container from sleeping forever.\n            - name: SLEEP\n              value: \"false\"\n          volumeMounts:\n            - mountPath: /host/opt/cni/bin\n              name: cni-bin-dir\n            - mountPath: /host/etc/cni/net.d\n              name: cni-net-dir\n            - mountPath: /calico-secrets\n              name: etcd-certs\n          securityContext:\n            privileged: true\n        # This init container mounts the necessary filesystems needed by the BPF data plane\n        # i.e. bpf at /sys/fs/bpf and cgroup2 at /run/calico/cgroup. Calico-node initialisation is executed\n        # in best effort fashion, i.e. no failure for errors, to not disrupt pod creation in iptable mode.\n        - name: \"mount-bpffs\"\n          image: easzlab.io.local:5000/easzlab/node:{{ calico_ver }} \n          imagePullPolicy: IfNotPresent\n          command: [\"calico-node\", \"-init\", \"-best-effort\"]\n          volumeMounts:\n            - mountPath: /sys/fs\n              name: sys-fs\n              # Bidirectional is required to ensure that the new mount we make at /sys/fs/bpf propagates to the host\n              # so that it outlives the init container.\n              mountPropagation: Bidirectional\n            - mountPath: /var/run/calico\n              name: var-run-calico\n              # Bidirectional is required to ensure that the new mount we make at /run/calico/cgroup propagates to the host\n              # so that it outlives the init container.\n              mountPropagation: Bidirectional\n            # Mount /proc/ from host which usually is an init program at /nodeproc. It's needed by mountns binary,\n            # executed by calico-node, to mount root cgroup2 fs at /run/calico/cgroup to attach CTLB programs correctly.\n            - mountPath: /nodeproc\n              name: nodeproc\n              readOnly: true\n          securityContext:\n            privileged: true\n      containers:\n        # Runs calico-node container on each Kubernetes node. This\n        # container programs network policy and routes on each\n        # host.\n        - name: calico-node\n          image: easzlab.io.local:5000/easzlab/node:{{ calico_ver }}\n          imagePullPolicy: IfNotPresent\n          envFrom:\n          - configMapRef:\n              # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.\n              name: kubernetes-services-endpoint\n              optional: true\n          env:\n            # The location of the etcd cluster.\n            - name: ETCD_ENDPOINTS\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_endpoints\n            # Location of the CA certificate for etcd.\n            - name: ETCD_CA_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_ca\n            # Location of the client key for etcd.\n            - name: ETCD_KEY_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_key\n            # Location of the client certificate for etcd.\n            - name: ETCD_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_cert\n            # Set noderef for node controller.\n            - name: CALICO_K8S_NODE_REF\n              valueFrom:\n                fieldRef:\n                  fieldPath: spec.nodeName\n            # Choose the backend to use.\n            - name: CALICO_NETWORKING_BACKEND\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: calico_backend\n            # Cluster type to identify the deployment type\n            - name: CLUSTER_TYPE\n              value: \"k8s,bgp\"\n            # Auto-detect the BGP IP address.\n            - name: IP\n              value: \"autodetect\"\n            - name: IP_AUTODETECTION_METHOD\n              value: \"{{ IP_AUTODETECTION_METHOD }}\"\n            # Enable IPIP\n{% if CALICO_NETWORKING_BACKEND == \"bird\" %}\n            - name: CALICO_IPV4POOL_IPIP\n              value: \"{{ CALICO_ENABLE_OVERLAY }}\"\n{% endif %}\n            # Enable or Disable VXLAN on the default IP pool.\n{% if CALICO_NETWORKING_BACKEND == \"vxlan\" %}\n            - name: CALICO_IPV4POOL_VXLAN\n              value: \"{{ CALICO_ENABLE_OVERLAY }}\"\n            # Enable or Disable VXLAN on the default IPv6 IP pool.\n            - name: CALICO_IPV6POOL_VXLAN\n              value: \"{{ CALICO_ENABLE_OVERLAY }}\"\n{% endif %}\n            # Set MTU for tunnel device used if ipip is enabled\n            - name: FELIX_IPINIPMTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # Set MTU for the VXLAN tunnel device.\n            - name: FELIX_VXLANMTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # Set MTU for the Wireguard tunnel device.\n            - name: FELIX_WIREGUARDMTU\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: veth_mtu\n            # The default IPv4 pool to create on startup if none exists. Pod IPs will be\n            # chosen from this range. Changing this value after installation will have\n            # no effect. This should fall within `--cluster-cidr`.\n            - name: CALICO_IPV4POOL_CIDR\n              value: \"{{ CLUSTER_CIDR }}\"\n            # Disable file logging so `kubectl logs` works.\n            - name: CALICO_DISABLE_FILE_LOGGING\n              value: \"true\"\n            # Set Felix endpoint to host default action to ACCEPT.\n            - name: FELIX_DEFAULTENDPOINTTOHOSTACTION\n              value: \"ACCEPT\"\n            # Disable IPv6 on Kubernetes.\n            - name: FELIX_IPV6SUPPORT\n              value: \"false\"\n            - name: FELIX_HEALTHENABLED\n              value: \"true\"\n            # Set Kubernetes NodePorts: If services do use NodePorts outside Calico’s expected range,\n            # Calico will treat traffic to those ports as host traffic instead of pod traffic.\n            - name: FELIX_KUBENODEPORTRANGES\n              value: \"{{ NODE_PORT_RANGE.split('-')[0] }}:{{ NODE_PORT_RANGE.split('-')[1] }}\"\n            - name: FELIX_PROMETHEUSMETRICSENABLED\n              value: \"false\"\n          securityContext:\n            privileged: true\n          resources:\n            requests:\n              cpu: 250m\n          lifecycle:\n            preStop:\n              exec:\n                command:\n                - /bin/calico-node\n                - -shutdown\n          livenessProbe:\n            exec:\n              command:\n              - /bin/calico-node\n              - -felix-live\n{% if CALICO_NETWORKING_BACKEND == \"bird\" %}\n              - -bird-live\n{% endif %}\n            periodSeconds: 10\n            initialDelaySeconds: 10\n            failureThreshold: 6\n            timeoutSeconds: 10\n          readinessProbe:\n            exec:\n              command:\n              - /bin/calico-node\n              - -felix-ready\n{% if CALICO_NETWORKING_BACKEND == \"bird\" %}\n              - -bird-ready\n{% endif %}\n            periodSeconds: 10\n            timeoutSeconds: 10\n          volumeMounts:\n            # For maintaining CNI plugin API credentials.\n            - mountPath: /host/etc/cni/net.d\n              name: cni-net-dir\n              readOnly: false\n            - mountPath: /lib/modules\n              name: lib-modules\n              readOnly: true\n            - mountPath: /run/xtables.lock\n              name: xtables-lock\n              readOnly: false\n            - mountPath: /var/run/calico\n              name: var-run-calico\n              readOnly: false\n            - mountPath: /var/lib/calico\n              name: var-lib-calico\n              readOnly: false\n            - mountPath: /calico-secrets\n              name: etcd-certs\n            - name: policysync\n              mountPath: /var/run/nodeagent\n            # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the\n            # parent directory.\n            - name: bpffs\n              mountPath: /sys/fs/bpf\n            - name: cni-log-dir\n              mountPath: /var/log/calico/cni\n              readOnly: true\n      volumes:\n        # Used by calico-node.\n        - name: lib-modules\n          hostPath:\n            path: /lib/modules\n        - name: var-run-calico\n          hostPath:\n            path: /var/run/calico\n            type: DirectoryOrCreate\n        - name: var-lib-calico\n          hostPath:\n            path: /var/lib/calico\n            type: DirectoryOrCreate\n        - name: xtables-lock\n          hostPath:\n            path: /run/xtables.lock\n            type: FileOrCreate\n        - name: sys-fs\n          hostPath:\n            path: /sys/fs/\n            type: DirectoryOrCreate\n        - name: bpffs\n          hostPath:\n            path: /sys/fs/bpf\n            type: Directory\n        # mount /proc at /nodeproc to be used by mount-bpffs initContainer to mount root cgroup2 fs.\n        - name: nodeproc\n          hostPath:\n            path: /proc\n        # Used to install CNI.\n        - name: cni-bin-dir\n          hostPath:\n            path: /opt/cni/bin\n            type: DirectoryOrCreate\n        - name: cni-net-dir\n          hostPath:\n            path: /etc/cni/net.d\n        # Used to access CNI logs.\n        - name: cni-log-dir\n          hostPath:\n            path: /var/log/calico/cni\n        # Mount in the etcd TLS secrets with mode 400.\n        # See https://kubernetes.io/docs/concepts/configuration/secret/\n        - name: etcd-certs\n          secret:\n            secretName: calico-etcd-secrets\n            defaultMode: 0400\n        # Used to create per-pod Unix Domain Sockets\n        - name: policysync\n          hostPath:\n            type: DirectoryOrCreate\n            path: /var/run/nodeagent\n---\n# Source: calico/templates/calico-kube-controllers.yaml\n# See https://github.com/projectcalico/kube-controllers\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: calico-kube-controllers\n  namespace: kube-system\n  labels:\n    k8s-app: calico-kube-controllers\nspec:\n  # The controllers can only have a single active instance.\n  replicas: 1\n  selector:\n    matchLabels:\n      k8s-app: calico-kube-controllers\n  strategy:\n    type: Recreate\n  template:\n    metadata:\n      name: calico-kube-controllers\n      namespace: kube-system\n      labels:\n        k8s-app: calico-kube-controllers\n    spec:\n      nodeSelector:\n        kubernetes.io/os: linux\n      tolerations:\n        # Mark the pod as a critical add-on for rescheduling.\n        - key: CriticalAddonsOnly\n          operator: Exists\n        - key: node-role.kubernetes.io/master\n          effect: NoSchedule\n        - key: node-role.kubernetes.io/control-plane\n          effect: NoSchedule\n      serviceAccountName: calico-kube-controllers\n      priorityClassName: system-cluster-critical\n      # The controllers must run in the host network namespace so that\n      # it isn't governed by policy that would prevent it from working.\n      hostNetwork: true\n      containers:\n        - name: calico-kube-controllers\n          image: easzlab.io.local:5000/easzlab/kube-controllers:{{ calico_ver }}\n          imagePullPolicy: IfNotPresent\n          env:\n            # The location of the etcd cluster.\n            - name: ETCD_ENDPOINTS\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_endpoints\n            # Location of the CA certificate for etcd.\n            - name: ETCD_CA_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_ca\n            # Location of the client key for etcd.\n            - name: ETCD_KEY_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_key\n            # Location of the client certificate for etcd.\n            - name: ETCD_CERT_FILE\n              valueFrom:\n                configMapKeyRef:\n                  name: calico-config\n                  key: etcd_cert\n            # Choose which controllers to run.\n            - name: ENABLED_CONTROLLERS\n              value: policy,namespace,serviceaccount,workloadendpoint,node\n          volumeMounts:\n            # Mount in the etcd TLS secrets.\n            - mountPath: /calico-secrets\n              name: etcd-certs\n          livenessProbe:\n            exec:\n              command:\n              - /usr/bin/check-status\n              - -l\n            periodSeconds: 10\n            initialDelaySeconds: 10\n            failureThreshold: 6\n            timeoutSeconds: 10\n          readinessProbe:\n            exec:\n              command:\n              - /usr/bin/check-status\n              - -r\n            periodSeconds: 10\n      volumes:\n        # Mount in the etcd TLS secrets with mode 400.\n        # See https://kubernetes.io/docs/concepts/configuration/secret/\n        - name: etcd-certs\n          secret:\n            secretName: calico-etcd-secrets\n            defaultMode: 0440\n"
  },
  {
    "path": "roles/calico/templates/calicoctl.cfg.j2",
    "content": "apiVersion: projectcalico.org/v3\nkind: CalicoAPIConfig\nmetadata:\nspec:\n  datastoreType: \"etcdv3\"\n  etcdEndpoints: {{ ETCD_ENDPOINTS }}\n  etcdKeyFile: /etc/calico/ssl/calico-key.pem\n  etcdCertFile: /etc/calico/ssl/calico.pem\n  etcdCACertFile: {{ ca_dir }}/ca.pem \n"
  },
  {
    "path": "roles/calico/vars/main.yml",
    "content": "# etcd 集群服务地址列表, 根据etcd组成员自动生成\nTMP_ENDPOINTS: \"{% for h in groups['etcd'] %}https://{{ h }}:2379,{% endfor %}\"\nETCD_ENDPOINTS: \"{{ TMP_ENDPOINTS.rstrip(',') }}\"\n\n# calico AS number\nCALICO_AS_NUMBER: 64512\n"
  },
  {
    "path": "roles/chrony/chrony.yml",
    "content": "- hosts:\n  - kube_master\n  - kube_node\n  - etcd\n  - ex_lb\n  - chrony\n  roles:\n  - { role: chrony, when: \"groups['chrony']|length > 0\" }\n"
  },
  {
    "path": "roles/chrony/defaults/main.yml",
    "content": "# 设置时间源服务器【重要：集群内机器时间必须同步】\nntp_servers:\n  - \"ntp1.aliyun.com\"\n  - \"time1.cloud.tencent.com\"\n  - \"0.cn.pool.ntp.org\"\n\n# 设置允许内部时间同步的网络段，比如\"10.0.0.0/8\"，默认全部允许\nlocal_network: \"0.0.0.0/0\"\n"
  },
  {
    "path": "roles/chrony/tasks/main.yml",
    "content": "- name: prepare some dirs\n  file: name={{ item }} state=directory\n  with_items:\n  - \"/etc/chrony\"\n  - \"/var/lib/chrony\"\n  - \"/var/log/chrony\"\n\n- name: 卸载 ntp\n  package: name=ntp state=absent\n  ignore_errors: true\n\n- name: 下载二进制文件chronyd\n  copy: src={{ base_dir }}/bin/chronyd dest=/usr/sbin/chronyd mode=0755\n\n- name: 创建chronyd的systemd unit文件\n  template: src=chronyd.service.j2 dest=/etc/systemd/system/chronyd.service\n\n- name: 配置 chrony server\n  template: src=server.conf.j2 dest=/etc/chrony/chrony.conf\n  when: 'inventory_hostname == groups.chrony[0]'\n\n- name: 配置 chrony client\n  template: src=client.conf.j2 dest=/etc/chrony/chrony.conf\n  when: 'inventory_hostname != groups.chrony[0]'\n\n- name: 开机启用chronyd服务\n  shell: systemctl disable chronyd && systemctl enable chronyd\n  ignore_errors: true\n\n- name: 开启chronyd服务\n  shell: systemctl daemon-reload && systemctl restart chronyd\n  ignore_errors: true\n  tags: restart_chronyd\n\n- name: 以轮询的方式等待chronyd服务启动\n  shell: \"systemctl is-active chronyd.service\"\n  register: svc_status\n  until: '\"active\" in svc_status.stdout'\n  retries: 3\n  delay: 3\n  tags: restart_chronyd\n"
  },
  {
    "path": "roles/chrony/templates/chronyd.service.j2",
    "content": "[Unit]\nDescription=chrony, an NTP client/server\nDocumentation=https://chrony.tuxfamily.org/documentation.html\nConflicts=systemd-timesyncd.service openntpd.service ntpd.service ntp.service ntpsec.service\nAfter=network.target\nConditionCapability=CAP_SYS_TIME\n\n[Service]\n# sysctl net.netfilter.nf_conntrack_count\nType=forking\nPIDFile=/var/run/chrony/chronyd.pid\nExecStart=/usr/sbin/chronyd -f /etc/chrony/chrony.conf\nExecStartPost=/sbin/iptables -t raw -A PREROUTING -p udp -m udp --dport 123 -j NOTRACK\nExecStartPost=/sbin/iptables -t raw -A OUTPUT -p udp -m udp --sport 123 -j NOTRACK\nPrivateTmp=yes\nProtectHome=yes\nProtectSystem=full\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/chrony/templates/client.conf.j2",
    "content": "# Use local server \nserver {{ groups['chrony'][0] }} iburst\n\n# Record the rate at which the system clock gains/losses time.\ndriftfile /var/lib/chrony/drift\n\n# Allow the system clock to be stepped in the first three updates\n# if its offset is larger than 1 second.\nmakestep 1.0 3\n\n# This directive enables kernel synchronisation (every 11 minutes) of the\n# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.\nrtcsync\n\n# Specify directory for dumping measurements.\ndumpdir /var/lib/chrony\n\n# This directive designates subnets (or nodes) from which NTP clients are allowed\n# to access to 'chronyd'.\nallow {{ local_network }}\n\n# Stop bad estimates upsetting machine clock.\nmaxupdateskew 100.0\n\n# Ignor source level\nstratumweight 0\n\n# Comment this line out to turn off logging.\n#log tracking measurements statistics\nlogdir /var/log/chrony\nlog statistics measurements tracking\nnoclientlog\n"
  },
  {
    "path": "roles/chrony/templates/server.conf.j2",
    "content": "# Use public servers from the pool.ntp.org project.\n{% for HOST in ntp_servers %}\nserver {{ HOST }} iburst\n{% endfor %}\npool pool.ntp.org iburst\npool 2.debian.pool.ntp.org iburst\n\n# Record the rate at which the system clock gains/losses time.\ndriftfile /var/lib/chrony/drift\n\n# Allow the system clock to be stepped in the first three updates\n# if its offset is larger than 1 second.\nmakestep 1.0 3\n\n# This directive enables kernel synchronisation (every 11 minutes) of the\n# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.\nrtcsync\n\n# Specify directory for dumping measurements.\ndumpdir /var/lib/chrony\n\n# This directive lets 'chronyd' to serve time even if unsynchronised to any NTP server.\nlocal stratum 10\n\n# This directive designates subnets (or nodes) from which NTP clients are allowed\n# to access to 'chronyd'.\nallow {{ local_network }}\n\n# Stop bad estimates upsetting machine clock.\nmaxupdateskew 100.0\n\n# Ignor source level\nstratumweight 0\n\n# Comment this line out to turn off logging.\n#log tracking measurements statistics\nlogdir /var/log/chrony\nlog statistics measurements tracking\nnoclientlog\n"
  },
  {
    "path": "roles/cilium/cilium.yml",
    "content": "- hosts:\n  - kube_master\n  - kube_node\n  roles:\n  - cilium\n"
  },
  {
    "path": "roles/cilium/files/star_war_example/http-sw-app.yaml",
    "content": "---\napiVersion: v1\nkind: Service\nmetadata:\n  name: deathstar\nspec:\n  type: ClusterIP\n  ports:\n  - port: 80\n  selector:\n    org: empire\n    class: deathstar\n---\napiVersion: apps/v1 \nkind: Deployment\nmetadata:\n  name: deathstar\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      org: empire\n      class: deathstar\n  template:\n    metadata:\n      labels:\n        org: empire\n        class: deathstar\n    spec:\n      containers:\n      - name: deathstar\n        image: docker.io/cilium/starwars\n---\napiVersion: v1\nkind: Pod\nmetadata:\n  name: tiefighter\n  labels:\n    org: empire\n    class: tiefighter\nspec:\n  containers:\n  - name: spaceship\n    image: docker.io/tgraf/netperf\n---\napiVersion: v1\nkind: Pod\nmetadata:\n  name: xwing\n  labels:\n    org: alliance\n    class: xwing\nspec:\n  containers:\n  - name: spaceship\n    image: docker.io/tgraf/netperf\n"
  },
  {
    "path": "roles/cilium/files/star_war_example/sw_l3_l4_l7_policy.yaml",
    "content": "apiVersion: \"cilium.io/v2\"\nkind: CiliumNetworkPolicy\ndescription: \"L7 policy to restrict access to specific HTTP call\"\nmetadata:\n  name: \"rule1\"\nspec:\n  endpointSelector:\n    matchLabels:\n      org: empire\n      class: deathstar\n  ingress:\n  - fromEndpoints:\n    - matchLabels:\n        org: empire\n    toPorts:\n    - ports:\n      - port: \"80\"\n        protocol: TCP\n      rules:\n        http:\n        - method: \"POST\"\n          path: \"/v1/request-landing\"\n"
  },
  {
    "path": "roles/cilium/files/star_war_example/sw_l3_l4_policy.yaml",
    "content": "apiVersion: \"cilium.io/v2\"\nkind: CiliumNetworkPolicy\ndescription: \"L3-L4 policy to restrict deathstar access to empire ships only\"\nmetadata:\n  name: \"rule1\"\nspec:\n  endpointSelector:\n    matchLabels:\n      org: empire\n      class: deathstar\n  ingress:\n  - fromEndpoints:\n    - matchLabels:\n        org: empire\n    toPorts:\n    - ports:\n      - port: \"80\"\n        protocol: TCP\n"
  },
  {
    "path": "roles/cilium/tasks/main.yml",
    "content": "# https://docs.cilium.io/en/stable/installation/k8s-install-helm/#k8s-install-helm\n- name: 转换内核版本为浮点数\n  set_fact:\n     KERNEL_VER: \"{{ ansible_kernel.split('-')[0].split('.')[0]|int + ansible_kernel.split('-')[0].split('.')[1]|int/100 }}\"\n\n- name: 检查内核版本>4.9\n  fail: msg=\"kernel {{ ansible_kernel }} is too old for cilium installing\"\n  when: \"KERNEL_VER|float <= 4.09\"\n\n- block:\n    - name: 创建 cilium chart 个性化设置\n      template: src=values.yaml.j2 dest={{ cluster_dir }}/yml/cilium-values.yaml\n\n    - name: helm 删除 cilium {{ cilium_ver }}\n      shell: \"{{ base_dir }}/bin/helm delete cilium -n kube-system || echo true; sleep 3\"\n      tags: force_change_certs\n      when: 'CHANGE_CA|bool'\n\n    - name: helm 创建 cilium {{ cilium_ver }}\n      shell: \"{{ base_dir }}/bin/helm upgrade cilium --install \\\n              -n kube-system -f {{ cluster_dir }}/yml/cilium-values.yaml \\\n              {{ base_dir }}/roles/cilium/files/cilium-{{ cilium_ver }}.tgz\"\n      tags: force_change_certs\n  run_once: true\n  connection: local  \n\n- name: 下载client工具\n  copy: src={{ base_dir }}/bin/{{ item }} dest={{ bin_dir }}/{{ item }} mode=0755\n  with_items:\n  - cilium\n  - hubble\n\n# 删除原有cni配置\n- name: 删除默认cni配置\n  file: path=/etc/cni/net.d/10-default.conf state=absent\n\n# 等待网络插件部署成功，视下载镜像速度而定\n- name: 轮询等待cilium-node 运行\n  shell: \"{{ base_dir }}/bin/kubectl get pod -n kube-system -owide -lk8s-app=cilium|grep ' {{ K8S_NODENAME }} '|awk '{print $3}'\"\n  register: pod_status\n  until: pod_status.stdout == \"Running\"\n  retries: 15\n  delay: 8\n  ignore_errors: true\n  connection: local\n  tags: force_change_certs\n\n# hubble-relay 可能需要重启一下\n- name: 重启hubble-relay pod\n  shell: \"{{ base_dir }}/bin/kubectl -n kube-system scale deploy hubble-relay --replicas=0 && sleep 5 && \\\n            {{ base_dir }}/bin/kubectl -n kube-system scale deploy hubble-relay --replicas=1\"\n  run_once: true\n  connection: local\n  when: \"cilium_hubble_enabled|bool\"\n  tags: force_change_certs\n"
  },
  {
    "path": "roles/cilium/templates/values.yaml.j2",
    "content": "image:\n  repository: \"easzlab.io.local:5000/cilium/cilium\"\n  tag: \"v{{ cilium_ver }}\"\n  useDigest: false\n\n# -- Additional agent container arguments.\n{% if ENABLE_LOCAL_DNS_CACHE %}\nextraArgs:\n  - --exclude-local-address=\"{{ LOCAL_DNS_CACHE }}/32\"\n{% endif %}\n\nresources:\n  limits:\n    cpu: 4000m\n    memory: 4Gi\n  requests:\n    cpu: 100m\n    memory: 512Mi\n\n{% if cilium_hubble_enabled %}\nhubble:\n  enabled: true\n  relay:\n    enabled: true\n    image:\n      repository: \"easzlab.io.local:5000/cilium/hubble-relay\"\n      tag: \"v{{ cilium_ver }}\"\n      useDigest: false\n  ui:\n{% if cilium_hubble_ui_enabled %}\n    enabled: true\n{% else %}\n    enabled: false\n{% endif %}\n    backend:\n      image:\n        repository: \"easzlab.io.local:5000/cilium/hubble-ui-backend\"\n        tag: \"v0.13.2\"\n        useDigest: false\n    frontend:\n      image:\n        repository: \"easzlab.io.local:5000/cilium/hubble-ui\"\n        tag: \"v0.13.2\"\n        useDigest: false\n{% endif %}\n\nidentityAllocationMode: \"crd\"\n\nipam:\n  # ref: https://docs.cilium.io/en/stable/concepts/networking/ipam/\n  mode: \"cluster-pool\"\n  operator:\n    clusterPoolIPv4PodCIDRList: [\"{{ CLUSTER_CIDR }}\"]\n    clusterPoolIPv4MaskSize: 24\n\n# -- Enable Layer 7 network policy.\nl7Proxy: true\n\n# -- Configure TLS configuration in the agent.\ntls:\n  enabled: true\n  secretsBackend: local\n\netcd:\n  enabled: false\n\noperator:\n  enabled: true\n  image:\n    repository: \"easzlab.io.local:5000/cilium/operator\"\n    tag: \"v{{ cilium_ver }}\"\n    useDigest: false\n  replicas: 1\n  resources:\n    limits:\n      cpu: 1000m\n      memory: 1Gi\n    requests:\n      cpu: 100m\n      memory: 128Mi\n\npreflight:\n  enabled: false\n\nclustermesh:\n  useAPIServer: false\n\nenvoy:\n  enabled: false\n"
  },
  {
    "path": "roles/clean/clean_node.yml",
    "content": "- hosts: \"{{ NODE_TO_CLEAN }}\"\n  roles:\n  - clean\n"
  },
  {
    "path": "roles/clean/defaults/main.yml",
    "content": "# 是否删除 kube_master 相关服务\nDEL_MASTER: \"no\"\n\n# 是否删除 kube_node 相关服务\nDEL_NODE: \"no\"\n\n# 是否删除 etc 相关服务\nDEL_ETCD: \"no\"\n\n# 是否删除 lb 相关服务\nDEL_LB: \"no\"\n\n# 是否删除 chrony 相关服务\nDEL_CHRONY: \"no\"\n\n# 是否删除 kubeasz 环境变量\nDEL_ENV: \"yes\"\n"
  },
  {
    "path": "roles/clean/tasks/clean_chrony.yml",
    "content": "- block:\n    - name: stop and disable chronyd\n      service: name=chronyd state=stopped enabled=no\n      ignore_errors: true\n\n    - name: remove files and dirs\n      file: name={{ item }} state=absent\n      with_items:\n      - \"/etc/chrony\"\n      - \"/var/lib/chrony\"\n      - \"/var/log/chrony\"\n      - \"/var/run/chrony\"\n      - \"/etc/systemd/system/chronyd.service\"\n  ignore_errors: true\n  when: \"groups['chrony']|length > 0\"\n"
  },
  {
    "path": "roles/clean/tasks/clean_etcd.yml",
    "content": "# to clean 'etcd' nodes\n- block:\n  - name: stop and disable etcd service\n    service:\n      name: etcd\n      state: stopped\n      enabled: no\n    ignore_errors: true\n\n  - name: remove files and dirs\n    file: name={{ item }} state=absent\n    with_items:\n    - \"{{ ETCD_DATA_DIR }}\"\n    - \"{{ ETCD_WAL_DIR }}\"\n    - \"/backup/k8s\"\n    - \"/etc/systemd/system/etcd.service\"\n  ignore_errors: true\n  when: \"inventory_hostname in groups['etcd']\"\n"
  },
  {
    "path": "roles/clean/tasks/clean_lb.yml",
    "content": "# to clean 'lb' service\n- block:\n  - name: get service info\n    shell: 'systemctl list-units --type=service |grep -E \"l4lb|keepalived|ssh\"'\n    register: service_info\n\n  - name: remove service l4lb\n    service: name=l4lb state=stopped enabled=no\n    when: '\"l4lb\" in service_info.stdout'\n    ignore_errors: true\n\n  - name: remove service keepalived\n    service: name=keepalived state=stopped enabled=no\n    when: '\"keepalived\" in service_info.stdout'\n    ignore_errors: true\n\n  - name: remove files and dirs\n    file: name={{ item }} state=absent\n    with_items:\n    - \"/etc/l4lb\"\n    - \"/etc/keepalived\"\n    - \"/etc/systemd/system/l4lb.service\"\n    - \"/etc/systemd/system/keepalived.service\"\n    - \"/usr/local/sbin/keepalived\"\n  ignore_errors: true\n  when: \"inventory_hostname in groups['ex_lb']\"\n"
  },
  {
    "path": "roles/clean/tasks/clean_master.yml",
    "content": "# to clean 'kube_master' nodes\n- name: stop and disable kube_master service\n  service: name={{ item }} state=stopped enabled=no\n  with_items:\n  - kube-apiserver\n  - kube-controller-manager\n  - kube-scheduler\n  ignore_errors: true\n  when: \"inventory_hostname in groups['kube_master']\"\n\n- name: remove files and dirs of 'kube_master' nodes\n  file: name={{ item }} state=absent\n  with_items:\n  - \"/var/run/kubernetes\"\n  - \"/etc/systemd/system/kube-apiserver.service\"\n  - \"/etc/systemd/system/kube-controller-manager.service\"\n  - \"/etc/systemd/system/kube-scheduler.service\"\n  ignore_errors: true\n  when: \"inventory_hostname in groups['kube_master']\"\n"
  },
  {
    "path": "roles/clean/tasks/clean_node.yml",
    "content": "# to clean 'kube_node' nodes\n- block:\n  - name: stop and disable kube_node service\n    service: name={{ item }} state=stopped enabled=no\n    with_items:\n    - kube-lb\n    - kubelet\n    - kube-proxy\n    ignore_errors: true\n\n  - name: umount kubelet filesystems\n    shell: \"mount | grep '/var/lib/kubelet'| awk '{print $3}'|xargs umount || exit 0\"\n    ignore_errors: true\n\n  - name: remove files and dirs of 'kube_node' nodes\n    file: name={{ item }} state=absent\n    with_items:\n    - \"/var/lib/kubelet/\"\n    - \"/var/lib/kube-proxy/\"\n    - \"/etc/systemd/system/kube-lb.service\"\n    - \"/etc/systemd/system/kubelet.service\"\n    - \"/etc/systemd/system/kube-proxy.service\"\n    - \"/etc/kube-lb/\"\n    - \"/etc/kubernetes/\"\n    - \"/opt/kubeasz_prepare_tasks\"\n    - \"/root/.kube/config\"\n    ignore_errors: true\n\n# to clean container runtime and networking\n  - block:\n      - name: to check if container 'kubeasz' is running\n        shell: 'docker ps|grep kubeasz || echo \"NOT FOUND\"'\n        register: install_info\n\n      - block:\n        - name: stop and disable docker service\n          service:\n            name: docker\n            state: stopped\n            enabled: no\n          ignore_errors: true\n  \n        # as k8s-network-plugins use host-network, '/var/run/docker/netns/default' must be umounted\n        - name: umount docker filesystem-1\n          mount: path=/var/run/docker/netns/default state=unmounted\n  \n        - name: umount docker filesystem-2\n          mount: path=/var/lib/docker/overlay state=unmounted\n  \n        - name: umount docker filesystem-3\n          shell: \"echo /var/lib/docker/overlay2/*/merged|xargs umount || exit 0\"\n          ignore_errors: true\n\n        - name: umount docker filesystem-4\n          shell: \"echo /var/lib/docker/containers/*/mounts/shm|xargs umount || exit 0\"\n          ignore_errors: true\n\n        - name: umount docker filesystem-5\n          shell: \"echo /var/run/docker/netns/*|xargs umount || exit 0\"\n          ignore_errors: true\n\n        - name: remove files and dirs\n          file: name={{ item }} state=absent\n          with_items:\n          - \"/var/lib/docker/\"\n          - \"/var/lib/dockershim/\"\n          - \"/var/run/docker/\"\n          - \"/etc/docker/\"\n          - \"/etc/systemd/system/docker.service\"\n          - \"/etc/systemd/system/docker.service.requires/\"\n          - \"/etc/systemd/system/docker.service.d/\"\n          - \"/etc/bash_completion.d/docker\"\n          - \"/usr/bin/docker\"\n        when: \"'kubeasz' not in install_info.stdout\"\n    ignore_errors: true\n    when: CONTAINER_RUNTIME == 'docker'\n\n  - block:\n      - name: stop and disable {{ CONTAINERD_SERVICE_NAME }}\n        service:\n          name: containerd\n          state: stopped\n          enabled: no\n        ignore_errors: true\n\n      - name: umount containerd filesystems\n        shell: \"mount | grep 'containerd/io.containerd'| awk '{print $3}'|xargs umount || exit 0\"\n        ignore_errors: true\n\n      - name: remove files and dirs\n        file: name={{ item }} state=absent\n        with_items:\n        - \"{{ CONTAINERD_CONFIG_DIR }}\"\n        - \"/etc/crictl.yaml\"\n        - \"/etc/systemd/system/{{ CONTAINERD_SERVICE_NAME }}\"\n        - \"/opt/containerd/\"\n        - \"{{ CONTAINERD_ROOT_DIR }}\"\n        - \"{{ CONTAINERD_STATE_DIR }}\"\n    ignore_errors: true\n    when: CONTAINER_RUNTIME == 'containerd'\n\n  - name: remove files and dirs2\n    file: name={{ item }} state=absent\n    with_items:\n    - \"/etc/cni/\"\n    - \"/run/flannel/\"\n    - \"/etc/calico/\"\n    - \"/var/lib/calico/\"\n    - \"/var/log/calico/\"\n    - \"/etc/cilium/\"\n    - \"/sys/fs/bpf/tc/\"\n    - \"/var/lib/cni/\"\n    - \"/var/lib/kube-router/\"\n    - \"/var/run/openvswitch/\"\n    - \"/var/run/ovn/\"\n    - \"/etc/origin/openvswitch/\"\n    - \"/etc/origin/ovn/\"\n    - \"/var/log/openvswitch/\"\n    - \"/var/log/ovn/\"\n    - \"/var/log/kube-ovn/\"\n    ignore_errors: true\n\n  when: \"inventory_hostname in groups['kube_master'] or inventory_hostname in groups['kube_node']\"\n"
  },
  {
    "path": "roles/clean/tasks/main.yml",
    "content": "# \n- import_tasks: clean_etcd.yml\n  when: 'DEL_ETCD == \"yes\"'\n\n- import_tasks: clean_master.yml\n  when: 'DEL_MASTER == \"yes\"'\n\n- import_tasks: clean_node.yml\n  when: 'DEL_NODE == \"yes\"'\n\n- import_tasks: clean_lb.yml\n  when: 'DEL_LB == \"yes\"'\n\n- import_tasks: clean_chrony.yml\n  when: 'DEL_CHRONY == \"yes\"'\n\n- name: clean 'ENV PATH'\n  lineinfile:\n    dest: ~/.bashrc\n    state: absent\n    regexp: '{{ item }}'\n  with_items:\n  - 'kubeasz'\n  - 'helm completion'\n  - 'kubectl completion'\n  - 'crictl completion'\n  - 'HELM_TLS_ENABLE'\n  when: 'DEL_ENV == \"yes\"'\n\n- name: 删除 k8s_nodename 在节点的 /etc/hosts 地址解析\n  blockinfile:\n    path: /etc/hosts\n    state: absent\n    marker: \"### {mark} KUBEASZ MANAGED BLOCK\"\n\n  #- name: remove binaries\n  #  file: name={{ item }} state=absent\n  #  with_items:\n  #  - \"/opt/kube/bin\"\n  #  when: 'DEL_ETCD == \"yes\" and DEL_NODE == \"yes\" and DEL_MASTER == \"yes\"'\n\n- name: 重启提示 WARNNING\n  debug:\n    msg: \"[重要]: 请重启节点以确保清除系统残留的虚拟网卡、路由信息、iptalbes|ipvs规则等 \\\n          [IMPORTANT]: please reboot nodes, makesure to clean out net interfaces, routes and iptables/ipvs rules\"\n  when: 'DEL_ETCD == \"yes\" and DEL_NODE == \"yes\" and DEL_MASTER == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/files/kubeblocks_crds.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: clusterdefinitions.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ClusterDefinition\n    listKind: ClusterDefinitionList\n    plural: clusterdefinitions\n    shortNames:\n    - cd\n    singular: clusterdefinition\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: topologies\n      jsonPath: .status.topologies\n      name: Topologies\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          ClusterDefinition defines the topology for databases or storage systems,\n          offering a variety of topological configurations to meet diverse deployment needs and scenarios.\n\n\n          It includes a list of Components and/or Shardings, each linked to a ComponentDefinition or a ShardingDefinition,\n          which enhances reusability and reduce redundancy.\n          For example, widely used components such as etcd and Zookeeper can be defined once and reused across multiple ClusterDefinitions,\n          simplifying the setup of new systems.\n\n\n          Additionally, ClusterDefinition also specifies the sequence of startup, upgrade, and shutdown between Components and/or Shardings,\n          ensuring a controlled and predictable management of cluster lifecycles.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ClusterDefinitionSpec defines the desired state of ClusterDefinition.\n            properties:\n              topologies:\n                description: Topologies defines all possible topologies within the\n                  cluster.\n                items:\n                  description: ClusterTopology represents the definition for a specific\n                    cluster topology.\n                  properties:\n                    components:\n                      description: Components specifies the components in the topology.\n                      items:\n                        description: ClusterTopologyComponent defines a Component\n                          within a ClusterTopology.\n                        properties:\n                          compDef:\n                            description: \"Specifies the exact name, name prefix, or\n                              regular expression pattern for matching the name of\n                              the ComponentDefinition\\ncustom resource (CR) that defines\n                              the Component's characteristics and behavior.\\n\\n\\nThe\n                              system selects the ComponentDefinition CR with the latest\n                              version that matches the pattern.\\nThis approach allows:\\n\\n\\n1.\n                              Precise selection by providing the exact name of a ComponentDefinition\n                              CR.\\n2. Flexible and automatic selection of the most\n                              up-to-date ComponentDefinition CR\\n\\t  by specifying\n                              a name prefix or regular expression pattern.\\n\\n\\nCannot\n                              be updated once set.\"\n                            maxLength: 64\n                            type: string\n                          name:\n                            description: |-\n                              Defines the unique identifier of the component within the cluster topology.\n\n\n                              It follows IANA Service naming rules and is used as part of the Service's DNS name.\n                              The name must start with a lowercase letter, can contain lowercase letters, numbers,\n                              and hyphens, and must end with a lowercase letter or number.\n\n\n                              If the @template field is set to true, the name will be used as a prefix to match the specific components dynamically created.\n\n\n                              Cannot be updated once set.\n                            maxLength: 16\n                            pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                          template:\n                            description: |-\n                              Specifies whether the topology component will be considered as a template for instantiating components upon user requests dynamically.\n\n\n                              Cannot be updated once set.\n                            type: boolean\n                        required:\n                        - compDef\n                        - name\n                        type: object\n                      maxItems: 128\n                      type: array\n                    default:\n                      description: |-\n                        Default indicates whether this topology serves as the default configuration.\n                        When set to true, this topology is automatically used unless another is explicitly specified.\n                      type: boolean\n                    name:\n                      description: |-\n                        Name is the unique identifier for the cluster topology.\n                        Cannot be updated.\n                      maxLength: 32\n                      type: string\n                    orders:\n                      description: |-\n                        Specifies the sequence in which components within a cluster topology are\n                        started, stopped, and upgraded.\n                        This ordering is crucial for maintaining the correct dependencies and operational flow across components.\n                      properties:\n                        provision:\n                          description: |-\n                            Specifies the order for creating and initializing entities.\n                            This is designed for entities that depend on one another. Entities without dependencies can be grouped together.\n\n\n                            Entities that can be provisioned independently or have no dependencies can be listed together in the same stage,\n                            separated by commas.\n                          items:\n                            type: string\n                          type: array\n                        terminate:\n                          description: |-\n                            Outlines the order for stopping and deleting entities.\n                            This sequence is designed for entities that require a graceful shutdown or have interdependencies.\n\n\n                            Entities that can be terminated independently or have no dependencies can be listed together in the same stage,\n                            separated by commas.\n                          items:\n                            type: string\n                          type: array\n                        update:\n                          description: |-\n                            Update determines the order for updating entities' specifications, such as image upgrades or resource scaling.\n                            This sequence is designed for entities that have dependencies or require specific update procedures.\n\n\n                            Entities that can be updated independently or have no dependencies can be listed together in the same stage,\n                            separated by commas.\n                          items:\n                            type: string\n                          type: array\n                      type: object\n                    shardings:\n                      description: Shardings specifies the shardings in the topology.\n                      items:\n                        description: ClusterTopologySharding defines a sharding within\n                          a ClusterTopology.\n                        properties:\n                          name:\n                            description: |-\n                              Defines the unique identifier of the sharding within the cluster topology.\n                              It follows IANA Service naming rules and is used as part of the Service's DNS name.\n                              The name must start with a lowercase letter, can contain lowercase letters, numbers,\n                              and hyphens, and must end with a lowercase letter or number.\n\n\n                              Cannot be updated once set.\n                            maxLength: 16\n                            pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                          shardingDef:\n                            description: |-\n                              Specifies the sharding definition that defines the characteristics and behavior of the sharding.\n\n\n                              The system selects the ShardingDefinition CR with the latest version that matches the pattern.\n                              This approach allows:\n\n\n                              1. Precise selection by providing the exact name of a ShardingDefinition CR.\n                              2. Flexible and automatic selection of the most up-to-date ShardingDefinition CR\n                              by specifying a regular expression pattern.\n\n\n                              Once set, this field cannot be updated.\n                            maxLength: 64\n                            type: string\n                        required:\n                        - name\n                        - shardingDef\n                        type: object\n                      maxItems: 128\n                      type: array\n                  required:\n                  - name\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n            type: object\n          status:\n            description: ClusterDefinitionStatus defines the observed state of ClusterDefinition\n            properties:\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: Represents the most recent generation observed for this\n                  ClusterDefinition.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Specifies the current phase of the ClusterDefinition. Valid values are `empty`, `Available`, `Unavailable`.\n                  When `Available`, the ClusterDefinition is ready and can be referenced by related objects.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n              topologies:\n                description: Topologies this ClusterDefinition supported.\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n  - additionalPrinterColumns:\n    - description: topologies\n      jsonPath: .status.topologies\n      name: Topologies\n      type: string\n    - description: service references\n      jsonPath: .status.serviceRefs\n      name: ServiceRefs\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          ClusterDefinition defines the topology for databases or storage systems,\n          offering a variety of topological configurations to meet diverse deployment needs and scenarios.\n\n\n          It includes a list of Components, each linked to a ComponentDefinition, which enhances reusability and reduce redundancy.\n          For example, widely used components such as etcd and Zookeeper can be defined once and reused across multiple ClusterDefinitions,\n          simplifying the setup of new systems.\n\n\n          Additionally, ClusterDefinition also specifies the sequence of startup, upgrade, and shutdown for Components,\n          ensuring a controlled and predictable management of component lifecycles.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ClusterDefinitionSpec defines the desired state of ClusterDefinition.\n            properties:\n              componentDefs:\n                description: |-\n                  Provides the definitions for the cluster components.\n\n\n                  Deprecated since v0.9.\n                  Components should now be individually defined using ComponentDefinition and\n                  collectively referenced via `topology.components`.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                items:\n                  description: |-\n                    ClusterComponentDefinition defines a Component within a ClusterDefinition but is deprecated and\n                    has been replaced by ComponentDefinition.\n\n\n                    Deprecated: Use ComponentDefinition instead. This type is deprecated as of version 0.8.\n                  properties:\n                    characterType:\n                      description: Defines well-known database component name, such\n                        as mongos(mongodb), proxy(redis), mariadb(mysql).\n                      type: string\n                    componentDefRef:\n                      description: |-\n                        Used to inject values from other components into the current component. Values will be saved and updated in a\n                        configmap and mounted to the current component.\n                      items:\n                        description: |-\n                          ComponentDefRef is used to select the component and its fields to be referenced.\n\n\n                          Deprecated since v0.8.\n                        properties:\n                          componentDefName:\n                            description: The name of the componentDef to be selected.\n                            type: string\n                          componentRefEnv:\n                            description: The values that are to be injected as environment\n                              variables into each component.\n                            items:\n                              description: |-\n                                ComponentRefEnv specifies name and value of an env.\n\n\n                                Deprecated since v0.8.\n                              properties:\n                                name:\n                                  description: The name of the env, it must be a C\n                                    identifier.\n                                  pattern: ^[A-Za-z_][A-Za-z0-9_]*$\n                                  type: string\n                                value:\n                                  description: The value of the env.\n                                  type: string\n                                valueFrom:\n                                  description: The source from which the value of\n                                    the env.\n                                  properties:\n                                    fieldPath:\n                                      description: |-\n                                        The jsonpath of the source to select when the Type is `FieldRef`.\n                                        Two objects are registered in the jsonpath: `componentDef` and `components`:\n\n\n                                        - `componentDef` is the component definition object specified in `componentRef.componentDefName`.\n                                        - `components` are the component list objects referring to the component definition object.\n                                      type: string\n                                    format:\n                                      default: =\"$POD_FQDN\"\n                                      description: |-\n                                        Defines the format of each headless service address.\n                                        Three builtin variables can be used as placeholders: `$POD_ORDINAL`, `$POD_FQDN`, `$POD_NAME`\n\n\n                                        - `$POD_ORDINAL` represents the ordinal of the pod.\n                                        - `$POD_FQDN` represents the fully qualified domain name of the pod.\n                                        - `$POD_NAME` represents the name of the pod.\n                                      type: string\n                                    joinWith:\n                                      default: ','\n                                      description: The string used to join the values\n                                        of headless service addresses.\n                                      type: string\n                                    type:\n                                      allOf:\n                                      - enum:\n                                        - FieldRef\n                                        - ServiceRef\n                                        - HeadlessServiceRef\n                                      - enum:\n                                        - FieldRef\n                                        - ServiceRef\n                                        - HeadlessServiceRef\n                                      description: 'Specifies the source to select.\n                                        It can be one of three types: `FieldRef`,\n                                        `ServiceRef`, `HeadlessServiceRef`.'\n                                      type: string\n                                  required:\n                                  - type\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                            x-kubernetes-list-map-keys:\n                            - name\n                            x-kubernetes-list-type: map\n                          failurePolicy:\n                            allOf:\n                            - enum:\n                              - Ignore\n                              - Fail\n                            - enum:\n                              - Ignore\n                              - Fail\n                            description: Defines the policy to be followed in case\n                              of a failure in finding the component.\n                            type: string\n                        required:\n                        - componentDefName\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - componentDefName\n                      x-kubernetes-list-type: map\n                    configSpecs:\n                      description: Defines the template of configurations.\n                      items:\n                        properties:\n                          asEnvFrom:\n                            description: |-\n                              Specifies the containers to inject the ConfigMap parameters as environment variables.\n\n\n                              This is useful when application images accept parameters through environment variables and\n                              generate the final configuration file in the startup script based on these variables.\n\n\n                              This field allows users to specify a list of container names, and KubeBlocks will inject the environment\n                              variables converted from the ConfigMap into these designated containers. This provides a flexible way to\n                              pass the configuration items from the ConfigMap to the container without modifying the image.\n\n\n                              Deprecated: `asEnvFrom` has been deprecated since 0.9.0 and will be removed in 0.10.0.\n                              Use `injectEnvTo` instead.\n                            items:\n                              type: string\n                            type: array\n                            x-kubernetes-list-type: set\n                          asSecret:\n                            description: Whether to store the final rendered parameters\n                              as a secret.\n                            type: boolean\n                          constraintRef:\n                            description: Specifies the name of the referenced configuration\n                              constraints object.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          defaultMode:\n                            description: |-\n                              The operator attempts to set default file permissions for scripts (0555) and configurations (0444).\n                              However, certain database engines may require different file permissions.\n                              You can specify the desired file permissions here.\n\n\n                              Must be specified as an octal value between 0000 and 0777 (inclusive),\n                              or as a decimal value between 0 and 511 (inclusive).\n                              YAML supports both octal and decimal values for file permissions.\n\n\n                              Please note that this setting only affects the permissions of the files themselves.\n                              Directories within the specified path are not impacted by this setting.\n                              It's important to be aware that this setting might conflict with other options\n                              that influence the file mode, such as fsGroup.\n                              In such cases, the resulting file mode may have additional bits set.\n                              Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                            format: int32\n                            type: integer\n                          injectEnvTo:\n                            description: |-\n                              Specifies the containers to inject the ConfigMap parameters as environment variables.\n\n\n                              This is useful when application images accept parameters through environment variables and\n                              generate the final configuration file in the startup script based on these variables.\n\n\n                              This field allows users to specify a list of container names, and KubeBlocks will inject the environment\n                              variables converted from the ConfigMap into these designated containers. This provides a flexible way to\n                              pass the configuration items from the ConfigMap to the container without modifying the image.\n                            items:\n                              type: string\n                            type: array\n                            x-kubernetes-list-type: set\n                          keys:\n                            description: |-\n                              Specifies the configuration files within the ConfigMap that support dynamic updates.\n\n\n                              A configuration template (provided in the form of a ConfigMap) may contain templates for multiple\n                              configuration files.\n                              Each configuration file corresponds to a key in the ConfigMap.\n                              Some of these configuration files may support dynamic modification and reloading without requiring\n                              a pod restart.\n\n\n                              If empty or omitted, all configuration files in the ConfigMap are assumed to support dynamic updates,\n                              and ConfigConstraint applies to all keys.\n                            items:\n                              type: string\n                            type: array\n                            x-kubernetes-list-type: set\n                          legacyRenderedConfigSpec:\n                            description: |-\n                              Specifies the secondary rendered config spec for pod-specific customization.\n\n\n                              The template is rendered inside the pod (by the \"config-manager\" sidecar container) and merged with the main\n                              template's render result to generate the final configuration file.\n\n\n                              This field is intended to handle scenarios where different pods within the same Component have\n                              varying configurations. It allows for pod-specific customization of the configuration.\n\n\n                              Note: This field will be deprecated in future versions, and the functionality will be moved to\n                              `cluster.spec.componentSpecs[*].instances[*]`.\n                            properties:\n                              namespace:\n                                default: default\n                                description: |-\n                                  Specifies the namespace of the referenced configuration template ConfigMap object.\n                                  An empty namespace is equivalent to the \"default\" namespace.\n                                pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                                type: string\n                              policy:\n                                default: none\n                                description: Defines the strategy for merging externally\n                                  imported templates into component templates.\n                                enum:\n                                - patch\n                                - replace\n                                - none\n                                type: string\n                              templateRef:\n                                description: Specifies the name of the referenced\n                                  configuration template ConfigMap object.\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                            required:\n                            - templateRef\n                            type: object\n                          name:\n                            description: Specifies the name of the configuration template.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          namespace:\n                            default: default\n                            description: |-\n                              Specifies the namespace of the referenced configuration template ConfigMap object.\n                              An empty namespace is equivalent to the \"default\" namespace.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                          reRenderResourceTypes:\n                            description: |-\n                              Specifies whether the configuration needs to be re-rendered after v-scale or h-scale operations to reflect changes.\n\n\n                              In some scenarios, the configuration may need to be updated to reflect the changes in resource allocation\n                              or cluster topology. Examples:\n\n\n                              - Redis: adjust maxmemory after v-scale operation.\n                              - MySQL: increase max connections after v-scale operation.\n                              - Zookeeper: update zoo.cfg with new node addresses after h-scale operation.\n                            items:\n                              description: RerenderResourceType defines the resource\n                                requirements for a component.\n                              enum:\n                              - vscale\n                              - hscale\n                              - tls\n                              - shardingHScale\n                              type: string\n                            type: array\n                            x-kubernetes-list-type: set\n                          templateRef:\n                            description: Specifies the name of the referenced configuration\n                              template ConfigMap object.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          volumeName:\n                            description: |-\n                              Refers to the volume name of PodTemplate. The configuration file produced through the configuration\n                              template will be mounted to the corresponding volume. Must be a DNS_LABEL name.\n                              The volume name must be defined in podSpec.containers[*].volumeMounts.\n                            maxLength: 63\n                            pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    consensusSpec:\n                      description: Defines spec for `Consensus` workloads. It's required\n                        if the workload type is `Consensus`.\n                      properties:\n                        followers:\n                          description: Members of the consensus set that have voting\n                            rights but are not the leader.\n                          items:\n                            description: ConsensusMember is deprecated since v0.7.\n                            properties:\n                              accessMode:\n                                default: ReadWrite\n                                description: Specifies the services that this member\n                                  is capable of providing.\n                                enum:\n                                - None\n                                - Readonly\n                                - ReadWrite\n                                type: string\n                              name:\n                                default: leader\n                                description: Specifies the name of the consensus member.\n                                type: string\n                              replicas:\n                                default: 0\n                                description: |-\n                                  Indicates the number of Pods that perform this role.\n                                  The default is 1 for `Leader`, 0 for `Learner`, others for `Followers`.\n                                format: int32\n                                minimum: 0\n                                type: integer\n                            required:\n                            - accessMode\n                            - name\n                            type: object\n                          type: array\n                        leader:\n                          description: Represents a single leader in the consensus\n                            set.\n                          properties:\n                            accessMode:\n                              default: ReadWrite\n                              description: Specifies the services that this member\n                                is capable of providing.\n                              enum:\n                              - None\n                              - Readonly\n                              - ReadWrite\n                              type: string\n                            name:\n                              default: leader\n                              description: Specifies the name of the consensus member.\n                              type: string\n                            replicas:\n                              default: 0\n                              description: |-\n                                Indicates the number of Pods that perform this role.\n                                The default is 1 for `Leader`, 0 for `Learner`, others for `Followers`.\n                              format: int32\n                              minimum: 0\n                              type: integer\n                          required:\n                          - accessMode\n                          - name\n                          type: object\n                        learner:\n                          description: Represents a member of the consensus set that\n                            does not have voting rights.\n                          properties:\n                            accessMode:\n                              default: ReadWrite\n                              description: Specifies the services that this member\n                                is capable of providing.\n                              enum:\n                              - None\n                              - Readonly\n                              - ReadWrite\n                              type: string\n                            name:\n                              default: leader\n                              description: Specifies the name of the consensus member.\n                              type: string\n                            replicas:\n                              default: 0\n                              description: |-\n                                Indicates the number of Pods that perform this role.\n                                The default is 1 for `Leader`, 0 for `Learner`, others for `Followers`.\n                              format: int32\n                              minimum: 0\n                              type: integer\n                          required:\n                          - accessMode\n                          - name\n                          type: object\n                        llPodManagementPolicy:\n                          description: |-\n                            Controls the creation of pods during initial scale up, replacement of pods on nodes, and scaling down.\n\n\n                            - `OrderedReady`: Creates pods in increasing order (pod-0, then pod-1, etc). The controller waits until each pod\n                            is ready before continuing. Pods are removed in reverse order when scaling down.\n                            - `Parallel`: Creates pods in parallel to match the desired scale without waiting. All pods are deleted at once\n                            when scaling down.\n                          type: string\n                        llUpdateStrategy:\n                          description: |-\n                            Specifies the low-level StatefulSetUpdateStrategy to be used when updating Pods in the StatefulSet upon a\n                            revision to the Template.\n                            `UpdateStrategy` will be ignored if this is provided.\n                          properties:\n                            rollingUpdate:\n                              description: RollingUpdate is used to communicate parameters\n                                when Type is RollingUpdateStatefulSetStrategyType.\n                              properties:\n                                maxUnavailable:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    The maximum number of pods that can be unavailable during the update.\n                                    Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).\n                                    Absolute number is calculated from percentage by rounding up. This can not be 0.\n                                    Defaults to 1. This field is alpha-level and is only honored by servers that enable the\n                                    MaxUnavailableStatefulSet feature. The field applies to all pods in the range 0 to\n                                    Replicas-1. That means if there is any unavailable pod in the range 0 to Replicas-1, it\n                                    will be counted towards MaxUnavailable.\n                                  x-kubernetes-int-or-string: true\n                                partition:\n                                  description: |-\n                                    Partition indicates the ordinal at which the StatefulSet should be partitioned\n                                    for updates. During a rolling update, all pods from ordinal Replicas-1 to\n                                    Partition are updated. All pods from ordinal Partition-1 to 0 remain untouched.\n                                    This is helpful in being able to do a canary based deployment. The default value is 0.\n                                  format: int32\n                                  type: integer\n                              type: object\n                            type:\n                              description: |-\n                                Type indicates the type of the StatefulSetUpdateStrategy.\n                                Default is RollingUpdate.\n                              type: string\n                          type: object\n                        updateStrategy:\n                          default: Serial\n                          description: |-\n                            Specifies the strategy for updating Pods.\n                            For workloadType=`Consensus`, the update strategy can be one of the following:\n\n\n                            - `Serial`: Updates Members sequentially to minimize component downtime.\n                            - `BestEffortParallel`: Updates Members in parallel to minimize component write downtime. Majority remains online\n                            at all times.\n                            - `Parallel`: Forces parallel updates.\n                          enum:\n                          - Serial\n                          - BestEffortParallel\n                          - Parallel\n                          type: string\n                      required:\n                      - leader\n                      type: object\n                    customLabelSpecs:\n                      description: Used for custom label tags which you want to add\n                        to the component resources.\n                      items:\n                        description: CustomLabelSpec is deprecated since v0.8.\n                        properties:\n                          key:\n                            description: The key of the label.\n                            type: string\n                          resources:\n                            description: The resources that will be patched with the\n                              label.\n                            items:\n                              description: GVKResource is deprecated since v0.8.\n                              properties:\n                                gvk:\n                                  description: |-\n                                    Represents the GVK of a resource, such as \"v1/Pod\", \"apps/v1/StatefulSet\", etc.\n                                    When a resource matching this is found by the selector, a custom label will be added if it doesn't already exist,\n                                    or updated if it does.\n                                  type: string\n                                selector:\n                                  additionalProperties:\n                                    type: string\n                                  description: A label query used to filter a set\n                                    of resources.\n                                  type: object\n                              required:\n                              - gvk\n                              type: object\n                            type: array\n                          value:\n                            description: The value of the label.\n                            type: string\n                        required:\n                        - key\n                        - value\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - key\n                      x-kubernetes-list-type: map\n                    description:\n                      description: Description of the component definition.\n                      type: string\n                    exporter:\n                      description: Defines the metrics exporter.\n                      properties:\n                        containerName:\n                          description: Specifies the name of the built-in metrics\n                            exporter container.\n                          type: string\n                        scrapePath:\n                          description: |-\n                            Specifies the http/https url path to scrape for metrics.\n                            If empty, Prometheus uses the default value (e.g. `/metrics`).\n                          type: string\n                        scrapePort:\n                          description: Specifies the port name to scrape for metrics.\n                          type: string\n                        scrapeScheme:\n                          description: |-\n                            Specifies the schema to use for scraping.\n                            `http` and `https` are the expected values unless you rewrite the `__scheme__` label via relabeling.\n                            If empty, Prometheus uses the default value `http`.\n                          enum:\n                          - http\n                          - https\n                          type: string\n                      type: object\n                    horizontalScalePolicy:\n                      description: Defines the behavior of horizontal scale.\n                      properties:\n                        backupPolicyTemplateName:\n                          description: Refers to the backup policy template.\n                          type: string\n                        type:\n                          default: None\n                          description: |-\n                            Determines the data synchronization method when a component scales out.\n                            The policy can be one of the following: {None, CloneVolume}. The default policy is `None`.\n\n\n                            - `None`: This is the default policy. It creates an empty volume without data cloning.\n                            - `CloneVolume`: This policy clones data to newly scaled pods. It first tries to use a volume snapshot.\n                              If volume snapshot is not enabled, it will attempt to use a backup tool. If neither method works, it will report an error.\n                            - `Snapshot`: This policy is deprecated and is an alias for CloneVolume.\n                          enum:\n                          - None\n                          - CloneVolume\n                          - Snapshot\n                          type: string\n                        volumeMountsName:\n                          description: |-\n                            Specifies the volumeMount of the container to backup.\n                            This only works if Type is not None. If not specified, the first volumeMount will be selected.\n                          type: string\n                      type: object\n                    logConfigs:\n                      description: Specify the logging files which can be observed\n                        and configured by cluster users.\n                      items:\n                        properties:\n                          filePathPattern:\n                            description: |-\n                              Specifies the paths or patterns identifying where the log files are stored.\n                              This field allows the system to locate and manage log files effectively.\n\n\n                              Examples:\n\n\n                              - /home/postgres/pgdata/pgroot/data/log/postgresql-*\n                              - /data/mysql/log/mysqld-error.log\n                            maxLength: 4096\n                            type: string\n                          name:\n                            description: |-\n                              Specifies a descriptive label for the log type, such as 'slow' for a MySQL slow log file.\n                              It provides a clear identification of the log's purpose and content.\n                            maxLength: 128\n                            type: string\n                        required:\n                        - filePathPattern\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    monitor:\n                      description: |-\n                        Deprecated since v0.9\n                        monitor is monitoring config which provided by provider.\n                      properties:\n                        builtIn:\n                          default: false\n                          description: |-\n                            builtIn is a switch to enable KubeBlocks builtIn monitoring.\n                            If BuiltIn is set to true, monitor metrics will be scraped automatically.\n                            If BuiltIn is set to false, the provider should set ExporterConfig and Sidecar container own.\n                          type: boolean\n                        exporterConfig:\n                          description: |-\n                            exporterConfig provided by provider, which specify necessary information to Time Series Database.\n                            exporterConfig is valid when builtIn is false.\n                          properties:\n                            scrapePath:\n                              default: /metrics\n                              description: scrapePath is exporter url path for Time\n                                Series Database to scrape metrics.\n                              maxLength: 128\n                              type: string\n                            scrapePort:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: scrapePort is exporter port for Time Series\n                                Database to scrape metrics.\n                              x-kubernetes-int-or-string: true\n                          required:\n                          - scrapePort\n                          type: object\n                      type: object\n                    name:\n                      description: |-\n                        This name could be used as default name of `cluster.spec.componentSpecs.name`, and needs to conform with same\n                        validation rules as `cluster.spec.componentSpecs.name`, currently complying with IANA Service Naming rule.\n                        This name will apply to cluster objects as the value of label \"apps.kubeblocks.io/component-name\".\n                      maxLength: 22\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    podSpec:\n                      description: Defines the pod spec template of component.\n                      properties:\n                        activeDeadlineSeconds:\n                          description: |-\n                            Optional duration in seconds the pod may be active on the node relative to\n                            StartTime before the system will actively try to mark it failed and kill associated containers.\n                            Value must be a positive integer.\n                          format: int64\n                          type: integer\n                        affinity:\n                          description: If specified, the pod's scheduling constraints\n                          properties:\n                            nodeAffinity:\n                              description: Describes node affinity scheduling rules\n                                for the pod.\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: |-\n                                      An empty preferred scheduling term matches all objects with implicit weight 0\n                                      (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                    properties:\n                                      preference:\n                                        description: A node selector term, associated\n                                          with the corresponding weight.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      weight:\n                                        description: Weight associated with matching\n                                          the corresponding nodeSelectorTerm, in the\n                                          range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - preference\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to an update), the system\n                                    may or may not try to eventually evict the pod from its node.\n                                  properties:\n                                    nodeSelectorTerms:\n                                      description: Required. A list of node selector\n                                        terms. The terms are ORed.\n                                      items:\n                                        description: |-\n                                          A null or empty node selector term matches no objects. The requirements of\n                                          them are ANDed.\n                                          The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      type: array\n                                  required:\n                                  - nodeSelectorTerms\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                              type: object\n                            podAffinity:\n                              description: Describes pod affinity scheduling rules\n                                (e.g. co-locate this pod in the same node, zone, etc.\n                                as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                            podAntiAffinity:\n                              description: Describes pod anti-affinity scheduling\n                                rules (e.g. avoid putting this pod in the same node,\n                                zone, etc. as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the anti-affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the anti-affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the anti-affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                          type: object\n                        automountServiceAccountToken:\n                          description: AutomountServiceAccountToken indicates whether\n                            a service account token should be automatically mounted.\n                          type: boolean\n                        containers:\n                          description: |-\n                            List of containers belonging to the pod.\n                            Containers cannot currently be added or removed.\n                            There must be at least one container in a Pod.\n                            Cannot be updated.\n                          items:\n                            description: A single application container that you want\n                              to run within a pod.\n                            properties:\n                              args:\n                                description: |-\n                                  Arguments to the entrypoint.\n                                  The container image's CMD is used if this is not provided.\n                                  Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                  cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                  produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                  of whether the variable exists or not. Cannot be updated.\n                                  More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Entrypoint array. Not executed within a shell.\n                                  The container image's ENTRYPOINT is used if this is not provided.\n                                  Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                  cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                  produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                  of whether the variable exists or not. Cannot be updated.\n                                  More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                items:\n                                  type: string\n                                type: array\n                              env:\n                                description: |-\n                                  List of environment variables to set in the container.\n                                  Cannot be updated.\n                                items:\n                                  description: EnvVar represents an environment variable\n                                    present in a Container.\n                                  properties:\n                                    name:\n                                      description: Name of the environment variable.\n                                        Must be a C_IDENTIFIER.\n                                      type: string\n                                    value:\n                                      description: |-\n                                        Variable references $(VAR_NAME) are expanded\n                                        using the previously defined environment variables in the container and\n                                        any service environment variables. If a variable cannot be resolved,\n                                        the reference in the input string will be unchanged. Double $$ are reduced\n                                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                        Escaped references will never be expanded, regardless of whether the variable\n                                        exists or not.\n                                        Defaults to \"\".\n                                      type: string\n                                    valueFrom:\n                                      description: Source for the environment variable's\n                                        value. Cannot be used if value is not empty.\n                                      properties:\n                                        configMapKeyRef:\n                                          description: Selects a key of a ConfigMap.\n                                          properties:\n                                            key:\n                                              description: The key to select.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        fieldRef:\n                                          description: |-\n                                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        secretKeyRef:\n                                          description: Selects a key of a secret in\n                                            the pod's namespace\n                                          properties:\n                                            key:\n                                              description: The key of the secret to\n                                                select from.  Must be a valid secret\n                                                key.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                              envFrom:\n                                description: |-\n                                  List of sources to populate environment variables in the container.\n                                  The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                  will be reported as an event when the container is starting. When a key exists in multiple\n                                  sources, the value associated with the last source will take precedence.\n                                  Values defined by an Env with a duplicate key will take precedence.\n                                  Cannot be updated.\n                                items:\n                                  description: EnvFromSource represents the source\n                                    of a set of ConfigMaps\n                                  properties:\n                                    configMapRef:\n                                      description: The ConfigMap to select from\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    prefix:\n                                      description: An optional identifier to prepend\n                                        to each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                      type: string\n                                    secretRef:\n                                      description: The Secret to select from\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                                type: array\n                              image:\n                                description: |-\n                                  Container image name.\n                                  More info: https://kubernetes.io/docs/concepts/containers/images\n                                  This field is optional to allow higher level config management to default or override\n                                  container images in workload controllers like Deployments and StatefulSets.\n                                type: string\n                              imagePullPolicy:\n                                description: |-\n                                  Image pull policy.\n                                  One of Always, Never, IfNotPresent.\n                                  Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                  Cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                                type: string\n                              lifecycle:\n                                description: |-\n                                  Actions that the management system should take in response to container lifecycle events.\n                                  Cannot be updated.\n                                properties:\n                                  postStart:\n                                    description: |-\n                                      PostStart is called immediately after a container is created. If the handler fails,\n                                      the container is terminated and restarted according to its restart policy.\n                                      Other management of the container blocks until the hook completes.\n                                      More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      sleep:\n                                        description: Sleep represents the duration\n                                          that the container should sleep before being\n                                          terminated.\n                                        properties:\n                                          seconds:\n                                            description: Seconds is the number of\n                                              seconds to sleep.\n                                            format: int64\n                                            type: integer\n                                        required:\n                                        - seconds\n                                        type: object\n                                      tcpSocket:\n                                        description: |-\n                                          Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                          for the backward compatibility. There are no validation of this field and\n                                          lifecycle hooks will fail in runtime when tcp handler is specified.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                    type: object\n                                  preStop:\n                                    description: |-\n                                      PreStop is called immediately before a container is terminated due to an\n                                      API request or management event such as liveness/startup probe failure,\n                                      preemption, resource contention, etc. The handler is not called if the\n                                      container crashes or exits. The Pod's termination grace period countdown begins before the\n                                      PreStop hook is executed. Regardless of the outcome of the handler, the\n                                      container will eventually terminate within the Pod's termination grace\n                                      period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                      or until the termination grace period is reached.\n                                      More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      sleep:\n                                        description: Sleep represents the duration\n                                          that the container should sleep before being\n                                          terminated.\n                                        properties:\n                                          seconds:\n                                            description: Seconds is the number of\n                                              seconds to sleep.\n                                            format: int64\n                                            type: integer\n                                        required:\n                                        - seconds\n                                        type: object\n                                      tcpSocket:\n                                        description: |-\n                                          Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                          for the backward compatibility. There are no validation of this field and\n                                          lifecycle hooks will fail in runtime when tcp handler is specified.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                    type: object\n                                type: object\n                              livenessProbe:\n                                description: |-\n                                  Periodic probe of container liveness.\n                                  Container will be restarted if the probe fails.\n                                  Cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                properties:\n                                  exec:\n                                    description: Exec specifies the action to take.\n                                    properties:\n                                      command:\n                                        description: |-\n                                          Command is the command line to execute inside the container, the working directory for the\n                                          command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                          not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                          a shell, you need to explicitly call out to that shell.\n                                          Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  failureThreshold:\n                                    description: |-\n                                      Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                      Defaults to 3. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  grpc:\n                                    description: GRPC specifies an action involving\n                                      a GRPC port.\n                                    properties:\n                                      port:\n                                        description: Port number of the gRPC service.\n                                          Number must be in the range 1 to 65535.\n                                        format: int32\n                                        type: integer\n                                      service:\n                                        description: |-\n                                          Service is the name of the service to place in the gRPC HealthCheckRequest\n                                          (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                          If this is not specified, the default behavior is defined by gRPC.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  httpGet:\n                                    description: HTTPGet specifies the http request\n                                      to perform.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          Host name to connect to, defaults to the pod IP. You probably want to set\n                                          \"Host\" in httpHeaders instead.\n                                        type: string\n                                      httpHeaders:\n                                        description: Custom headers to set in the\n                                          request. HTTP allows repeated headers.\n                                        items:\n                                          description: HTTPHeader describes a custom\n                                            header to be used in HTTP probes\n                                          properties:\n                                            name:\n                                              description: |-\n                                                The header field name.\n                                                This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                              type: string\n                                            value:\n                                              description: The header field value\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      path:\n                                        description: Path to access on the HTTP server.\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Name or number of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                      scheme:\n                                        description: |-\n                                          Scheme to use for connecting to the host.\n                                          Defaults to HTTP.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  initialDelaySeconds:\n                                    description: |-\n                                      Number of seconds after the container has started before liveness probes are initiated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                  periodSeconds:\n                                    description: |-\n                                      How often (in seconds) to perform the probe.\n                                      Default to 10 seconds. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  successThreshold:\n                                    description: |-\n                                      Minimum consecutive successes for the probe to be considered successful after having failed.\n                                      Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  tcpSocket:\n                                    description: TCPSocket specifies an action involving\n                                      a TCP port.\n                                    properties:\n                                      host:\n                                        description: 'Optional: Host name to connect\n                                          to, defaults to the pod IP.'\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Number or name of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                    required:\n                                    - port\n                                    type: object\n                                  terminationGracePeriodSeconds:\n                                    description: |-\n                                      Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                      The grace period is the duration in seconds after the processes running in the pod are sent\n                                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                      Set this value longer than the expected cleanup time for your process.\n                                      If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                      value overrides the value provided by the pod spec.\n                                      Value must be non-negative integer. The value zero indicates stop immediately via\n                                      the kill signal (no opportunity to shut down).\n                                      This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                      Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                    format: int64\n                                    type: integer\n                                  timeoutSeconds:\n                                    description: |-\n                                      Number of seconds after which the probe times out.\n                                      Defaults to 1 second. Minimum value is 1.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                type: object\n                              name:\n                                description: |-\n                                  Name of the container specified as a DNS_LABEL.\n                                  Each container in a pod must have a unique name (DNS_LABEL).\n                                  Cannot be updated.\n                                type: string\n                              ports:\n                                description: |-\n                                  List of ports to expose from the container. Not specifying a port here\n                                  DOES NOT prevent that port from being exposed. Any port which is\n                                  listening on the default \"0.0.0.0\" address inside a container will be\n                                  accessible from the network.\n                                  Modifying this array with strategic merge patch may corrupt the data.\n                                  For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                                  Cannot be updated.\n                                items:\n                                  description: ContainerPort represents a network\n                                    port in a single container.\n                                  properties:\n                                    containerPort:\n                                      description: |-\n                                        Number of port to expose on the pod's IP address.\n                                        This must be a valid port number, 0 < x < 65536.\n                                      format: int32\n                                      type: integer\n                                    hostIP:\n                                      description: What host IP to bind the external\n                                        port to.\n                                      type: string\n                                    hostPort:\n                                      description: |-\n                                        Number of port to expose on the host.\n                                        If specified, this must be a valid port number, 0 < x < 65536.\n                                        If HostNetwork is specified, this must match ContainerPort.\n                                        Most containers do not need this.\n                                      format: int32\n                                      type: integer\n                                    name:\n                                      description: |-\n                                        If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                        named port in a pod must have a unique name. Name for the port that can be\n                                        referred to by services.\n                                      type: string\n                                    protocol:\n                                      default: TCP\n                                      description: |-\n                                        Protocol for port. Must be UDP, TCP, or SCTP.\n                                        Defaults to \"TCP\".\n                                      type: string\n                                  required:\n                                  - containerPort\n                                  type: object\n                                type: array\n                                x-kubernetes-list-map-keys:\n                                - containerPort\n                                - protocol\n                                x-kubernetes-list-type: map\n                              readinessProbe:\n                                description: |-\n                                  Periodic probe of container service readiness.\n                                  Container will be removed from service endpoints if the probe fails.\n                                  Cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                properties:\n                                  exec:\n                                    description: Exec specifies the action to take.\n                                    properties:\n                                      command:\n                                        description: |-\n                                          Command is the command line to execute inside the container, the working directory for the\n                                          command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                          not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                          a shell, you need to explicitly call out to that shell.\n                                          Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  failureThreshold:\n                                    description: |-\n                                      Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                      Defaults to 3. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  grpc:\n                                    description: GRPC specifies an action involving\n                                      a GRPC port.\n                                    properties:\n                                      port:\n                                        description: Port number of the gRPC service.\n                                          Number must be in the range 1 to 65535.\n                                        format: int32\n                                        type: integer\n                                      service:\n                                        description: |-\n                                          Service is the name of the service to place in the gRPC HealthCheckRequest\n                                          (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                          If this is not specified, the default behavior is defined by gRPC.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  httpGet:\n                                    description: HTTPGet specifies the http request\n                                      to perform.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          Host name to connect to, defaults to the pod IP. You probably want to set\n                                          \"Host\" in httpHeaders instead.\n                                        type: string\n                                      httpHeaders:\n                                        description: Custom headers to set in the\n                                          request. HTTP allows repeated headers.\n                                        items:\n                                          description: HTTPHeader describes a custom\n                                            header to be used in HTTP probes\n                                          properties:\n                                            name:\n                                              description: |-\n                                                The header field name.\n                                                This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                              type: string\n                                            value:\n                                              description: The header field value\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      path:\n                                        description: Path to access on the HTTP server.\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Name or number of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                      scheme:\n                                        description: |-\n                                          Scheme to use for connecting to the host.\n                                          Defaults to HTTP.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  initialDelaySeconds:\n                                    description: |-\n                                      Number of seconds after the container has started before liveness probes are initiated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                  periodSeconds:\n                                    description: |-\n                                      How often (in seconds) to perform the probe.\n                                      Default to 10 seconds. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  successThreshold:\n                                    description: |-\n                                      Minimum consecutive successes for the probe to be considered successful after having failed.\n                                      Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  tcpSocket:\n                                    description: TCPSocket specifies an action involving\n                                      a TCP port.\n                                    properties:\n                                      host:\n                                        description: 'Optional: Host name to connect\n                                          to, defaults to the pod IP.'\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Number or name of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                    required:\n                                    - port\n                                    type: object\n                                  terminationGracePeriodSeconds:\n                                    description: |-\n                                      Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                      The grace period is the duration in seconds after the processes running in the pod are sent\n                                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                      Set this value longer than the expected cleanup time for your process.\n                                      If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                      value overrides the value provided by the pod spec.\n                                      Value must be non-negative integer. The value zero indicates stop immediately via\n                                      the kill signal (no opportunity to shut down).\n                                      This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                      Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                    format: int64\n                                    type: integer\n                                  timeoutSeconds:\n                                    description: |-\n                                      Number of seconds after which the probe times out.\n                                      Defaults to 1 second. Minimum value is 1.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                type: object\n                              resizePolicy:\n                                description: Resources resize policy for the container.\n                                items:\n                                  description: ContainerResizePolicy represents resource\n                                    resize policy for the container.\n                                  properties:\n                                    resourceName:\n                                      description: |-\n                                        Name of the resource to which this resource resize policy applies.\n                                        Supported values: cpu, memory.\n                                      type: string\n                                    restartPolicy:\n                                      description: |-\n                                        Restart policy to apply when specified resource is resized.\n                                        If not specified, it defaults to NotRequired.\n                                      type: string\n                                  required:\n                                  - resourceName\n                                  - restartPolicy\n                                  type: object\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              resources:\n                                description: |-\n                                  Compute Resources required by this container.\n                                  Cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                properties:\n                                  claims:\n                                    description: |-\n                                      Claims lists the names of resources, defined in spec.resourceClaims,\n                                      that are used by this container.\n\n\n                                      This is an alpha field and requires enabling the\n                                      DynamicResourceAllocation feature gate.\n\n\n                                      This field is immutable. It can only be set for containers.\n                                    items:\n                                      description: ResourceClaim references one entry\n                                        in PodSpec.ResourceClaims.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name must match the name of one entry in pod.spec.resourceClaims of\n                                            the Pod where this field is used. It makes that resource available\n                                            inside a container.\n                                          type: string\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - name\n                                    x-kubernetes-list-type: map\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                              restartPolicy:\n                                description: |-\n                                  RestartPolicy defines the restart behavior of individual containers in a pod.\n                                  This field may only be set for init containers, and the only allowed value is \"Always\".\n                                  For non-init containers or when this field is not specified,\n                                  the restart behavior is defined by the Pod's restart policy and the container type.\n                                  Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                                  this init container will be continually restarted on\n                                  exit until all regular containers have terminated. Once all regular\n                                  containers have completed, all init containers with restartPolicy \"Always\"\n                                  will be shut down. This lifecycle differs from normal init containers and\n                                  is often referred to as a \"sidecar\" container. Although this init\n                                  container still starts in the init container sequence, it does not wait\n                                  for the container to complete before proceeding to the next init\n                                  container. Instead, the next init container starts immediately after this\n                                  init container is started, or after any startupProbe has successfully\n                                  completed.\n                                type: string\n                              securityContext:\n                                description: |-\n                                  SecurityContext defines the security options the container should be run with.\n                                  If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                  More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                                properties:\n                                  allowPrivilegeEscalation:\n                                    description: |-\n                                      AllowPrivilegeEscalation controls whether a process can gain more\n                                      privileges than its parent process. This bool directly controls if\n                                      the no_new_privs flag will be set on the container process.\n                                      AllowPrivilegeEscalation is true always when the container is:\n                                      1) run as Privileged\n                                      2) has CAP_SYS_ADMIN\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: boolean\n                                  capabilities:\n                                    description: |-\n                                      The capabilities to add/drop when running containers.\n                                      Defaults to the default set of capabilities granted by the container runtime.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    properties:\n                                      add:\n                                        description: Added capabilities\n                                        items:\n                                          description: Capability represent POSIX\n                                            capabilities type\n                                          type: string\n                                        type: array\n                                      drop:\n                                        description: Removed capabilities\n                                        items:\n                                          description: Capability represent POSIX\n                                            capabilities type\n                                          type: string\n                                        type: array\n                                    type: object\n                                  privileged:\n                                    description: |-\n                                      Run container in privileged mode.\n                                      Processes in privileged containers are essentially equivalent to root on the host.\n                                      Defaults to false.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: boolean\n                                  procMount:\n                                    description: |-\n                                      procMount denotes the type of proc mount to use for the containers.\n                                      The default is DefaultProcMount which uses the container runtime defaults for\n                                      readonly paths and masked paths.\n                                      This requires the ProcMountType feature flag to be enabled.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: string\n                                  readOnlyRootFilesystem:\n                                    description: |-\n                                      Whether this container has a read-only root filesystem.\n                                      Default is false.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: boolean\n                                  runAsGroup:\n                                    description: |-\n                                      The GID to run the entrypoint of the container process.\n                                      Uses runtime default if unset.\n                                      May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    format: int64\n                                    type: integer\n                                  runAsNonRoot:\n                                    description: |-\n                                      Indicates that the container must run as a non-root user.\n                                      If true, the Kubelet will validate the image at runtime to ensure that it\n                                      does not run as UID 0 (root) and fail to start the container if it does.\n                                      If unset or false, no such validation will be performed.\n                                      May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    type: boolean\n                                  runAsUser:\n                                    description: |-\n                                      The UID to run the entrypoint of the container process.\n                                      Defaults to user specified in image metadata if unspecified.\n                                      May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    format: int64\n                                    type: integer\n                                  seLinuxOptions:\n                                    description: |-\n                                      The SELinux context to be applied to the container.\n                                      If unspecified, the container runtime will allocate a random SELinux context for each\n                                      container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    properties:\n                                      level:\n                                        description: Level is SELinux level label\n                                          that applies to the container.\n                                        type: string\n                                      role:\n                                        description: Role is a SELinux role label\n                                          that applies to the container.\n                                        type: string\n                                      type:\n                                        description: Type is a SELinux type label\n                                          that applies to the container.\n                                        type: string\n                                      user:\n                                        description: User is a SELinux user label\n                                          that applies to the container.\n                                        type: string\n                                    type: object\n                                  seccompProfile:\n                                    description: |-\n                                      The seccomp options to use by this container. If seccomp options are\n                                      provided at both the pod & container level, the container options\n                                      override the pod options.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    properties:\n                                      localhostProfile:\n                                        description: |-\n                                          localhostProfile indicates a profile defined in a file on the node should be used.\n                                          The profile must be preconfigured on the node to work.\n                                          Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                          Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                        type: string\n                                      type:\n                                        description: |-\n                                          type indicates which kind of seccomp profile will be applied.\n                                          Valid options are:\n\n\n                                          Localhost - a profile defined in a file on the node should be used.\n                                          RuntimeDefault - the container runtime default profile should be used.\n                                          Unconfined - no profile should be applied.\n                                        type: string\n                                    required:\n                                    - type\n                                    type: object\n                                  windowsOptions:\n                                    description: |-\n                                      The Windows specific settings applied to all containers.\n                                      If unspecified, the options from the PodSecurityContext will be used.\n                                      If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is linux.\n                                    properties:\n                                      gmsaCredentialSpec:\n                                        description: |-\n                                          GMSACredentialSpec is where the GMSA admission webhook\n                                          (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                          GMSA credential spec named by the GMSACredentialSpecName field.\n                                        type: string\n                                      gmsaCredentialSpecName:\n                                        description: GMSACredentialSpecName is the\n                                          name of the GMSA credential spec to use.\n                                        type: string\n                                      hostProcess:\n                                        description: |-\n                                          HostProcess determines if a container should be run as a 'Host Process' container.\n                                          All of a Pod's containers must have the same effective HostProcess value\n                                          (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                          In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                        type: boolean\n                                      runAsUserName:\n                                        description: |-\n                                          The UserName in Windows to run the entrypoint of the container process.\n                                          Defaults to the user specified in image metadata if unspecified.\n                                          May also be set in PodSecurityContext. If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                        type: string\n                                    type: object\n                                type: object\n                              startupProbe:\n                                description: |-\n                                  StartupProbe indicates that the Pod has successfully initialized.\n                                  If specified, no other probes are executed until this completes successfully.\n                                  If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                                  This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                                  when it might take a long time to load data or warm a cache, than during steady-state operation.\n                                  This cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                properties:\n                                  exec:\n                                    description: Exec specifies the action to take.\n                                    properties:\n                                      command:\n                                        description: |-\n                                          Command is the command line to execute inside the container, the working directory for the\n                                          command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                          not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                          a shell, you need to explicitly call out to that shell.\n                                          Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  failureThreshold:\n                                    description: |-\n                                      Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                      Defaults to 3. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  grpc:\n                                    description: GRPC specifies an action involving\n                                      a GRPC port.\n                                    properties:\n                                      port:\n                                        description: Port number of the gRPC service.\n                                          Number must be in the range 1 to 65535.\n                                        format: int32\n                                        type: integer\n                                      service:\n                                        description: |-\n                                          Service is the name of the service to place in the gRPC HealthCheckRequest\n                                          (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                          If this is not specified, the default behavior is defined by gRPC.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  httpGet:\n                                    description: HTTPGet specifies the http request\n                                      to perform.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          Host name to connect to, defaults to the pod IP. You probably want to set\n                                          \"Host\" in httpHeaders instead.\n                                        type: string\n                                      httpHeaders:\n                                        description: Custom headers to set in the\n                                          request. HTTP allows repeated headers.\n                                        items:\n                                          description: HTTPHeader describes a custom\n                                            header to be used in HTTP probes\n                                          properties:\n                                            name:\n                                              description: |-\n                                                The header field name.\n                                                This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                              type: string\n                                            value:\n                                              description: The header field value\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      path:\n                                        description: Path to access on the HTTP server.\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Name or number of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                      scheme:\n                                        description: |-\n                                          Scheme to use for connecting to the host.\n                                          Defaults to HTTP.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  initialDelaySeconds:\n                                    description: |-\n                                      Number of seconds after the container has started before liveness probes are initiated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                  periodSeconds:\n                                    description: |-\n                                      How often (in seconds) to perform the probe.\n                                      Default to 10 seconds. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  successThreshold:\n                                    description: |-\n                                      Minimum consecutive successes for the probe to be considered successful after having failed.\n                                      Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  tcpSocket:\n                                    description: TCPSocket specifies an action involving\n                                      a TCP port.\n                                    properties:\n                                      host:\n                                        description: 'Optional: Host name to connect\n                                          to, defaults to the pod IP.'\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Number or name of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                    required:\n                                    - port\n                                    type: object\n                                  terminationGracePeriodSeconds:\n                                    description: |-\n                                      Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                      The grace period is the duration in seconds after the processes running in the pod are sent\n                                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                      Set this value longer than the expected cleanup time for your process.\n                                      If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                      value overrides the value provided by the pod spec.\n                                      Value must be non-negative integer. The value zero indicates stop immediately via\n                                      the kill signal (no opportunity to shut down).\n                                      This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                      Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                    format: int64\n                                    type: integer\n                                  timeoutSeconds:\n                                    description: |-\n                                      Number of seconds after which the probe times out.\n                                      Defaults to 1 second. Minimum value is 1.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                type: object\n                              stdin:\n                                description: |-\n                                  Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                  is not set, reads from stdin in the container will always result in EOF.\n                                  Default is false.\n                                type: boolean\n                              stdinOnce:\n                                description: |-\n                                  Whether the container runtime should close the stdin channel after it has been opened by\n                                  a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                  sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                  first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                  at which time stdin is closed and remains closed until the container is restarted. If this\n                                  flag is false, a container processes that reads from stdin will never receive an EOF.\n                                  Default is false\n                                type: boolean\n                              terminationMessagePath:\n                                description: |-\n                                  Optional: Path at which the file to which the container's termination message\n                                  will be written is mounted into the container's filesystem.\n                                  Message written is intended to be brief final status, such as an assertion failure message.\n                                  Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                  all containers will be limited to 12kb.\n                                  Defaults to /dev/termination-log.\n                                  Cannot be updated.\n                                type: string\n                              terminationMessagePolicy:\n                                description: |-\n                                  Indicate how the termination message should be populated. File will use the contents of\n                                  terminationMessagePath to populate the container status message on both success and failure.\n                                  FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                  message file is empty and the container exited with an error.\n                                  The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                  Defaults to File.\n                                  Cannot be updated.\n                                type: string\n                              tty:\n                                description: |-\n                                  Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                  Default is false.\n                                type: boolean\n                              volumeDevices:\n                                description: volumeDevices is the list of block devices\n                                  to be used by the container.\n                                items:\n                                  description: volumeDevice describes a mapping of\n                                    a raw block device within a container.\n                                  properties:\n                                    devicePath:\n                                      description: devicePath is the path inside of\n                                        the container that the device will be mapped\n                                        to.\n                                      type: string\n                                    name:\n                                      description: name must match the name of a persistentVolumeClaim\n                                        in the pod\n                                      type: string\n                                  required:\n                                  - devicePath\n                                  - name\n                                  type: object\n                                type: array\n                              volumeMounts:\n                                description: |-\n                                  Pod volumes to mount into the container's filesystem.\n                                  Cannot be updated.\n                                items:\n                                  description: VolumeMount describes a mounting of\n                                    a Volume within a container.\n                                  properties:\n                                    mountPath:\n                                      description: |-\n                                        Path within the container at which the volume should be mounted.  Must\n                                        not contain ':'.\n                                      type: string\n                                    mountPropagation:\n                                      description: |-\n                                        mountPropagation determines how mounts are propagated from the host\n                                        to container and the other way around.\n                                        When not set, MountPropagationNone is used.\n                                        This field is beta in 1.10.\n                                      type: string\n                                    name:\n                                      description: This must match the Name of a Volume.\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        Mounted read-only if true, read-write otherwise (false or unspecified).\n                                        Defaults to false.\n                                      type: boolean\n                                    subPath:\n                                      description: |-\n                                        Path within the volume from which the container's volume should be mounted.\n                                        Defaults to \"\" (volume's root).\n                                      type: string\n                                    subPathExpr:\n                                      description: |-\n                                        Expanded path within the volume from which the container's volume should be mounted.\n                                        Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                        Defaults to \"\" (volume's root).\n                                        SubPathExpr and SubPath are mutually exclusive.\n                                      type: string\n                                  required:\n                                  - mountPath\n                                  - name\n                                  type: object\n                                type: array\n                              workingDir:\n                                description: |-\n                                  Container's working directory.\n                                  If not specified, the container runtime's default will be used, which\n                                  might be configured in the container image.\n                                  Cannot be updated.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        dnsConfig:\n                          description: |-\n                            Specifies the DNS parameters of a pod.\n                            Parameters specified here will be merged to the generated DNS\n                            configuration based on DNSPolicy.\n                          properties:\n                            nameservers:\n                              description: |-\n                                A list of DNS name server IP addresses.\n                                This will be appended to the base nameservers generated from DNSPolicy.\n                                Duplicated nameservers will be removed.\n                              items:\n                                type: string\n                              type: array\n                            options:\n                              description: |-\n                                A list of DNS resolver options.\n                                This will be merged with the base options generated from DNSPolicy.\n                                Duplicated entries will be removed. Resolution options given in Options\n                                will override those that appear in the base DNSPolicy.\n                              items:\n                                description: PodDNSConfigOption defines DNS resolver\n                                  options of a pod.\n                                properties:\n                                  name:\n                                    description: Required.\n                                    type: string\n                                  value:\n                                    type: string\n                                type: object\n                              type: array\n                            searches:\n                              description: |-\n                                A list of DNS search domains for host-name lookup.\n                                This will be appended to the base search paths generated from DNSPolicy.\n                                Duplicated search paths will be removed.\n                              items:\n                                type: string\n                              type: array\n                          type: object\n                        dnsPolicy:\n                          description: |-\n                            Set DNS policy for the pod.\n                            Defaults to \"ClusterFirst\".\n                            Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.\n                            DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy.\n                            To have DNS options set along with hostNetwork, you have to specify DNS policy\n                            explicitly to 'ClusterFirstWithHostNet'.\n                          type: string\n                        enableServiceLinks:\n                          description: |-\n                            EnableServiceLinks indicates whether information about services should be injected into pod's\n                            environment variables, matching the syntax of Docker links.\n                            Optional: Defaults to true.\n                          type: boolean\n                        ephemeralContainers:\n                          description: |-\n                            List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing\n                            pod to perform user-initiated actions such as debugging. This list cannot be specified when\n                            creating a pod, and it cannot be modified by updating the pod spec. In order to add an\n                            ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.\n                          items:\n                            description: |-\n                              An EphemeralContainer is a temporary container that you may add to an existing Pod for\n                              user-initiated activities such as debugging. Ephemeral containers have no resource or\n                              scheduling guarantees, and they will not be restarted when they exit or when a Pod is\n                              removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the\n                              Pod to exceed its resource allocation.\n\n\n                              To add an ephemeral container, use the ephemeralcontainers subresource of an existing\n                              Pod. Ephemeral containers may not be removed or restarted.\n                            properties:\n                              args:\n                                description: |-\n                                  Arguments to the entrypoint.\n                                  The image's CMD is used if this is not provided.\n                                  Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                  cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                  produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                  of whether the variable exists or not. Cannot be updated.\n                                  More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Entrypoint array. Not executed within a shell.\n                                  The image's ENTRYPOINT is used if this is not provided.\n                                  Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                  cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                  produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                  of whether the variable exists or not. Cannot be updated.\n                                  More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                items:\n                                  type: string\n                                type: array\n                              env:\n                                description: |-\n                                  List of environment variables to set in the container.\n                                  Cannot be updated.\n                                items:\n                                  description: EnvVar represents an environment variable\n                                    present in a Container.\n                                  properties:\n                                    name:\n                                      description: Name of the environment variable.\n                                        Must be a C_IDENTIFIER.\n                                      type: string\n                                    value:\n                                      description: |-\n                                        Variable references $(VAR_NAME) are expanded\n                                        using the previously defined environment variables in the container and\n                                        any service environment variables. If a variable cannot be resolved,\n                                        the reference in the input string will be unchanged. Double $$ are reduced\n                                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                        Escaped references will never be expanded, regardless of whether the variable\n                                        exists or not.\n                                        Defaults to \"\".\n                                      type: string\n                                    valueFrom:\n                                      description: Source for the environment variable's\n                                        value. Cannot be used if value is not empty.\n                                      properties:\n                                        configMapKeyRef:\n                                          description: Selects a key of a ConfigMap.\n                                          properties:\n                                            key:\n                                              description: The key to select.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        fieldRef:\n                                          description: |-\n                                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        secretKeyRef:\n                                          description: Selects a key of a secret in\n                                            the pod's namespace\n                                          properties:\n                                            key:\n                                              description: The key of the secret to\n                                                select from.  Must be a valid secret\n                                                key.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                              envFrom:\n                                description: |-\n                                  List of sources to populate environment variables in the container.\n                                  The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                  will be reported as an event when the container is starting. When a key exists in multiple\n                                  sources, the value associated with the last source will take precedence.\n                                  Values defined by an Env with a duplicate key will take precedence.\n                                  Cannot be updated.\n                                items:\n                                  description: EnvFromSource represents the source\n                                    of a set of ConfigMaps\n                                  properties:\n                                    configMapRef:\n                                      description: The ConfigMap to select from\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    prefix:\n                                      description: An optional identifier to prepend\n                                        to each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                      type: string\n                                    secretRef:\n                                      description: The Secret to select from\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                                type: array\n                              image:\n                                description: |-\n                                  Container image name.\n                                  More info: https://kubernetes.io/docs/concepts/containers/images\n                                type: string\n                              imagePullPolicy:\n                                description: |-\n                                  Image pull policy.\n                                  One of Always, Never, IfNotPresent.\n                                  Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                  Cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                                type: string\n                              lifecycle:\n                                description: Lifecycle is not allowed for ephemeral\n                                  containers.\n                                properties:\n                                  postStart:\n                                    description: |-\n                                      PostStart is called immediately after a container is created. If the handler fails,\n                                      the container is terminated and restarted according to its restart policy.\n                                      Other management of the container blocks until the hook completes.\n                                      More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      sleep:\n                                        description: Sleep represents the duration\n                                          that the container should sleep before being\n                                          terminated.\n                                        properties:\n                                          seconds:\n                                            description: Seconds is the number of\n                                              seconds to sleep.\n                                            format: int64\n                                            type: integer\n                                        required:\n                                        - seconds\n                                        type: object\n                                      tcpSocket:\n                                        description: |-\n                                          Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                          for the backward compatibility. There are no validation of this field and\n                                          lifecycle hooks will fail in runtime when tcp handler is specified.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                    type: object\n                                  preStop:\n                                    description: |-\n                                      PreStop is called immediately before a container is terminated due to an\n                                      API request or management event such as liveness/startup probe failure,\n                                      preemption, resource contention, etc. The handler is not called if the\n                                      container crashes or exits. The Pod's termination grace period countdown begins before the\n                                      PreStop hook is executed. Regardless of the outcome of the handler, the\n                                      container will eventually terminate within the Pod's termination grace\n                                      period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                      or until the termination grace period is reached.\n                                      More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      sleep:\n                                        description: Sleep represents the duration\n                                          that the container should sleep before being\n                                          terminated.\n                                        properties:\n                                          seconds:\n                                            description: Seconds is the number of\n                                              seconds to sleep.\n                                            format: int64\n                                            type: integer\n                                        required:\n                                        - seconds\n                                        type: object\n                                      tcpSocket:\n                                        description: |-\n                                          Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                          for the backward compatibility. There are no validation of this field and\n                                          lifecycle hooks will fail in runtime when tcp handler is specified.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                    type: object\n                                type: object\n                              livenessProbe:\n                                description: Probes are not allowed for ephemeral\n                                  containers.\n                                properties:\n                                  exec:\n                                    description: Exec specifies the action to take.\n                                    properties:\n                                      command:\n                                        description: |-\n                                          Command is the command line to execute inside the container, the working directory for the\n                                          command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                          not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                          a shell, you need to explicitly call out to that shell.\n                                          Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  failureThreshold:\n                                    description: |-\n                                      Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                      Defaults to 3. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  grpc:\n                                    description: GRPC specifies an action involving\n                                      a GRPC port.\n                                    properties:\n                                      port:\n                                        description: Port number of the gRPC service.\n                                          Number must be in the range 1 to 65535.\n                                        format: int32\n                                        type: integer\n                                      service:\n                                        description: |-\n                                          Service is the name of the service to place in the gRPC HealthCheckRequest\n                                          (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                          If this is not specified, the default behavior is defined by gRPC.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  httpGet:\n                                    description: HTTPGet specifies the http request\n                                      to perform.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          Host name to connect to, defaults to the pod IP. You probably want to set\n                                          \"Host\" in httpHeaders instead.\n                                        type: string\n                                      httpHeaders:\n                                        description: Custom headers to set in the\n                                          request. HTTP allows repeated headers.\n                                        items:\n                                          description: HTTPHeader describes a custom\n                                            header to be used in HTTP probes\n                                          properties:\n                                            name:\n                                              description: |-\n                                                The header field name.\n                                                This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                              type: string\n                                            value:\n                                              description: The header field value\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      path:\n                                        description: Path to access on the HTTP server.\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Name or number of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                      scheme:\n                                        description: |-\n                                          Scheme to use for connecting to the host.\n                                          Defaults to HTTP.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  initialDelaySeconds:\n                                    description: |-\n                                      Number of seconds after the container has started before liveness probes are initiated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                  periodSeconds:\n                                    description: |-\n                                      How often (in seconds) to perform the probe.\n                                      Default to 10 seconds. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  successThreshold:\n                                    description: |-\n                                      Minimum consecutive successes for the probe to be considered successful after having failed.\n                                      Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  tcpSocket:\n                                    description: TCPSocket specifies an action involving\n                                      a TCP port.\n                                    properties:\n                                      host:\n                                        description: 'Optional: Host name to connect\n                                          to, defaults to the pod IP.'\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Number or name of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                    required:\n                                    - port\n                                    type: object\n                                  terminationGracePeriodSeconds:\n                                    description: |-\n                                      Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                      The grace period is the duration in seconds after the processes running in the pod are sent\n                                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                      Set this value longer than the expected cleanup time for your process.\n                                      If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                      value overrides the value provided by the pod spec.\n                                      Value must be non-negative integer. The value zero indicates stop immediately via\n                                      the kill signal (no opportunity to shut down).\n                                      This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                      Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                    format: int64\n                                    type: integer\n                                  timeoutSeconds:\n                                    description: |-\n                                      Number of seconds after which the probe times out.\n                                      Defaults to 1 second. Minimum value is 1.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                type: object\n                              name:\n                                description: |-\n                                  Name of the ephemeral container specified as a DNS_LABEL.\n                                  This name must be unique among all containers, init containers and ephemeral containers.\n                                type: string\n                              ports:\n                                description: Ports are not allowed for ephemeral containers.\n                                items:\n                                  description: ContainerPort represents a network\n                                    port in a single container.\n                                  properties:\n                                    containerPort:\n                                      description: |-\n                                        Number of port to expose on the pod's IP address.\n                                        This must be a valid port number, 0 < x < 65536.\n                                      format: int32\n                                      type: integer\n                                    hostIP:\n                                      description: What host IP to bind the external\n                                        port to.\n                                      type: string\n                                    hostPort:\n                                      description: |-\n                                        Number of port to expose on the host.\n                                        If specified, this must be a valid port number, 0 < x < 65536.\n                                        If HostNetwork is specified, this must match ContainerPort.\n                                        Most containers do not need this.\n                                      format: int32\n                                      type: integer\n                                    name:\n                                      description: |-\n                                        If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                        named port in a pod must have a unique name. Name for the port that can be\n                                        referred to by services.\n                                      type: string\n                                    protocol:\n                                      default: TCP\n                                      description: |-\n                                        Protocol for port. Must be UDP, TCP, or SCTP.\n                                        Defaults to \"TCP\".\n                                      type: string\n                                  required:\n                                  - containerPort\n                                  type: object\n                                type: array\n                                x-kubernetes-list-map-keys:\n                                - containerPort\n                                - protocol\n                                x-kubernetes-list-type: map\n                              readinessProbe:\n                                description: Probes are not allowed for ephemeral\n                                  containers.\n                                properties:\n                                  exec:\n                                    description: Exec specifies the action to take.\n                                    properties:\n                                      command:\n                                        description: |-\n                                          Command is the command line to execute inside the container, the working directory for the\n                                          command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                          not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                          a shell, you need to explicitly call out to that shell.\n                                          Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  failureThreshold:\n                                    description: |-\n                                      Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                      Defaults to 3. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  grpc:\n                                    description: GRPC specifies an action involving\n                                      a GRPC port.\n                                    properties:\n                                      port:\n                                        description: Port number of the gRPC service.\n                                          Number must be in the range 1 to 65535.\n                                        format: int32\n                                        type: integer\n                                      service:\n                                        description: |-\n                                          Service is the name of the service to place in the gRPC HealthCheckRequest\n                                          (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                          If this is not specified, the default behavior is defined by gRPC.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  httpGet:\n                                    description: HTTPGet specifies the http request\n                                      to perform.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          Host name to connect to, defaults to the pod IP. You probably want to set\n                                          \"Host\" in httpHeaders instead.\n                                        type: string\n                                      httpHeaders:\n                                        description: Custom headers to set in the\n                                          request. HTTP allows repeated headers.\n                                        items:\n                                          description: HTTPHeader describes a custom\n                                            header to be used in HTTP probes\n                                          properties:\n                                            name:\n                                              description: |-\n                                                The header field name.\n                                                This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                              type: string\n                                            value:\n                                              description: The header field value\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      path:\n                                        description: Path to access on the HTTP server.\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Name or number of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                      scheme:\n                                        description: |-\n                                          Scheme to use for connecting to the host.\n                                          Defaults to HTTP.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  initialDelaySeconds:\n                                    description: |-\n                                      Number of seconds after the container has started before liveness probes are initiated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                  periodSeconds:\n                                    description: |-\n                                      How often (in seconds) to perform the probe.\n                                      Default to 10 seconds. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  successThreshold:\n                                    description: |-\n                                      Minimum consecutive successes for the probe to be considered successful after having failed.\n                                      Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  tcpSocket:\n                                    description: TCPSocket specifies an action involving\n                                      a TCP port.\n                                    properties:\n                                      host:\n                                        description: 'Optional: Host name to connect\n                                          to, defaults to the pod IP.'\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Number or name of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                    required:\n                                    - port\n                                    type: object\n                                  terminationGracePeriodSeconds:\n                                    description: |-\n                                      Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                      The grace period is the duration in seconds after the processes running in the pod are sent\n                                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                      Set this value longer than the expected cleanup time for your process.\n                                      If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                      value overrides the value provided by the pod spec.\n                                      Value must be non-negative integer. The value zero indicates stop immediately via\n                                      the kill signal (no opportunity to shut down).\n                                      This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                      Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                    format: int64\n                                    type: integer\n                                  timeoutSeconds:\n                                    description: |-\n                                      Number of seconds after which the probe times out.\n                                      Defaults to 1 second. Minimum value is 1.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                type: object\n                              resizePolicy:\n                                description: Resources resize policy for the container.\n                                items:\n                                  description: ContainerResizePolicy represents resource\n                                    resize policy for the container.\n                                  properties:\n                                    resourceName:\n                                      description: |-\n                                        Name of the resource to which this resource resize policy applies.\n                                        Supported values: cpu, memory.\n                                      type: string\n                                    restartPolicy:\n                                      description: |-\n                                        Restart policy to apply when specified resource is resized.\n                                        If not specified, it defaults to NotRequired.\n                                      type: string\n                                  required:\n                                  - resourceName\n                                  - restartPolicy\n                                  type: object\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              resources:\n                                description: |-\n                                  Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources\n                                  already allocated to the pod.\n                                properties:\n                                  claims:\n                                    description: |-\n                                      Claims lists the names of resources, defined in spec.resourceClaims,\n                                      that are used by this container.\n\n\n                                      This is an alpha field and requires enabling the\n                                      DynamicResourceAllocation feature gate.\n\n\n                                      This field is immutable. It can only be set for containers.\n                                    items:\n                                      description: ResourceClaim references one entry\n                                        in PodSpec.ResourceClaims.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name must match the name of one entry in pod.spec.resourceClaims of\n                                            the Pod where this field is used. It makes that resource available\n                                            inside a container.\n                                          type: string\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - name\n                                    x-kubernetes-list-type: map\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                              restartPolicy:\n                                description: |-\n                                  Restart policy for the container to manage the restart behavior of each\n                                  container within a pod.\n                                  This may only be set for init containers. You cannot set this field on\n                                  ephemeral containers.\n                                type: string\n                              securityContext:\n                                description: |-\n                                  Optional: SecurityContext defines the security options the ephemeral container should be run with.\n                                  If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                properties:\n                                  allowPrivilegeEscalation:\n                                    description: |-\n                                      AllowPrivilegeEscalation controls whether a process can gain more\n                                      privileges than its parent process. This bool directly controls if\n                                      the no_new_privs flag will be set on the container process.\n                                      AllowPrivilegeEscalation is true always when the container is:\n                                      1) run as Privileged\n                                      2) has CAP_SYS_ADMIN\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: boolean\n                                  capabilities:\n                                    description: |-\n                                      The capabilities to add/drop when running containers.\n                                      Defaults to the default set of capabilities granted by the container runtime.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    properties:\n                                      add:\n                                        description: Added capabilities\n                                        items:\n                                          description: Capability represent POSIX\n                                            capabilities type\n                                          type: string\n                                        type: array\n                                      drop:\n                                        description: Removed capabilities\n                                        items:\n                                          description: Capability represent POSIX\n                                            capabilities type\n                                          type: string\n                                        type: array\n                                    type: object\n                                  privileged:\n                                    description: |-\n                                      Run container in privileged mode.\n                                      Processes in privileged containers are essentially equivalent to root on the host.\n                                      Defaults to false.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: boolean\n                                  procMount:\n                                    description: |-\n                                      procMount denotes the type of proc mount to use for the containers.\n                                      The default is DefaultProcMount which uses the container runtime defaults for\n                                      readonly paths and masked paths.\n                                      This requires the ProcMountType feature flag to be enabled.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: string\n                                  readOnlyRootFilesystem:\n                                    description: |-\n                                      Whether this container has a read-only root filesystem.\n                                      Default is false.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: boolean\n                                  runAsGroup:\n                                    description: |-\n                                      The GID to run the entrypoint of the container process.\n                                      Uses runtime default if unset.\n                                      May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    format: int64\n                                    type: integer\n                                  runAsNonRoot:\n                                    description: |-\n                                      Indicates that the container must run as a non-root user.\n                                      If true, the Kubelet will validate the image at runtime to ensure that it\n                                      does not run as UID 0 (root) and fail to start the container if it does.\n                                      If unset or false, no such validation will be performed.\n                                      May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    type: boolean\n                                  runAsUser:\n                                    description: |-\n                                      The UID to run the entrypoint of the container process.\n                                      Defaults to user specified in image metadata if unspecified.\n                                      May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    format: int64\n                                    type: integer\n                                  seLinuxOptions:\n                                    description: |-\n                                      The SELinux context to be applied to the container.\n                                      If unspecified, the container runtime will allocate a random SELinux context for each\n                                      container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    properties:\n                                      level:\n                                        description: Level is SELinux level label\n                                          that applies to the container.\n                                        type: string\n                                      role:\n                                        description: Role is a SELinux role label\n                                          that applies to the container.\n                                        type: string\n                                      type:\n                                        description: Type is a SELinux type label\n                                          that applies to the container.\n                                        type: string\n                                      user:\n                                        description: User is a SELinux user label\n                                          that applies to the container.\n                                        type: string\n                                    type: object\n                                  seccompProfile:\n                                    description: |-\n                                      The seccomp options to use by this container. If seccomp options are\n                                      provided at both the pod & container level, the container options\n                                      override the pod options.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    properties:\n                                      localhostProfile:\n                                        description: |-\n                                          localhostProfile indicates a profile defined in a file on the node should be used.\n                                          The profile must be preconfigured on the node to work.\n                                          Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                          Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                        type: string\n                                      type:\n                                        description: |-\n                                          type indicates which kind of seccomp profile will be applied.\n                                          Valid options are:\n\n\n                                          Localhost - a profile defined in a file on the node should be used.\n                                          RuntimeDefault - the container runtime default profile should be used.\n                                          Unconfined - no profile should be applied.\n                                        type: string\n                                    required:\n                                    - type\n                                    type: object\n                                  windowsOptions:\n                                    description: |-\n                                      The Windows specific settings applied to all containers.\n                                      If unspecified, the options from the PodSecurityContext will be used.\n                                      If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is linux.\n                                    properties:\n                                      gmsaCredentialSpec:\n                                        description: |-\n                                          GMSACredentialSpec is where the GMSA admission webhook\n                                          (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                          GMSA credential spec named by the GMSACredentialSpecName field.\n                                        type: string\n                                      gmsaCredentialSpecName:\n                                        description: GMSACredentialSpecName is the\n                                          name of the GMSA credential spec to use.\n                                        type: string\n                                      hostProcess:\n                                        description: |-\n                                          HostProcess determines if a container should be run as a 'Host Process' container.\n                                          All of a Pod's containers must have the same effective HostProcess value\n                                          (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                          In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                        type: boolean\n                                      runAsUserName:\n                                        description: |-\n                                          The UserName in Windows to run the entrypoint of the container process.\n                                          Defaults to the user specified in image metadata if unspecified.\n                                          May also be set in PodSecurityContext. If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                        type: string\n                                    type: object\n                                type: object\n                              startupProbe:\n                                description: Probes are not allowed for ephemeral\n                                  containers.\n                                properties:\n                                  exec:\n                                    description: Exec specifies the action to take.\n                                    properties:\n                                      command:\n                                        description: |-\n                                          Command is the command line to execute inside the container, the working directory for the\n                                          command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                          not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                          a shell, you need to explicitly call out to that shell.\n                                          Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  failureThreshold:\n                                    description: |-\n                                      Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                      Defaults to 3. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  grpc:\n                                    description: GRPC specifies an action involving\n                                      a GRPC port.\n                                    properties:\n                                      port:\n                                        description: Port number of the gRPC service.\n                                          Number must be in the range 1 to 65535.\n                                        format: int32\n                                        type: integer\n                                      service:\n                                        description: |-\n                                          Service is the name of the service to place in the gRPC HealthCheckRequest\n                                          (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                          If this is not specified, the default behavior is defined by gRPC.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  httpGet:\n                                    description: HTTPGet specifies the http request\n                                      to perform.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          Host name to connect to, defaults to the pod IP. You probably want to set\n                                          \"Host\" in httpHeaders instead.\n                                        type: string\n                                      httpHeaders:\n                                        description: Custom headers to set in the\n                                          request. HTTP allows repeated headers.\n                                        items:\n                                          description: HTTPHeader describes a custom\n                                            header to be used in HTTP probes\n                                          properties:\n                                            name:\n                                              description: |-\n                                                The header field name.\n                                                This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                              type: string\n                                            value:\n                                              description: The header field value\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      path:\n                                        description: Path to access on the HTTP server.\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Name or number of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                      scheme:\n                                        description: |-\n                                          Scheme to use for connecting to the host.\n                                          Defaults to HTTP.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  initialDelaySeconds:\n                                    description: |-\n                                      Number of seconds after the container has started before liveness probes are initiated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                  periodSeconds:\n                                    description: |-\n                                      How often (in seconds) to perform the probe.\n                                      Default to 10 seconds. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  successThreshold:\n                                    description: |-\n                                      Minimum consecutive successes for the probe to be considered successful after having failed.\n                                      Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  tcpSocket:\n                                    description: TCPSocket specifies an action involving\n                                      a TCP port.\n                                    properties:\n                                      host:\n                                        description: 'Optional: Host name to connect\n                                          to, defaults to the pod IP.'\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Number or name of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                    required:\n                                    - port\n                                    type: object\n                                  terminationGracePeriodSeconds:\n                                    description: |-\n                                      Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                      The grace period is the duration in seconds after the processes running in the pod are sent\n                                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                      Set this value longer than the expected cleanup time for your process.\n                                      If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                      value overrides the value provided by the pod spec.\n                                      Value must be non-negative integer. The value zero indicates stop immediately via\n                                      the kill signal (no opportunity to shut down).\n                                      This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                      Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                    format: int64\n                                    type: integer\n                                  timeoutSeconds:\n                                    description: |-\n                                      Number of seconds after which the probe times out.\n                                      Defaults to 1 second. Minimum value is 1.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                type: object\n                              stdin:\n                                description: |-\n                                  Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                  is not set, reads from stdin in the container will always result in EOF.\n                                  Default is false.\n                                type: boolean\n                              stdinOnce:\n                                description: |-\n                                  Whether the container runtime should close the stdin channel after it has been opened by\n                                  a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                  sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                  first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                  at which time stdin is closed and remains closed until the container is restarted. If this\n                                  flag is false, a container processes that reads from stdin will never receive an EOF.\n                                  Default is false\n                                type: boolean\n                              targetContainerName:\n                                description: |-\n                                  If set, the name of the container from PodSpec that this ephemeral container targets.\n                                  The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container.\n                                  If not set then the ephemeral container uses the namespaces configured in the Pod spec.\n\n\n                                  The container runtime must implement support for this feature. If the runtime does not\n                                  support namespace targeting then the result of setting this field is undefined.\n                                type: string\n                              terminationMessagePath:\n                                description: |-\n                                  Optional: Path at which the file to which the container's termination message\n                                  will be written is mounted into the container's filesystem.\n                                  Message written is intended to be brief final status, such as an assertion failure message.\n                                  Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                  all containers will be limited to 12kb.\n                                  Defaults to /dev/termination-log.\n                                  Cannot be updated.\n                                type: string\n                              terminationMessagePolicy:\n                                description: |-\n                                  Indicate how the termination message should be populated. File will use the contents of\n                                  terminationMessagePath to populate the container status message on both success and failure.\n                                  FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                  message file is empty and the container exited with an error.\n                                  The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                  Defaults to File.\n                                  Cannot be updated.\n                                type: string\n                              tty:\n                                description: |-\n                                  Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                  Default is false.\n                                type: boolean\n                              volumeDevices:\n                                description: volumeDevices is the list of block devices\n                                  to be used by the container.\n                                items:\n                                  description: volumeDevice describes a mapping of\n                                    a raw block device within a container.\n                                  properties:\n                                    devicePath:\n                                      description: devicePath is the path inside of\n                                        the container that the device will be mapped\n                                        to.\n                                      type: string\n                                    name:\n                                      description: name must match the name of a persistentVolumeClaim\n                                        in the pod\n                                      type: string\n                                  required:\n                                  - devicePath\n                                  - name\n                                  type: object\n                                type: array\n                              volumeMounts:\n                                description: |-\n                                  Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers.\n                                  Cannot be updated.\n                                items:\n                                  description: VolumeMount describes a mounting of\n                                    a Volume within a container.\n                                  properties:\n                                    mountPath:\n                                      description: |-\n                                        Path within the container at which the volume should be mounted.  Must\n                                        not contain ':'.\n                                      type: string\n                                    mountPropagation:\n                                      description: |-\n                                        mountPropagation determines how mounts are propagated from the host\n                                        to container and the other way around.\n                                        When not set, MountPropagationNone is used.\n                                        This field is beta in 1.10.\n                                      type: string\n                                    name:\n                                      description: This must match the Name of a Volume.\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        Mounted read-only if true, read-write otherwise (false or unspecified).\n                                        Defaults to false.\n                                      type: boolean\n                                    subPath:\n                                      description: |-\n                                        Path within the volume from which the container's volume should be mounted.\n                                        Defaults to \"\" (volume's root).\n                                      type: string\n                                    subPathExpr:\n                                      description: |-\n                                        Expanded path within the volume from which the container's volume should be mounted.\n                                        Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                        Defaults to \"\" (volume's root).\n                                        SubPathExpr and SubPath are mutually exclusive.\n                                      type: string\n                                  required:\n                                  - mountPath\n                                  - name\n                                  type: object\n                                type: array\n                              workingDir:\n                                description: |-\n                                  Container's working directory.\n                                  If not specified, the container runtime's default will be used, which\n                                  might be configured in the container image.\n                                  Cannot be updated.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        hostAliases:\n                          description: |-\n                            HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts\n                            file if specified. This is only valid for non-hostNetwork pods.\n                          items:\n                            description: |-\n                              HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the\n                              pod's hosts file.\n                            properties:\n                              hostnames:\n                                description: Hostnames for the above IP address.\n                                items:\n                                  type: string\n                                type: array\n                              ip:\n                                description: IP address of the host file entry.\n                                type: string\n                            type: object\n                          type: array\n                        hostIPC:\n                          description: |-\n                            Use the host's ipc namespace.\n                            Optional: Default to false.\n                          type: boolean\n                        hostNetwork:\n                          description: |-\n                            Host networking requested for this pod. Use the host's network namespace.\n                            If this option is set, the ports that will be used must be specified.\n                            Default to false.\n                          type: boolean\n                        hostPID:\n                          description: |-\n                            Use the host's pid namespace.\n                            Optional: Default to false.\n                          type: boolean\n                        hostUsers:\n                          description: |-\n                            Use the host's user namespace.\n                            Optional: Default to true.\n                            If set to true or not present, the pod will be run in the host user namespace, useful\n                            for when the pod needs a feature only available to the host user namespace, such as\n                            loading a kernel module with CAP_SYS_MODULE.\n                            When set to false, a new userns is created for the pod. Setting false is useful for\n                            mitigating container breakout vulnerabilities even allowing users to run their\n                            containers as root without actually having root privileges on the host.\n                            This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.\n                          type: boolean\n                        hostname:\n                          description: |-\n                            Specifies the hostname of the Pod\n                            If not specified, the pod's hostname will be set to a system-defined value.\n                          type: string\n                        imagePullSecrets:\n                          description: |-\n                            ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec.\n                            If specified, these secrets will be passed to individual puller implementations for them to use.\n                            More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod\n                          items:\n                            description: |-\n                              LocalObjectReference contains enough information to let you locate the\n                              referenced object inside the same namespace.\n                            properties:\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          type: array\n                        initContainers:\n                          description: |-\n                            List of initialization containers belonging to the pod.\n                            Init containers are executed in order prior to containers being started. If any\n                            init container fails, the pod is considered to have failed and is handled according\n                            to its restartPolicy. The name for an init container or normal container must be\n                            unique among all containers.\n                            Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes.\n                            The resourceRequirements of an init container are taken into account during scheduling\n                            by finding the highest request/limit for each resource type, and then using the max of\n                            of that value or the sum of the normal containers. Limits are applied to init containers\n                            in a similar fashion.\n                            Init containers cannot currently be added or removed.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n                          items:\n                            description: A single application container that you want\n                              to run within a pod.\n                            properties:\n                              args:\n                                description: |-\n                                  Arguments to the entrypoint.\n                                  The container image's CMD is used if this is not provided.\n                                  Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                  cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                  produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                  of whether the variable exists or not. Cannot be updated.\n                                  More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Entrypoint array. Not executed within a shell.\n                                  The container image's ENTRYPOINT is used if this is not provided.\n                                  Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                  cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                  produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                  of whether the variable exists or not. Cannot be updated.\n                                  More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                items:\n                                  type: string\n                                type: array\n                              env:\n                                description: |-\n                                  List of environment variables to set in the container.\n                                  Cannot be updated.\n                                items:\n                                  description: EnvVar represents an environment variable\n                                    present in a Container.\n                                  properties:\n                                    name:\n                                      description: Name of the environment variable.\n                                        Must be a C_IDENTIFIER.\n                                      type: string\n                                    value:\n                                      description: |-\n                                        Variable references $(VAR_NAME) are expanded\n                                        using the previously defined environment variables in the container and\n                                        any service environment variables. If a variable cannot be resolved,\n                                        the reference in the input string will be unchanged. Double $$ are reduced\n                                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                        Escaped references will never be expanded, regardless of whether the variable\n                                        exists or not.\n                                        Defaults to \"\".\n                                      type: string\n                                    valueFrom:\n                                      description: Source for the environment variable's\n                                        value. Cannot be used if value is not empty.\n                                      properties:\n                                        configMapKeyRef:\n                                          description: Selects a key of a ConfigMap.\n                                          properties:\n                                            key:\n                                              description: The key to select.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        fieldRef:\n                                          description: |-\n                                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        secretKeyRef:\n                                          description: Selects a key of a secret in\n                                            the pod's namespace\n                                          properties:\n                                            key:\n                                              description: The key of the secret to\n                                                select from.  Must be a valid secret\n                                                key.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                              envFrom:\n                                description: |-\n                                  List of sources to populate environment variables in the container.\n                                  The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                  will be reported as an event when the container is starting. When a key exists in multiple\n                                  sources, the value associated with the last source will take precedence.\n                                  Values defined by an Env with a duplicate key will take precedence.\n                                  Cannot be updated.\n                                items:\n                                  description: EnvFromSource represents the source\n                                    of a set of ConfigMaps\n                                  properties:\n                                    configMapRef:\n                                      description: The ConfigMap to select from\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    prefix:\n                                      description: An optional identifier to prepend\n                                        to each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                      type: string\n                                    secretRef:\n                                      description: The Secret to select from\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                                type: array\n                              image:\n                                description: |-\n                                  Container image name.\n                                  More info: https://kubernetes.io/docs/concepts/containers/images\n                                  This field is optional to allow higher level config management to default or override\n                                  container images in workload controllers like Deployments and StatefulSets.\n                                type: string\n                              imagePullPolicy:\n                                description: |-\n                                  Image pull policy.\n                                  One of Always, Never, IfNotPresent.\n                                  Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                  Cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                                type: string\n                              lifecycle:\n                                description: |-\n                                  Actions that the management system should take in response to container lifecycle events.\n                                  Cannot be updated.\n                                properties:\n                                  postStart:\n                                    description: |-\n                                      PostStart is called immediately after a container is created. If the handler fails,\n                                      the container is terminated and restarted according to its restart policy.\n                                      Other management of the container blocks until the hook completes.\n                                      More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      sleep:\n                                        description: Sleep represents the duration\n                                          that the container should sleep before being\n                                          terminated.\n                                        properties:\n                                          seconds:\n                                            description: Seconds is the number of\n                                              seconds to sleep.\n                                            format: int64\n                                            type: integer\n                                        required:\n                                        - seconds\n                                        type: object\n                                      tcpSocket:\n                                        description: |-\n                                          Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                          for the backward compatibility. There are no validation of this field and\n                                          lifecycle hooks will fail in runtime when tcp handler is specified.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                    type: object\n                                  preStop:\n                                    description: |-\n                                      PreStop is called immediately before a container is terminated due to an\n                                      API request or management event such as liveness/startup probe failure,\n                                      preemption, resource contention, etc. The handler is not called if the\n                                      container crashes or exits. The Pod's termination grace period countdown begins before the\n                                      PreStop hook is executed. Regardless of the outcome of the handler, the\n                                      container will eventually terminate within the Pod's termination grace\n                                      period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                      or until the termination grace period is reached.\n                                      More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      sleep:\n                                        description: Sleep represents the duration\n                                          that the container should sleep before being\n                                          terminated.\n                                        properties:\n                                          seconds:\n                                            description: Seconds is the number of\n                                              seconds to sleep.\n                                            format: int64\n                                            type: integer\n                                        required:\n                                        - seconds\n                                        type: object\n                                      tcpSocket:\n                                        description: |-\n                                          Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                          for the backward compatibility. There are no validation of this field and\n                                          lifecycle hooks will fail in runtime when tcp handler is specified.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                    type: object\n                                type: object\n                              livenessProbe:\n                                description: |-\n                                  Periodic probe of container liveness.\n                                  Container will be restarted if the probe fails.\n                                  Cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                properties:\n                                  exec:\n                                    description: Exec specifies the action to take.\n                                    properties:\n                                      command:\n                                        description: |-\n                                          Command is the command line to execute inside the container, the working directory for the\n                                          command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                          not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                          a shell, you need to explicitly call out to that shell.\n                                          Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  failureThreshold:\n                                    description: |-\n                                      Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                      Defaults to 3. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  grpc:\n                                    description: GRPC specifies an action involving\n                                      a GRPC port.\n                                    properties:\n                                      port:\n                                        description: Port number of the gRPC service.\n                                          Number must be in the range 1 to 65535.\n                                        format: int32\n                                        type: integer\n                                      service:\n                                        description: |-\n                                          Service is the name of the service to place in the gRPC HealthCheckRequest\n                                          (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                          If this is not specified, the default behavior is defined by gRPC.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  httpGet:\n                                    description: HTTPGet specifies the http request\n                                      to perform.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          Host name to connect to, defaults to the pod IP. You probably want to set\n                                          \"Host\" in httpHeaders instead.\n                                        type: string\n                                      httpHeaders:\n                                        description: Custom headers to set in the\n                                          request. HTTP allows repeated headers.\n                                        items:\n                                          description: HTTPHeader describes a custom\n                                            header to be used in HTTP probes\n                                          properties:\n                                            name:\n                                              description: |-\n                                                The header field name.\n                                                This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                              type: string\n                                            value:\n                                              description: The header field value\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      path:\n                                        description: Path to access on the HTTP server.\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Name or number of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                      scheme:\n                                        description: |-\n                                          Scheme to use for connecting to the host.\n                                          Defaults to HTTP.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  initialDelaySeconds:\n                                    description: |-\n                                      Number of seconds after the container has started before liveness probes are initiated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                  periodSeconds:\n                                    description: |-\n                                      How often (in seconds) to perform the probe.\n                                      Default to 10 seconds. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  successThreshold:\n                                    description: |-\n                                      Minimum consecutive successes for the probe to be considered successful after having failed.\n                                      Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  tcpSocket:\n                                    description: TCPSocket specifies an action involving\n                                      a TCP port.\n                                    properties:\n                                      host:\n                                        description: 'Optional: Host name to connect\n                                          to, defaults to the pod IP.'\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Number or name of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                    required:\n                                    - port\n                                    type: object\n                                  terminationGracePeriodSeconds:\n                                    description: |-\n                                      Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                      The grace period is the duration in seconds after the processes running in the pod are sent\n                                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                      Set this value longer than the expected cleanup time for your process.\n                                      If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                      value overrides the value provided by the pod spec.\n                                      Value must be non-negative integer. The value zero indicates stop immediately via\n                                      the kill signal (no opportunity to shut down).\n                                      This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                      Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                    format: int64\n                                    type: integer\n                                  timeoutSeconds:\n                                    description: |-\n                                      Number of seconds after which the probe times out.\n                                      Defaults to 1 second. Minimum value is 1.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                type: object\n                              name:\n                                description: |-\n                                  Name of the container specified as a DNS_LABEL.\n                                  Each container in a pod must have a unique name (DNS_LABEL).\n                                  Cannot be updated.\n                                type: string\n                              ports:\n                                description: |-\n                                  List of ports to expose from the container. Not specifying a port here\n                                  DOES NOT prevent that port from being exposed. Any port which is\n                                  listening on the default \"0.0.0.0\" address inside a container will be\n                                  accessible from the network.\n                                  Modifying this array with strategic merge patch may corrupt the data.\n                                  For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                                  Cannot be updated.\n                                items:\n                                  description: ContainerPort represents a network\n                                    port in a single container.\n                                  properties:\n                                    containerPort:\n                                      description: |-\n                                        Number of port to expose on the pod's IP address.\n                                        This must be a valid port number, 0 < x < 65536.\n                                      format: int32\n                                      type: integer\n                                    hostIP:\n                                      description: What host IP to bind the external\n                                        port to.\n                                      type: string\n                                    hostPort:\n                                      description: |-\n                                        Number of port to expose on the host.\n                                        If specified, this must be a valid port number, 0 < x < 65536.\n                                        If HostNetwork is specified, this must match ContainerPort.\n                                        Most containers do not need this.\n                                      format: int32\n                                      type: integer\n                                    name:\n                                      description: |-\n                                        If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                        named port in a pod must have a unique name. Name for the port that can be\n                                        referred to by services.\n                                      type: string\n                                    protocol:\n                                      default: TCP\n                                      description: |-\n                                        Protocol for port. Must be UDP, TCP, or SCTP.\n                                        Defaults to \"TCP\".\n                                      type: string\n                                  required:\n                                  - containerPort\n                                  type: object\n                                type: array\n                                x-kubernetes-list-map-keys:\n                                - containerPort\n                                - protocol\n                                x-kubernetes-list-type: map\n                              readinessProbe:\n                                description: |-\n                                  Periodic probe of container service readiness.\n                                  Container will be removed from service endpoints if the probe fails.\n                                  Cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                properties:\n                                  exec:\n                                    description: Exec specifies the action to take.\n                                    properties:\n                                      command:\n                                        description: |-\n                                          Command is the command line to execute inside the container, the working directory for the\n                                          command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                          not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                          a shell, you need to explicitly call out to that shell.\n                                          Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  failureThreshold:\n                                    description: |-\n                                      Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                      Defaults to 3. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  grpc:\n                                    description: GRPC specifies an action involving\n                                      a GRPC port.\n                                    properties:\n                                      port:\n                                        description: Port number of the gRPC service.\n                                          Number must be in the range 1 to 65535.\n                                        format: int32\n                                        type: integer\n                                      service:\n                                        description: |-\n                                          Service is the name of the service to place in the gRPC HealthCheckRequest\n                                          (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                          If this is not specified, the default behavior is defined by gRPC.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  httpGet:\n                                    description: HTTPGet specifies the http request\n                                      to perform.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          Host name to connect to, defaults to the pod IP. You probably want to set\n                                          \"Host\" in httpHeaders instead.\n                                        type: string\n                                      httpHeaders:\n                                        description: Custom headers to set in the\n                                          request. HTTP allows repeated headers.\n                                        items:\n                                          description: HTTPHeader describes a custom\n                                            header to be used in HTTP probes\n                                          properties:\n                                            name:\n                                              description: |-\n                                                The header field name.\n                                                This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                              type: string\n                                            value:\n                                              description: The header field value\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      path:\n                                        description: Path to access on the HTTP server.\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Name or number of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                      scheme:\n                                        description: |-\n                                          Scheme to use for connecting to the host.\n                                          Defaults to HTTP.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  initialDelaySeconds:\n                                    description: |-\n                                      Number of seconds after the container has started before liveness probes are initiated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                  periodSeconds:\n                                    description: |-\n                                      How often (in seconds) to perform the probe.\n                                      Default to 10 seconds. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  successThreshold:\n                                    description: |-\n                                      Minimum consecutive successes for the probe to be considered successful after having failed.\n                                      Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  tcpSocket:\n                                    description: TCPSocket specifies an action involving\n                                      a TCP port.\n                                    properties:\n                                      host:\n                                        description: 'Optional: Host name to connect\n                                          to, defaults to the pod IP.'\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Number or name of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                    required:\n                                    - port\n                                    type: object\n                                  terminationGracePeriodSeconds:\n                                    description: |-\n                                      Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                      The grace period is the duration in seconds after the processes running in the pod are sent\n                                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                      Set this value longer than the expected cleanup time for your process.\n                                      If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                      value overrides the value provided by the pod spec.\n                                      Value must be non-negative integer. The value zero indicates stop immediately via\n                                      the kill signal (no opportunity to shut down).\n                                      This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                      Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                    format: int64\n                                    type: integer\n                                  timeoutSeconds:\n                                    description: |-\n                                      Number of seconds after which the probe times out.\n                                      Defaults to 1 second. Minimum value is 1.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                type: object\n                              resizePolicy:\n                                description: Resources resize policy for the container.\n                                items:\n                                  description: ContainerResizePolicy represents resource\n                                    resize policy for the container.\n                                  properties:\n                                    resourceName:\n                                      description: |-\n                                        Name of the resource to which this resource resize policy applies.\n                                        Supported values: cpu, memory.\n                                      type: string\n                                    restartPolicy:\n                                      description: |-\n                                        Restart policy to apply when specified resource is resized.\n                                        If not specified, it defaults to NotRequired.\n                                      type: string\n                                  required:\n                                  - resourceName\n                                  - restartPolicy\n                                  type: object\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              resources:\n                                description: |-\n                                  Compute Resources required by this container.\n                                  Cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                properties:\n                                  claims:\n                                    description: |-\n                                      Claims lists the names of resources, defined in spec.resourceClaims,\n                                      that are used by this container.\n\n\n                                      This is an alpha field and requires enabling the\n                                      DynamicResourceAllocation feature gate.\n\n\n                                      This field is immutable. It can only be set for containers.\n                                    items:\n                                      description: ResourceClaim references one entry\n                                        in PodSpec.ResourceClaims.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name must match the name of one entry in pod.spec.resourceClaims of\n                                            the Pod where this field is used. It makes that resource available\n                                            inside a container.\n                                          type: string\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - name\n                                    x-kubernetes-list-type: map\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                              restartPolicy:\n                                description: |-\n                                  RestartPolicy defines the restart behavior of individual containers in a pod.\n                                  This field may only be set for init containers, and the only allowed value is \"Always\".\n                                  For non-init containers or when this field is not specified,\n                                  the restart behavior is defined by the Pod's restart policy and the container type.\n                                  Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                                  this init container will be continually restarted on\n                                  exit until all regular containers have terminated. Once all regular\n                                  containers have completed, all init containers with restartPolicy \"Always\"\n                                  will be shut down. This lifecycle differs from normal init containers and\n                                  is often referred to as a \"sidecar\" container. Although this init\n                                  container still starts in the init container sequence, it does not wait\n                                  for the container to complete before proceeding to the next init\n                                  container. Instead, the next init container starts immediately after this\n                                  init container is started, or after any startupProbe has successfully\n                                  completed.\n                                type: string\n                              securityContext:\n                                description: |-\n                                  SecurityContext defines the security options the container should be run with.\n                                  If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                  More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                                properties:\n                                  allowPrivilegeEscalation:\n                                    description: |-\n                                      AllowPrivilegeEscalation controls whether a process can gain more\n                                      privileges than its parent process. This bool directly controls if\n                                      the no_new_privs flag will be set on the container process.\n                                      AllowPrivilegeEscalation is true always when the container is:\n                                      1) run as Privileged\n                                      2) has CAP_SYS_ADMIN\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: boolean\n                                  capabilities:\n                                    description: |-\n                                      The capabilities to add/drop when running containers.\n                                      Defaults to the default set of capabilities granted by the container runtime.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    properties:\n                                      add:\n                                        description: Added capabilities\n                                        items:\n                                          description: Capability represent POSIX\n                                            capabilities type\n                                          type: string\n                                        type: array\n                                      drop:\n                                        description: Removed capabilities\n                                        items:\n                                          description: Capability represent POSIX\n                                            capabilities type\n                                          type: string\n                                        type: array\n                                    type: object\n                                  privileged:\n                                    description: |-\n                                      Run container in privileged mode.\n                                      Processes in privileged containers are essentially equivalent to root on the host.\n                                      Defaults to false.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: boolean\n                                  procMount:\n                                    description: |-\n                                      procMount denotes the type of proc mount to use for the containers.\n                                      The default is DefaultProcMount which uses the container runtime defaults for\n                                      readonly paths and masked paths.\n                                      This requires the ProcMountType feature flag to be enabled.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: string\n                                  readOnlyRootFilesystem:\n                                    description: |-\n                                      Whether this container has a read-only root filesystem.\n                                      Default is false.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    type: boolean\n                                  runAsGroup:\n                                    description: |-\n                                      The GID to run the entrypoint of the container process.\n                                      Uses runtime default if unset.\n                                      May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    format: int64\n                                    type: integer\n                                  runAsNonRoot:\n                                    description: |-\n                                      Indicates that the container must run as a non-root user.\n                                      If true, the Kubelet will validate the image at runtime to ensure that it\n                                      does not run as UID 0 (root) and fail to start the container if it does.\n                                      If unset or false, no such validation will be performed.\n                                      May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    type: boolean\n                                  runAsUser:\n                                    description: |-\n                                      The UID to run the entrypoint of the container process.\n                                      Defaults to user specified in image metadata if unspecified.\n                                      May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    format: int64\n                                    type: integer\n                                  seLinuxOptions:\n                                    description: |-\n                                      The SELinux context to be applied to the container.\n                                      If unspecified, the container runtime will allocate a random SELinux context for each\n                                      container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                      PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    properties:\n                                      level:\n                                        description: Level is SELinux level label\n                                          that applies to the container.\n                                        type: string\n                                      role:\n                                        description: Role is a SELinux role label\n                                          that applies to the container.\n                                        type: string\n                                      type:\n                                        description: Type is a SELinux type label\n                                          that applies to the container.\n                                        type: string\n                                      user:\n                                        description: User is a SELinux user label\n                                          that applies to the container.\n                                        type: string\n                                    type: object\n                                  seccompProfile:\n                                    description: |-\n                                      The seccomp options to use by this container. If seccomp options are\n                                      provided at both the pod & container level, the container options\n                                      override the pod options.\n                                      Note that this field cannot be set when spec.os.name is windows.\n                                    properties:\n                                      localhostProfile:\n                                        description: |-\n                                          localhostProfile indicates a profile defined in a file on the node should be used.\n                                          The profile must be preconfigured on the node to work.\n                                          Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                          Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                        type: string\n                                      type:\n                                        description: |-\n                                          type indicates which kind of seccomp profile will be applied.\n                                          Valid options are:\n\n\n                                          Localhost - a profile defined in a file on the node should be used.\n                                          RuntimeDefault - the container runtime default profile should be used.\n                                          Unconfined - no profile should be applied.\n                                        type: string\n                                    required:\n                                    - type\n                                    type: object\n                                  windowsOptions:\n                                    description: |-\n                                      The Windows specific settings applied to all containers.\n                                      If unspecified, the options from the PodSecurityContext will be used.\n                                      If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      Note that this field cannot be set when spec.os.name is linux.\n                                    properties:\n                                      gmsaCredentialSpec:\n                                        description: |-\n                                          GMSACredentialSpec is where the GMSA admission webhook\n                                          (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                          GMSA credential spec named by the GMSACredentialSpecName field.\n                                        type: string\n                                      gmsaCredentialSpecName:\n                                        description: GMSACredentialSpecName is the\n                                          name of the GMSA credential spec to use.\n                                        type: string\n                                      hostProcess:\n                                        description: |-\n                                          HostProcess determines if a container should be run as a 'Host Process' container.\n                                          All of a Pod's containers must have the same effective HostProcess value\n                                          (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                          In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                        type: boolean\n                                      runAsUserName:\n                                        description: |-\n                                          The UserName in Windows to run the entrypoint of the container process.\n                                          Defaults to the user specified in image metadata if unspecified.\n                                          May also be set in PodSecurityContext. If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                        type: string\n                                    type: object\n                                type: object\n                              startupProbe:\n                                description: |-\n                                  StartupProbe indicates that the Pod has successfully initialized.\n                                  If specified, no other probes are executed until this completes successfully.\n                                  If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                                  This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                                  when it might take a long time to load data or warm a cache, than during steady-state operation.\n                                  This cannot be updated.\n                                  More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                properties:\n                                  exec:\n                                    description: Exec specifies the action to take.\n                                    properties:\n                                      command:\n                                        description: |-\n                                          Command is the command line to execute inside the container, the working directory for the\n                                          command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                          not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                          a shell, you need to explicitly call out to that shell.\n                                          Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  failureThreshold:\n                                    description: |-\n                                      Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                      Defaults to 3. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  grpc:\n                                    description: GRPC specifies an action involving\n                                      a GRPC port.\n                                    properties:\n                                      port:\n                                        description: Port number of the gRPC service.\n                                          Number must be in the range 1 to 65535.\n                                        format: int32\n                                        type: integer\n                                      service:\n                                        description: |-\n                                          Service is the name of the service to place in the gRPC HealthCheckRequest\n                                          (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                          If this is not specified, the default behavior is defined by gRPC.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  httpGet:\n                                    description: HTTPGet specifies the http request\n                                      to perform.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          Host name to connect to, defaults to the pod IP. You probably want to set\n                                          \"Host\" in httpHeaders instead.\n                                        type: string\n                                      httpHeaders:\n                                        description: Custom headers to set in the\n                                          request. HTTP allows repeated headers.\n                                        items:\n                                          description: HTTPHeader describes a custom\n                                            header to be used in HTTP probes\n                                          properties:\n                                            name:\n                                              description: |-\n                                                The header field name.\n                                                This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                              type: string\n                                            value:\n                                              description: The header field value\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      path:\n                                        description: Path to access on the HTTP server.\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Name or number of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                      scheme:\n                                        description: |-\n                                          Scheme to use for connecting to the host.\n                                          Defaults to HTTP.\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  initialDelaySeconds:\n                                    description: |-\n                                      Number of seconds after the container has started before liveness probes are initiated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                  periodSeconds:\n                                    description: |-\n                                      How often (in seconds) to perform the probe.\n                                      Default to 10 seconds. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  successThreshold:\n                                    description: |-\n                                      Minimum consecutive successes for the probe to be considered successful after having failed.\n                                      Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                    format: int32\n                                    type: integer\n                                  tcpSocket:\n                                    description: TCPSocket specifies an action involving\n                                      a TCP port.\n                                    properties:\n                                      host:\n                                        description: 'Optional: Host name to connect\n                                          to, defaults to the pod IP.'\n                                        type: string\n                                      port:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          Number or name of the port to access on the container.\n                                          Number must be in the range 1 to 65535.\n                                          Name must be an IANA_SVC_NAME.\n                                        x-kubernetes-int-or-string: true\n                                    required:\n                                    - port\n                                    type: object\n                                  terminationGracePeriodSeconds:\n                                    description: |-\n                                      Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                      The grace period is the duration in seconds after the processes running in the pod are sent\n                                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                      Set this value longer than the expected cleanup time for your process.\n                                      If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                      value overrides the value provided by the pod spec.\n                                      Value must be non-negative integer. The value zero indicates stop immediately via\n                                      the kill signal (no opportunity to shut down).\n                                      This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                      Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                    format: int64\n                                    type: integer\n                                  timeoutSeconds:\n                                    description: |-\n                                      Number of seconds after which the probe times out.\n                                      Defaults to 1 second. Minimum value is 1.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    format: int32\n                                    type: integer\n                                type: object\n                              stdin:\n                                description: |-\n                                  Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                  is not set, reads from stdin in the container will always result in EOF.\n                                  Default is false.\n                                type: boolean\n                              stdinOnce:\n                                description: |-\n                                  Whether the container runtime should close the stdin channel after it has been opened by\n                                  a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                  sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                  first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                  at which time stdin is closed and remains closed until the container is restarted. If this\n                                  flag is false, a container processes that reads from stdin will never receive an EOF.\n                                  Default is false\n                                type: boolean\n                              terminationMessagePath:\n                                description: |-\n                                  Optional: Path at which the file to which the container's termination message\n                                  will be written is mounted into the container's filesystem.\n                                  Message written is intended to be brief final status, such as an assertion failure message.\n                                  Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                  all containers will be limited to 12kb.\n                                  Defaults to /dev/termination-log.\n                                  Cannot be updated.\n                                type: string\n                              terminationMessagePolicy:\n                                description: |-\n                                  Indicate how the termination message should be populated. File will use the contents of\n                                  terminationMessagePath to populate the container status message on both success and failure.\n                                  FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                  message file is empty and the container exited with an error.\n                                  The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                  Defaults to File.\n                                  Cannot be updated.\n                                type: string\n                              tty:\n                                description: |-\n                                  Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                  Default is false.\n                                type: boolean\n                              volumeDevices:\n                                description: volumeDevices is the list of block devices\n                                  to be used by the container.\n                                items:\n                                  description: volumeDevice describes a mapping of\n                                    a raw block device within a container.\n                                  properties:\n                                    devicePath:\n                                      description: devicePath is the path inside of\n                                        the container that the device will be mapped\n                                        to.\n                                      type: string\n                                    name:\n                                      description: name must match the name of a persistentVolumeClaim\n                                        in the pod\n                                      type: string\n                                  required:\n                                  - devicePath\n                                  - name\n                                  type: object\n                                type: array\n                              volumeMounts:\n                                description: |-\n                                  Pod volumes to mount into the container's filesystem.\n                                  Cannot be updated.\n                                items:\n                                  description: VolumeMount describes a mounting of\n                                    a Volume within a container.\n                                  properties:\n                                    mountPath:\n                                      description: |-\n                                        Path within the container at which the volume should be mounted.  Must\n                                        not contain ':'.\n                                      type: string\n                                    mountPropagation:\n                                      description: |-\n                                        mountPropagation determines how mounts are propagated from the host\n                                        to container and the other way around.\n                                        When not set, MountPropagationNone is used.\n                                        This field is beta in 1.10.\n                                      type: string\n                                    name:\n                                      description: This must match the Name of a Volume.\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        Mounted read-only if true, read-write otherwise (false or unspecified).\n                                        Defaults to false.\n                                      type: boolean\n                                    subPath:\n                                      description: |-\n                                        Path within the volume from which the container's volume should be mounted.\n                                        Defaults to \"\" (volume's root).\n                                      type: string\n                                    subPathExpr:\n                                      description: |-\n                                        Expanded path within the volume from which the container's volume should be mounted.\n                                        Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                        Defaults to \"\" (volume's root).\n                                        SubPathExpr and SubPath are mutually exclusive.\n                                      type: string\n                                  required:\n                                  - mountPath\n                                  - name\n                                  type: object\n                                type: array\n                              workingDir:\n                                description: |-\n                                  Container's working directory.\n                                  If not specified, the container runtime's default will be used, which\n                                  might be configured in the container image.\n                                  Cannot be updated.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        nodeName:\n                          description: |-\n                            NodeName is a request to schedule this pod onto a specific node. If it is non-empty,\n                            the scheduler simply schedules this pod onto that node, assuming that it fits resource\n                            requirements.\n                          type: string\n                        nodeSelector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            NodeSelector is a selector which must be true for the pod to fit on a node.\n                            Selector which must match a node's labels for the pod to be scheduled on that node.\n                            More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        os:\n                          description: |-\n                            Specifies the OS of the containers in the pod.\n                            Some pod and container fields are restricted if this is set.\n\n\n                            If the OS field is set to linux, the following fields must be unset:\n                            -securityContext.windowsOptions\n\n\n                            If the OS field is set to windows, following fields must be unset:\n                            - spec.hostPID\n                            - spec.hostIPC\n                            - spec.hostUsers\n                            - spec.securityContext.seLinuxOptions\n                            - spec.securityContext.seccompProfile\n                            - spec.securityContext.fsGroup\n                            - spec.securityContext.fsGroupChangePolicy\n                            - spec.securityContext.sysctls\n                            - spec.shareProcessNamespace\n                            - spec.securityContext.runAsUser\n                            - spec.securityContext.runAsGroup\n                            - spec.securityContext.supplementalGroups\n                            - spec.containers[*].securityContext.seLinuxOptions\n                            - spec.containers[*].securityContext.seccompProfile\n                            - spec.containers[*].securityContext.capabilities\n                            - spec.containers[*].securityContext.readOnlyRootFilesystem\n                            - spec.containers[*].securityContext.privileged\n                            - spec.containers[*].securityContext.allowPrivilegeEscalation\n                            - spec.containers[*].securityContext.procMount\n                            - spec.containers[*].securityContext.runAsUser\n                            - spec.containers[*].securityContext.runAsGroup\n                          properties:\n                            name:\n                              description: |-\n                                Name is the name of the operating system. The currently supported values are linux and windows.\n                                Additional value may be defined in future and can be one of:\n                                https://github.com/opencontainers/runtime-spec/blob/master/config.md#platform-specific-configuration\n                                Clients should expect to handle additional values and treat unrecognized values in this field as os: null\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        overhead:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Overhead represents the resource overhead associated with running a pod for a given RuntimeClass.\n                            This field will be autopopulated at admission time by the RuntimeClass admission controller. If\n                            the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests.\n                            The RuntimeClass admission controller will reject Pod create requests which have the overhead already\n                            set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value\n                            defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero.\n                            More info: https://git.k8s.io/enhancements/keps/sig-node/688-pod-overhead/README.md\n                          type: object\n                        preemptionPolicy:\n                          description: |-\n                            PreemptionPolicy is the Policy for preempting pods with lower priority.\n                            One of Never, PreemptLowerPriority.\n                            Defaults to PreemptLowerPriority if unset.\n                          type: string\n                        priority:\n                          description: |-\n                            The priority value. Various system components use this field to find the\n                            priority of the pod. When Priority Admission Controller is enabled, it\n                            prevents users from setting this field. The admission controller populates\n                            this field from PriorityClassName.\n                            The higher the value, the higher the priority.\n                          format: int32\n                          type: integer\n                        priorityClassName:\n                          description: |-\n                            If specified, indicates the pod's priority. \"system-node-critical\" and\n                            \"system-cluster-critical\" are two special keywords which indicate the\n                            highest priorities with the former being the highest priority. Any other\n                            name must be defined by creating a PriorityClass object with that name.\n                            If not specified, the pod priority will be default or zero if there is no\n                            default.\n                          type: string\n                        readinessGates:\n                          description: |-\n                            If specified, all readiness gates will be evaluated for pod readiness.\n                            A pod is ready when all its containers are ready AND\n                            all conditions specified in the readiness gates have status equal to \"True\"\n                            More info: https://git.k8s.io/enhancements/keps/sig-network/580-pod-readiness-gates\n                          items:\n                            description: PodReadinessGate contains the reference to\n                              a pod condition\n                            properties:\n                              conditionType:\n                                description: ConditionType refers to a condition in\n                                  the pod's condition list with matching type.\n                                type: string\n                            required:\n                            - conditionType\n                            type: object\n                          type: array\n                        resourceClaims:\n                          description: |-\n                            ResourceClaims defines which ResourceClaims must be allocated\n                            and reserved before the Pod is allowed to start. The resources\n                            will be made available to those containers which consume them\n                            by name.\n\n\n                            This is an alpha field and requires enabling the\n                            DynamicResourceAllocation feature gate.\n\n\n                            This field is immutable.\n                          items:\n                            description: |-\n                              PodResourceClaim references exactly one ResourceClaim through a ClaimSource.\n                              It adds a name to it that uniquely identifies the ResourceClaim inside the Pod.\n                              Containers that need access to the ResourceClaim reference it with this name.\n                            properties:\n                              name:\n                                description: |-\n                                  Name uniquely identifies this resource claim inside the pod.\n                                  This must be a DNS_LABEL.\n                                type: string\n                              source:\n                                description: Source describes where to find the ResourceClaim.\n                                properties:\n                                  resourceClaimName:\n                                    description: |-\n                                      ResourceClaimName is the name of a ResourceClaim object in the same\n                                      namespace as this pod.\n                                    type: string\n                                  resourceClaimTemplateName:\n                                    description: |-\n                                      ResourceClaimTemplateName is the name of a ResourceClaimTemplate\n                                      object in the same namespace as this pod.\n\n\n                                      The template will be used to create a new ResourceClaim, which will\n                                      be bound to this pod. When this pod is deleted, the ResourceClaim\n                                      will also be deleted. The pod name and resource name, along with a\n                                      generated component, will be used to form a unique name for the\n                                      ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses.\n\n\n                                      This field is immutable and no changes will be made to the\n                                      corresponding ResourceClaim by the control plane after creating the\n                                      ResourceClaim.\n                                    type: string\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        restartPolicy:\n                          description: |-\n                            Restart policy for all containers within the pod.\n                            One of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted.\n                            Default to Always.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy\n                          type: string\n                        runtimeClassName:\n                          description: |-\n                            RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used\n                            to run this pod.  If no RuntimeClass resource matches the named class, the pod will not be run.\n                            If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an\n                            empty definition that uses the default runtime handler.\n                            More info: https://git.k8s.io/enhancements/keps/sig-node/585-runtime-class\n                          type: string\n                        schedulerName:\n                          description: |-\n                            If specified, the pod will be dispatched by specified scheduler.\n                            If not specified, the pod will be dispatched by default scheduler.\n                          type: string\n                        schedulingGates:\n                          description: |-\n                            SchedulingGates is an opaque list of values that if specified will block scheduling the pod.\n                            If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the\n                            scheduler will not attempt to schedule the pod.\n\n\n                            SchedulingGates can only be set at pod creation time, and be removed only afterwards.\n\n\n                            This is a beta feature enabled by the PodSchedulingReadiness feature gate.\n                          items:\n                            description: PodSchedulingGate is associated to a Pod\n                              to guard its scheduling.\n                            properties:\n                              name:\n                                description: |-\n                                  Name of the scheduling gate.\n                                  Each scheduling gate must have a unique name field.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        securityContext:\n                          description: |-\n                            SecurityContext holds pod-level security attributes and common container settings.\n                            Optional: Defaults to empty.  See type description for default values of each field.\n                          properties:\n                            fsGroup:\n                              description: |-\n                                A special supplemental group that applies to all containers in a pod.\n                                Some volume types allow the Kubelet to change the ownership of that volume\n                                to be owned by the pod:\n\n\n                                1. The owning GID will be the FSGroup\n                                2. The setgid bit is set (new files created in the volume will be owned by FSGroup)\n                                3. The permission bits are OR'd with rw-rw----\n\n\n                                If unset, the Kubelet will not modify the ownership and permissions of any volume.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            fsGroupChangePolicy:\n                              description: |-\n                                fsGroupChangePolicy defines behavior of changing ownership and permission of the volume\n                                before being exposed inside Pod. This field will only apply to\n                                volume types which support fsGroup based ownership(and permissions).\n                                It will have no effect on ephemeral volume types such as: secret, configmaps\n                                and emptydir.\n                                Valid values are \"OnRootMismatch\" and \"Always\". If not specified, \"Always\" is used.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: string\n                            runAsGroup:\n                              description: |-\n                                The GID to run the entrypoint of the container process.\n                                Uses runtime default if unset.\n                                May also be set in SecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence\n                                for that container.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            runAsNonRoot:\n                              description: |-\n                                Indicates that the container must run as a non-root user.\n                                If true, the Kubelet will validate the image at runtime to ensure that it\n                                does not run as UID 0 (root) and fail to start the container if it does.\n                                If unset or false, no such validation will be performed.\n                                May also be set in SecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              type: boolean\n                            runAsUser:\n                              description: |-\n                                The UID to run the entrypoint of the container process.\n                                Defaults to user specified in image metadata if unspecified.\n                                May also be set in SecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence\n                                for that container.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            seLinuxOptions:\n                              description: |-\n                                The SELinux context to be applied to all containers.\n                                If unspecified, the container runtime will allocate a random SELinux context for each\n                                container.  May also be set in SecurityContext.  If set in\n                                both SecurityContext and PodSecurityContext, the value specified in SecurityContext\n                                takes precedence for that container.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                level:\n                                  description: Level is SELinux level label that applies\n                                    to the container.\n                                  type: string\n                                role:\n                                  description: Role is a SELinux role label that applies\n                                    to the container.\n                                  type: string\n                                type:\n                                  description: Type is a SELinux type label that applies\n                                    to the container.\n                                  type: string\n                                user:\n                                  description: User is a SELinux user label that applies\n                                    to the container.\n                                  type: string\n                              type: object\n                            seccompProfile:\n                              description: |-\n                                The seccomp options to use by the containers in this pod.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                localhostProfile:\n                                  description: |-\n                                    localhostProfile indicates a profile defined in a file on the node should be used.\n                                    The profile must be preconfigured on the node to work.\n                                    Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                    Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                  type: string\n                                type:\n                                  description: |-\n                                    type indicates which kind of seccomp profile will be applied.\n                                    Valid options are:\n\n\n                                    Localhost - a profile defined in a file on the node should be used.\n                                    RuntimeDefault - the container runtime default profile should be used.\n                                    Unconfined - no profile should be applied.\n                                  type: string\n                              required:\n                              - type\n                              type: object\n                            supplementalGroups:\n                              description: |-\n                                A list of groups applied to the first process run in each container, in addition\n                                to the container's primary GID, the fsGroup (if specified), and group memberships\n                                defined in the container image for the uid of the container process. If unspecified,\n                                no additional groups are added to any container. Note that group memberships\n                                defined in the container image for the uid of the container process are still effective,\n                                even if they are not included in this list.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              items:\n                                format: int64\n                                type: integer\n                              type: array\n                            sysctls:\n                              description: |-\n                                Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported\n                                sysctls (by the container runtime) might fail to launch.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              items:\n                                description: Sysctl defines a kernel parameter to\n                                  be set\n                                properties:\n                                  name:\n                                    description: Name of a property to set\n                                    type: string\n                                  value:\n                                    description: Value of a property to set\n                                    type: string\n                                required:\n                                - name\n                                - value\n                                type: object\n                              type: array\n                            windowsOptions:\n                              description: |-\n                                The Windows specific settings applied to all containers.\n                                If unspecified, the options within a container's SecurityContext will be used.\n                                If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is linux.\n                              properties:\n                                gmsaCredentialSpec:\n                                  description: |-\n                                    GMSACredentialSpec is where the GMSA admission webhook\n                                    (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                    GMSA credential spec named by the GMSACredentialSpecName field.\n                                  type: string\n                                gmsaCredentialSpecName:\n                                  description: GMSACredentialSpecName is the name\n                                    of the GMSA credential spec to use.\n                                  type: string\n                                hostProcess:\n                                  description: |-\n                                    HostProcess determines if a container should be run as a 'Host Process' container.\n                                    All of a Pod's containers must have the same effective HostProcess value\n                                    (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                    In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                  type: boolean\n                                runAsUserName:\n                                  description: |-\n                                    The UserName in Windows to run the entrypoint of the container process.\n                                    Defaults to the user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext. If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: string\n                              type: object\n                          type: object\n                        serviceAccount:\n                          description: |-\n                            DeprecatedServiceAccount is a depreciated alias for ServiceAccountName.\n                            Deprecated: Use serviceAccountName instead.\n                          type: string\n                        serviceAccountName:\n                          description: |-\n                            ServiceAccountName is the name of the ServiceAccount to use to run this pod.\n                            More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n                          type: string\n                        setHostnameAsFQDN:\n                          description: |-\n                            If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default).\n                            In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname).\n                            In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip\\\\Parameters to FQDN.\n                            If a pod does not have FQDN, this has no effect.\n                            Default to false.\n                          type: boolean\n                        shareProcessNamespace:\n                          description: |-\n                            Share a single process namespace between all of the containers in a pod.\n                            When this is set containers will be able to view and signal processes from other containers\n                            in the same pod, and the first process in each container will not be assigned PID 1.\n                            HostPID and ShareProcessNamespace cannot both be set.\n                            Optional: Default to false.\n                          type: boolean\n                        subdomain:\n                          description: |-\n                            If specified, the fully qualified Pod hostname will be \"<hostname>.<subdomain>.<pod namespace>.svc.<cluster domain>\".\n                            If not specified, the pod will not have a domainname at all.\n                          type: string\n                        terminationGracePeriodSeconds:\n                          description: |-\n                            Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request.\n                            Value must be non-negative integer. The value zero indicates stop immediately via\n                            the kill signal (no opportunity to shut down).\n                            If this value is nil, the default grace period will be used instead.\n                            The grace period is the duration in seconds after the processes running in the pod are sent\n                            a termination signal and the time when the processes are forcibly halted with a kill signal.\n                            Set this value longer than the expected cleanup time for your process.\n                            Defaults to 30 seconds.\n                          format: int64\n                          type: integer\n                        tolerations:\n                          description: If specified, the pod's tolerations.\n                          items:\n                            description: |-\n                              The pod this Toleration is attached to tolerates any taint that matches\n                              the triple <key,value,effect> using the matching operator <operator>.\n                            properties:\n                              effect:\n                                description: |-\n                                  Effect indicates the taint effect to match. Empty means match all taint effects.\n                                  When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                type: string\n                              key:\n                                description: |-\n                                  Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                  If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                type: string\n                              operator:\n                                description: |-\n                                  Operator represents a key's relationship to the value.\n                                  Valid operators are Exists and Equal. Defaults to Equal.\n                                  Exists is equivalent to wildcard for value, so that a pod can\n                                  tolerate all taints of a particular category.\n                                type: string\n                              tolerationSeconds:\n                                description: |-\n                                  TolerationSeconds represents the period of time the toleration (which must be\n                                  of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                  it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                  negative values will be treated as 0 (evict immediately) by the system.\n                                format: int64\n                                type: integer\n                              value:\n                                description: |-\n                                  Value is the taint value the toleration matches to.\n                                  If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                type: string\n                            type: object\n                          type: array\n                        topologySpreadConstraints:\n                          description: |-\n                            TopologySpreadConstraints describes how a group of pods ought to spread across topology\n                            domains. Scheduler will schedule pods in a way which abides by the constraints.\n                            All topologySpreadConstraints are ANDed.\n                          items:\n                            description: TopologySpreadConstraint specifies how to\n                              spread matching pods among the given topology.\n                            properties:\n                              labelSelector:\n                                description: |-\n                                  LabelSelector is used to find matching pods.\n                                  Pods that match this label selector are counted to determine the number of pods\n                                  in their corresponding topology domain.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              matchLabelKeys:\n                                description: |-\n                                  MatchLabelKeys is a set of pod label keys to select the pods over which\n                                  spreading will be calculated. The keys are used to lookup values from the\n                                  incoming pod labels, those key-value labels are ANDed with labelSelector\n                                  to select the group of existing pods over which spreading will be calculated\n                                  for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                  MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                  Keys that don't exist in the incoming pod labels will\n                                  be ignored. A null or empty list means only match against labelSelector.\n\n\n                                  This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              maxSkew:\n                                description: |-\n                                  MaxSkew describes the degree to which pods may be unevenly distributed.\n                                  When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                  between the number of matching pods in the target topology and the global minimum.\n                                  The global minimum is the minimum number of matching pods in an eligible domain\n                                  or zero if the number of eligible domains is less than MinDomains.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 2/2/1:\n                                  In this case, the global minimum is 1.\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |   P   |\n                                  - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                  scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                  violate MaxSkew(1).\n                                  - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                  When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                  to topologies that satisfy it.\n                                  It's a required field. Default value is 1 and 0 is not allowed.\n                                format: int32\n                                type: integer\n                              minDomains:\n                                description: |-\n                                  MinDomains indicates a minimum number of eligible domains.\n                                  When the number of eligible domains with matching topology keys is less than minDomains,\n                                  Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                  And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                  this value has no effect on scheduling.\n                                  As a result, when the number of eligible domains is less than minDomains,\n                                  scheduler won't schedule more than maxSkew Pods to those domains.\n                                  If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                  Valid values are integers greater than 0.\n                                  When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                  For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                  labelSelector spread as 2/2/2:\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |  P P  |\n                                  The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                  In this situation, new pod with the same labelSelector cannot be scheduled,\n                                  because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                  it will violate MaxSkew.\n\n\n                                  This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                format: int32\n                                type: integer\n                              nodeAffinityPolicy:\n                                description: |-\n                                  NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                  when calculating pod topology spread skew. Options are:\n                                  - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                  - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                  If this value is nil, the behavior is equivalent to the Honor policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              nodeTaintsPolicy:\n                                description: |-\n                                  NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                  pod topology spread skew. Options are:\n                                  - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                  has a toleration, are included.\n                                  - Ignore: node taints are ignored. All nodes are included.\n\n\n                                  If this value is nil, the behavior is equivalent to the Ignore policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              topologyKey:\n                                description: |-\n                                  TopologyKey is the key of node labels. Nodes that have a label with this key\n                                  and identical values are considered to be in the same topology.\n                                  We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                  of pods into each bucket.\n                                  We define a domain as a particular instance of a topology.\n                                  Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                  nodeAffinityPolicy and nodeTaintsPolicy.\n                                  e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                  And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                  It's a required field.\n                                type: string\n                              whenUnsatisfiable:\n                                description: |-\n                                  WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                  the spread constraint.\n                                  - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                  - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                    but giving higher precedence to topologies that would help reduce the\n                                    skew.\n                                  A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                  if and only if every possible node assignment for that pod would violate\n                                  \"MaxSkew\" on some topology.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 3/1/1:\n                                  | zone1 | zone2 | zone3 |\n                                  | P P P |   P   |   P   |\n                                  If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                  to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                  MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                  won't make it *more* imbalanced.\n                                  It's a required field.\n                                type: string\n                            required:\n                            - maxSkew\n                            - topologyKey\n                            - whenUnsatisfiable\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - topologyKey\n                          - whenUnsatisfiable\n                          x-kubernetes-list-type: map\n                        volumes:\n                          description: |-\n                            List of volumes that can be mounted by containers belonging to the pod.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes\n                          items:\n                            description: Volume represents a named volume in a pod\n                              that may be accessed by any container in the pod.\n                            properties:\n                              awsElasticBlockStore:\n                                description: |-\n                                  awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                                  kubelet's host machine and then exposed to the pod.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  partition:\n                                    description: |-\n                                      partition is the partition in the volume that you want to mount.\n                                      If omitted, the default is to mount by volume name.\n                                      Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                      Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                    format: int32\n                                    type: integer\n                                  readOnly:\n                                    description: |-\n                                      readOnly value true will force the readOnly setting in VolumeMounts.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                    type: boolean\n                                  volumeID:\n                                    description: |-\n                                      volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                    type: string\n                                required:\n                                - volumeID\n                                type: object\n                              azureDisk:\n                                description: azureDisk represents an Azure Data Disk\n                                  mount on the host and bind mount to the pod.\n                                properties:\n                                  cachingMode:\n                                    description: 'cachingMode is the Host Caching\n                                      mode: None, Read Only, Read Write.'\n                                    type: string\n                                  diskName:\n                                    description: diskName is the Name of the data\n                                      disk in the blob storage\n                                    type: string\n                                  diskURI:\n                                    description: diskURI is the URI of data disk in\n                                      the blob storage\n                                    type: string\n                                  fsType:\n                                    description: |-\n                                      fsType is Filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  kind:\n                                    description: 'kind expected values are Shared:\n                                      multiple blob disks per storage account  Dedicated:\n                                      single blob disk per storage account  Managed:\n                                      azure managed data disk (only in managed availability\n                                      set). defaults to shared'\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                required:\n                                - diskName\n                                - diskURI\n                                type: object\n                              azureFile:\n                                description: azureFile represents an Azure File Service\n                                  mount on the host and bind mount to the pod.\n                                properties:\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretName:\n                                    description: secretName is the  name of secret\n                                      that contains Azure Storage Account Name and\n                                      Key\n                                    type: string\n                                  shareName:\n                                    description: shareName is the azure share Name\n                                    type: string\n                                required:\n                                - secretName\n                                - shareName\n                                type: object\n                              cephfs:\n                                description: cephFS represents a Ceph FS mount on\n                                  the host that shares a pod's lifetime\n                                properties:\n                                  monitors:\n                                    description: |-\n                                      monitors is Required: Monitors is a collection of Ceph monitors\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    items:\n                                      type: string\n                                    type: array\n                                  path:\n                                    description: 'path is Optional: Used as the mounted\n                                      root, rather than the full Ceph tree, default\n                                      is /'\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    type: boolean\n                                  secretFile:\n                                    description: |-\n                                      secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    type: string\n                                  secretRef:\n                                    description: |-\n                                      secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  user:\n                                    description: |-\n                                      user is optional: User is the rados user name, default is admin\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    type: string\n                                required:\n                                - monitors\n                                type: object\n                              cinder:\n                                description: |-\n                                  cinder represents a cinder volume attached and mounted on kubelets host machine.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef is optional: points to a secret object containing parameters used to connect\n                                      to OpenStack.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  volumeID:\n                                    description: |-\n                                      volumeID used to identify the volume in cinder.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    type: string\n                                required:\n                                - volumeID\n                                type: object\n                              configMap:\n                                description: configMap represents a configMap that\n                                  should populate this volume\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      ConfigMap will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the ConfigMap,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional specify whether the ConfigMap\n                                      or its keys must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              csi:\n                                description: csi (Container Storage Interface) represents\n                                  ephemeral storage that is handled by certain external\n                                  CSI drivers (Beta feature).\n                                properties:\n                                  driver:\n                                    description: |-\n                                      driver is the name of the CSI driver that handles this volume.\n                                      Consult with your admin for the correct name as registered in the cluster.\n                                    type: string\n                                  fsType:\n                                    description: |-\n                                      fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                      If not provided, the empty value is passed to the associated CSI driver\n                                      which will determine the default filesystem to apply.\n                                    type: string\n                                  nodePublishSecretRef:\n                                    description: |-\n                                      nodePublishSecretRef is a reference to the secret object containing\n                                      sensitive information to pass to the CSI driver to complete the CSI\n                                      NodePublishVolume and NodeUnpublishVolume calls.\n                                      This field is optional, and  may be empty if no secret is required. If the\n                                      secret object contains more than one secret, all secret references are passed.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  readOnly:\n                                    description: |-\n                                      readOnly specifies a read-only configuration for the volume.\n                                      Defaults to false (read/write).\n                                    type: boolean\n                                  volumeAttributes:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      volumeAttributes stores driver-specific properties that are passed to the CSI\n                                      driver. Consult your driver's documentation for supported values.\n                                    type: object\n                                required:\n                                - driver\n                                type: object\n                              downwardAPI:\n                                description: downwardAPI represents downward API about\n                                  the pod that should populate this volume\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      Optional: mode bits to use on created files by default. Must be a\n                                      Optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: Items is a list of downward API volume\n                                      file\n                                    items:\n                                      description: DownwardAPIVolumeFile represents\n                                        information to create the file containing\n                                        the pod field\n                                      properties:\n                                        fieldRef:\n                                          description: 'Required: Selects a field\n                                            of the pod: only annotations, labels,\n                                            name and namespace are supported.'\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        mode:\n                                          description: |-\n                                            Optional: mode bits used to set permissions on this file, must be an octal value\n                                            between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: 'Required: Path is  the relative\n                                            path name of the file to be created. Must\n                                            not be absolute or contain the ''..''\n                                            path. Must be utf-8 encoded. The first\n                                            item of the relative path must not start\n                                            with ''..'''\n                                          type: string\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      required:\n                                      - path\n                                      type: object\n                                    type: array\n                                type: object\n                              emptyDir:\n                                description: |-\n                                  emptyDir represents a temporary directory that shares a pod's lifetime.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                properties:\n                                  medium:\n                                    description: |-\n                                      medium represents what type of storage medium should back this directory.\n                                      The default is \"\" which means to use the node's default medium.\n                                      Must be an empty string (default) or Memory.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                    type: string\n                                  sizeLimit:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: |-\n                                      sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                      The size limit is also applicable for memory medium.\n                                      The maximum usage on memory medium EmptyDir would be the minimum value between\n                                      the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                      The default is nil which means that the limit is undefined.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                type: object\n                              ephemeral:\n                                description: |-\n                                  ephemeral represents a volume that is handled by a cluster storage driver.\n                                  The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                                  and deleted when the pod is removed.\n\n\n                                  Use this if:\n                                  a) the volume is only needed while the pod runs,\n                                  b) features of normal volumes like restoring from snapshot or capacity\n                                     tracking are needed,\n                                  c) the storage driver is specified through a storage class, and\n                                  d) the storage driver supports dynamic volume provisioning through\n                                     a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                     information on the connection between this volume type\n                                     and PersistentVolumeClaim).\n\n\n                                  Use PersistentVolumeClaim or one of the vendor-specific\n                                  APIs for volumes that persist for longer than the lifecycle\n                                  of an individual pod.\n\n\n                                  Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                                  be used that way - see the documentation of the driver for\n                                  more information.\n\n\n                                  A pod can use both types of ephemeral volumes and\n                                  persistent volumes at the same time.\n                                properties:\n                                  volumeClaimTemplate:\n                                    description: |-\n                                      Will be used to create a stand-alone PVC to provision the volume.\n                                      The pod in which this EphemeralVolumeSource is embedded will be the\n                                      owner of the PVC, i.e. the PVC will be deleted together with the\n                                      pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                      `<volume name>` is the name from the `PodSpec.Volumes` array\n                                      entry. Pod validation will reject the pod if the concatenated name\n                                      is not valid for a PVC (for example, too long).\n\n\n                                      An existing PVC with that name that is not owned by the pod\n                                      will *not* be used for the pod to avoid using an unrelated\n                                      volume by mistake. Starting the pod is then blocked until\n                                      the unrelated PVC is removed. If such a pre-created PVC is\n                                      meant to be used by the pod, the PVC has to updated with an\n                                      owner reference to the pod once the pod exists. Normally\n                                      this should not be necessary, but it may be useful when\n                                      manually reconstructing a broken cluster.\n\n\n                                      This field is read-only and no changes will be made by Kubernetes\n                                      to the PVC after it has been created.\n\n\n                                      Required, must not be nil.\n                                    properties:\n                                      metadata:\n                                        description: |-\n                                          May contain labels and annotations that will be copied into the PVC\n                                          when creating it. No other fields are allowed and will be rejected during\n                                          validation.\n                                        properties:\n                                          annotations:\n                                            additionalProperties:\n                                              type: string\n                                            type: object\n                                          finalizers:\n                                            items:\n                                              type: string\n                                            type: array\n                                          labels:\n                                            additionalProperties:\n                                              type: string\n                                            type: object\n                                          name:\n                                            type: string\n                                          namespace:\n                                            type: string\n                                        type: object\n                                      spec:\n                                        description: |-\n                                          The specification for the PersistentVolumeClaim. The entire content is\n                                          copied unchanged into the PVC that gets created from this\n                                          template. The same fields as in a PersistentVolumeClaim\n                                          are also valid here.\n                                        properties:\n                                          accessModes:\n                                            description: |-\n                                              accessModes contains the desired access modes the volume should have.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                            items:\n                                              type: string\n                                            type: array\n                                          dataSource:\n                                            description: |-\n                                              dataSource field can be used to specify either:\n                                              * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                              * An existing PVC (PersistentVolumeClaim)\n                                              If the provisioner or an external controller can support the specified data source,\n                                              it will create a new volume based on the contents of the specified data source.\n                                              When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                              and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                              If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                            properties:\n                                              apiGroup:\n                                                description: |-\n                                                  APIGroup is the group for the resource being referenced.\n                                                  If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                  For any other third-party types, APIGroup is required.\n                                                type: string\n                                              kind:\n                                                description: Kind is the type of resource\n                                                  being referenced\n                                                type: string\n                                              name:\n                                                description: Name is the name of resource\n                                                  being referenced\n                                                type: string\n                                            required:\n                                            - kind\n                                            - name\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          dataSourceRef:\n                                            description: |-\n                                              dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                              volume is desired. This may be any object from a non-empty API group (non\n                                              core object) or a PersistentVolumeClaim object.\n                                              When this field is specified, volume binding will only succeed if the type of\n                                              the specified object matches some installed volume populator or dynamic\n                                              provisioner.\n                                              This field will replace the functionality of the dataSource field and as such\n                                              if both fields are non-empty, they must have the same value. For backwards\n                                              compatibility, when namespace isn't specified in dataSourceRef,\n                                              both fields (dataSource and dataSourceRef) will be set to the same\n                                              value automatically if one of them is empty and the other is non-empty.\n                                              When namespace is specified in dataSourceRef,\n                                              dataSource isn't set to the same value and must be empty.\n                                              There are three important differences between dataSource and dataSourceRef:\n                                              * While dataSource only allows two specific types of objects, dataSourceRef\n                                                allows any non-core object, as well as PersistentVolumeClaim objects.\n                                              * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                                preserves all values, and generates an error if a disallowed value is\n                                                specified.\n                                              * While dataSource only allows local objects, dataSourceRef allows objects\n                                                in any namespaces.\n                                              (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                              (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                            properties:\n                                              apiGroup:\n                                                description: |-\n                                                  APIGroup is the group for the resource being referenced.\n                                                  If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                  For any other third-party types, APIGroup is required.\n                                                type: string\n                                              kind:\n                                                description: Kind is the type of resource\n                                                  being referenced\n                                                type: string\n                                              name:\n                                                description: Name is the name of resource\n                                                  being referenced\n                                                type: string\n                                              namespace:\n                                                description: |-\n                                                  Namespace is the namespace of resource being referenced\n                                                  Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                                  (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                                type: string\n                                            required:\n                                            - kind\n                                            - name\n                                            type: object\n                                          resources:\n                                            description: |-\n                                              resources represents the minimum resources the volume should have.\n                                              If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                              that are lower than previous value but must still be higher than capacity recorded in the\n                                              status field of the claim.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                            properties:\n                                              limits:\n                                                additionalProperties:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                description: |-\n                                                  Limits describes the maximum amount of compute resources allowed.\n                                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                type: object\n                                              requests:\n                                                additionalProperties:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                description: |-\n                                                  Requests describes the minimum amount of compute resources required.\n                                                  If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                  otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                type: object\n                                            type: object\n                                          selector:\n                                            description: selector is a label query\n                                              over volumes to consider for binding.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          storageClassName:\n                                            description: |-\n                                              storageClassName is the name of the StorageClass required by the claim.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                            type: string\n                                          volumeAttributesClassName:\n                                            description: |-\n                                              volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                              If specified, the CSI driver will create or update the volume with the attributes defined\n                                              in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                              it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                              will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                              If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                              will be set by the persistentvolume controller if it exists.\n                                              If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                              set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                              exists.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                              (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                            type: string\n                                          volumeMode:\n                                            description: |-\n                                              volumeMode defines what type of volume is required by the claim.\n                                              Value of Filesystem is implied when not included in claim spec.\n                                            type: string\n                                          volumeName:\n                                            description: volumeName is the binding\n                                              reference to the PersistentVolume backing\n                                              this claim.\n                                            type: string\n                                        type: object\n                                    required:\n                                    - spec\n                                    type: object\n                                type: object\n                              fc:\n                                description: fc represents a Fibre Channel resource\n                                  that is attached to a kubelet's host machine and\n                                  then exposed to the pod.\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  lun:\n                                    description: 'lun is Optional: FC target lun number'\n                                    format: int32\n                                    type: integer\n                                  readOnly:\n                                    description: |-\n                                      readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  targetWWNs:\n                                    description: 'targetWWNs is Optional: FC target\n                                      worldwide names (WWNs)'\n                                    items:\n                                      type: string\n                                    type: array\n                                  wwids:\n                                    description: |-\n                                      wwids Optional: FC volume world wide identifiers (wwids)\n                                      Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                    items:\n                                      type: string\n                                    type: array\n                                type: object\n                              flexVolume:\n                                description: |-\n                                  flexVolume represents a generic volume resource that is\n                                  provisioned/attached using an exec based plugin.\n                                properties:\n                                  driver:\n                                    description: driver is the name of the driver\n                                      to use for this volume.\n                                    type: string\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                    type: string\n                                  options:\n                                    additionalProperties:\n                                      type: string\n                                    description: 'options is Optional: this field\n                                      holds extra command options if any.'\n                                    type: object\n                                  readOnly:\n                                    description: |-\n                                      readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef is Optional: secretRef is reference to the secret object containing\n                                      sensitive information to pass to the plugin scripts. This may be\n                                      empty if no secret object is specified. If the secret object\n                                      contains more than one secret, all secrets are passed to the plugin\n                                      scripts.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                required:\n                                - driver\n                                type: object\n                              flocker:\n                                description: flocker represents a Flocker volume attached\n                                  to a kubelet's host machine. This depends on the\n                                  Flocker control service being running\n                                properties:\n                                  datasetName:\n                                    description: |-\n                                      datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                      should be considered as deprecated\n                                    type: string\n                                  datasetUUID:\n                                    description: datasetUUID is the UUID of the dataset.\n                                      This is unique identifier of a Flocker dataset\n                                    type: string\n                                type: object\n                              gcePersistentDisk:\n                                description: |-\n                                  gcePersistentDisk represents a GCE Disk resource that is attached to a\n                                  kubelet's host machine and then exposed to the pod.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  partition:\n                                    description: |-\n                                      partition is the partition in the volume that you want to mount.\n                                      If omitted, the default is to mount by volume name.\n                                      Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                      Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    format: int32\n                                    type: integer\n                                  pdName:\n                                    description: |-\n                                      pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the ReadOnly setting in VolumeMounts.\n                                      Defaults to false.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    type: boolean\n                                required:\n                                - pdName\n                                type: object\n                              gitRepo:\n                                description: |-\n                                  gitRepo represents a git repository at a particular revision.\n                                  DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                                  EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                                  into the Pod's container.\n                                properties:\n                                  directory:\n                                    description: |-\n                                      directory is the target directory name.\n                                      Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                      git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                      the subdirectory with the given name.\n                                    type: string\n                                  repository:\n                                    description: repository is the URL\n                                    type: string\n                                  revision:\n                                    description: revision is the commit hash for the\n                                      specified revision.\n                                    type: string\n                                required:\n                                - repository\n                                type: object\n                              glusterfs:\n                                description: |-\n                                  glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                                properties:\n                                  endpoints:\n                                    description: |-\n                                      endpoints is the endpoint name that details Glusterfs topology.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                    type: string\n                                  path:\n                                    description: |-\n                                      path is the Glusterfs volume path.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                      Defaults to false.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                    type: boolean\n                                required:\n                                - endpoints\n                                - path\n                                type: object\n                              hostPath:\n                                description: |-\n                                  hostPath represents a pre-existing file or directory on the host\n                                  machine that is directly exposed to the container. This is generally\n                                  used for system agents or other privileged things that are allowed\n                                  to see the host machine. Most containers will NOT need this.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                  ---\n                                  TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                                  mount host directories as read/write.\n                                properties:\n                                  path:\n                                    description: |-\n                                      path of the directory on the host.\n                                      If the path is a symlink, it will follow the link to the real path.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                    type: string\n                                  type:\n                                    description: |-\n                                      type for HostPath Volume\n                                      Defaults to \"\"\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                    type: string\n                                required:\n                                - path\n                                type: object\n                              iscsi:\n                                description: |-\n                                  iscsi represents an ISCSI Disk resource that is attached to a\n                                  kubelet's host machine and then exposed to the pod.\n                                  More info: https://examples.k8s.io/volumes/iscsi/README.md\n                                properties:\n                                  chapAuthDiscovery:\n                                    description: chapAuthDiscovery defines whether\n                                      support iSCSI Discovery CHAP authentication\n                                    type: boolean\n                                  chapAuthSession:\n                                    description: chapAuthSession defines whether support\n                                      iSCSI Session CHAP authentication\n                                    type: boolean\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  initiatorName:\n                                    description: |-\n                                      initiatorName is the custom iSCSI Initiator Name.\n                                      If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                      <target portal>:<volume name> will be created for the connection.\n                                    type: string\n                                  iqn:\n                                    description: iqn is the target iSCSI Qualified\n                                      Name.\n                                    type: string\n                                  iscsiInterface:\n                                    description: |-\n                                      iscsiInterface is the interface Name that uses an iSCSI transport.\n                                      Defaults to 'default' (tcp).\n                                    type: string\n                                  lun:\n                                    description: lun represents iSCSI Target Lun number.\n                                    format: int32\n                                    type: integer\n                                  portals:\n                                    description: |-\n                                      portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                      is other than default (typically TCP ports 860 and 3260).\n                                    items:\n                                      type: string\n                                    type: array\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the ReadOnly setting in VolumeMounts.\n                                      Defaults to false.\n                                    type: boolean\n                                  secretRef:\n                                    description: secretRef is the CHAP Secret for\n                                      iSCSI target and initiator authentication\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  targetPortal:\n                                    description: |-\n                                      targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                      is other than default (typically TCP ports 860 and 3260).\n                                    type: string\n                                required:\n                                - iqn\n                                - lun\n                                - targetPortal\n                                type: object\n                              name:\n                                description: |-\n                                  name of the volume.\n                                  Must be a DNS_LABEL and unique within the pod.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                type: string\n                              nfs:\n                                description: |-\n                                  nfs represents an NFS mount on the host that shares a pod's lifetime\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                properties:\n                                  path:\n                                    description: |-\n                                      path that is exported by the NFS server.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the NFS export to be mounted with read-only permissions.\n                                      Defaults to false.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    type: boolean\n                                  server:\n                                    description: |-\n                                      server is the hostname or IP address of the NFS server.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    type: string\n                                required:\n                                - path\n                                - server\n                                type: object\n                              persistentVolumeClaim:\n                                description: |-\n                                  persistentVolumeClaimVolumeSource represents a reference to a\n                                  PersistentVolumeClaim in the same namespace.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                properties:\n                                  claimName:\n                                    description: |-\n                                      claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly Will force the ReadOnly setting in VolumeMounts.\n                                      Default false.\n                                    type: boolean\n                                required:\n                                - claimName\n                                type: object\n                              photonPersistentDisk:\n                                description: photonPersistentDisk represents a PhotonController\n                                  persistent disk attached and mounted on kubelets\n                                  host machine\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  pdID:\n                                    description: pdID is the ID that identifies Photon\n                                      Controller persistent disk\n                                    type: string\n                                required:\n                                - pdID\n                                type: object\n                              portworxVolume:\n                                description: portworxVolume represents a portworx\n                                  volume attached and mounted on kubelets host machine\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fSType represents the filesystem type to mount\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  volumeID:\n                                    description: volumeID uniquely identifies a Portworx\n                                      volume\n                                    type: string\n                                required:\n                                - volumeID\n                                type: object\n                              projected:\n                                description: projected items for all in one resources\n                                  secrets, configmaps, and downward API\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode are the mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  sources:\n                                    description: sources is the list of volume projections\n                                    items:\n                                      description: Projection that may be projected\n                                        along with other supported volume types\n                                      properties:\n                                        clusterTrustBundle:\n                                          description: |-\n                                            ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                            of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                            Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                            ClusterTrustBundle objects can either be selected by name, or by the\n                                            combination of signer name and a label selector.\n\n\n                                            Kubelet performs aggressive normalization of the PEM contents written\n                                            into the pod filesystem.  Esoteric PEM features such as inter-block\n                                            comments and block headers are stripped.  Certificates are deduplicated.\n                                            The ordering of certificates within the file is arbitrary, and Kubelet\n                                            may change the order over time.\n                                          properties:\n                                            labelSelector:\n                                              description: |-\n                                                Select all ClusterTrustBundles that match this label selector.  Only has\n                                                effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                                interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                                everything\".\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            name:\n                                              description: |-\n                                                Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                                with signerName and labelSelector.\n                                              type: string\n                                            optional:\n                                              description: |-\n                                                If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                                aren't available.  If using name, then the named ClusterTrustBundle is\n                                                allowed not to exist.  If using signerName, then the combination of\n                                                signerName and labelSelector is allowed to match zero\n                                                ClusterTrustBundles.\n                                              type: boolean\n                                            path:\n                                              description: Relative path from the\n                                                volume root to write the bundle.\n                                              type: string\n                                            signerName:\n                                              description: |-\n                                                Select all ClusterTrustBundles that match this signer name.\n                                                Mutually-exclusive with name.  The contents of all selected\n                                                ClusterTrustBundles will be unified and deduplicated.\n                                              type: string\n                                          required:\n                                          - path\n                                          type: object\n                                        configMap:\n                                          description: configMap information about\n                                            the configMap data to project\n                                          properties:\n                                            items:\n                                              description: |-\n                                                items if unspecified, each key-value pair in the Data field of the referenced\n                                                ConfigMap will be projected into the volume as a file whose name is the\n                                                key and content is the value. If specified, the listed keys will be\n                                                projected into the specified paths, and unlisted keys will not be\n                                                present. If a key is specified which is not present in the ConfigMap,\n                                                the volume setup will error unless it is marked optional. Paths must be\n                                                relative and may not contain the '..' path or start with '..'.\n                                              items:\n                                                description: Maps a string key to\n                                                  a path within a volume.\n                                                properties:\n                                                  key:\n                                                    description: key is the key to\n                                                      project.\n                                                    type: string\n                                                  mode:\n                                                    description: |-\n                                                      mode is Optional: mode bits used to set permissions on this file.\n                                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                      If not specified, the volume defaultMode will be used.\n                                                      This might be in conflict with other options that affect the file\n                                                      mode, like fsGroup, and the result can be other mode bits set.\n                                                    format: int32\n                                                    type: integer\n                                                  path:\n                                                    description: |-\n                                                      path is the relative path of the file to map the key to.\n                                                      May not be an absolute path.\n                                                      May not contain the path element '..'.\n                                                      May not start with the string '..'.\n                                                    type: string\n                                                required:\n                                                - key\n                                                - path\n                                                type: object\n                                              type: array\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: optional specify whether\n                                                the ConfigMap or its keys must be\n                                                defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        downwardAPI:\n                                          description: downwardAPI information about\n                                            the downwardAPI data to project\n                                          properties:\n                                            items:\n                                              description: Items is a list of DownwardAPIVolume\n                                                file\n                                              items:\n                                                description: DownwardAPIVolumeFile\n                                                  represents information to create\n                                                  the file containing the pod field\n                                                properties:\n                                                  fieldRef:\n                                                    description: 'Required: Selects\n                                                      a field of the pod: only annotations,\n                                                      labels, name and namespace are\n                                                      supported.'\n                                                    properties:\n                                                      apiVersion:\n                                                        description: Version of the\n                                                          schema the FieldPath is\n                                                          written in terms of, defaults\n                                                          to \"v1\".\n                                                        type: string\n                                                      fieldPath:\n                                                        description: Path of the field\n                                                          to select in the specified\n                                                          API version.\n                                                        type: string\n                                                    required:\n                                                    - fieldPath\n                                                    type: object\n                                                    x-kubernetes-map-type: atomic\n                                                  mode:\n                                                    description: |-\n                                                      Optional: mode bits used to set permissions on this file, must be an octal value\n                                                      between 0000 and 0777 or a decimal value between 0 and 511.\n                                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                      If not specified, the volume defaultMode will be used.\n                                                      This might be in conflict with other options that affect the file\n                                                      mode, like fsGroup, and the result can be other mode bits set.\n                                                    format: int32\n                                                    type: integer\n                                                  path:\n                                                    description: 'Required: Path is  the\n                                                      relative path name of the file\n                                                      to be created. Must not be absolute\n                                                      or contain the ''..'' path.\n                                                      Must be utf-8 encoded. The first\n                                                      item of the relative path must\n                                                      not start with ''..'''\n                                                    type: string\n                                                  resourceFieldRef:\n                                                    description: |-\n                                                      Selects a resource of the container: only resources limits and requests\n                                                      (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                    properties:\n                                                      containerName:\n                                                        description: 'Container name:\n                                                          required for volumes, optional\n                                                          for env vars'\n                                                        type: string\n                                                      divisor:\n                                                        anyOf:\n                                                        - type: integer\n                                                        - type: string\n                                                        description: Specifies the\n                                                          output format of the exposed\n                                                          resources, defaults to \"1\"\n                                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                        x-kubernetes-int-or-string: true\n                                                      resource:\n                                                        description: 'Required: resource\n                                                          to select'\n                                                        type: string\n                                                    required:\n                                                    - resource\n                                                    type: object\n                                                    x-kubernetes-map-type: atomic\n                                                required:\n                                                - path\n                                                type: object\n                                              type: array\n                                          type: object\n                                        secret:\n                                          description: secret information about the\n                                            secret data to project\n                                          properties:\n                                            items:\n                                              description: |-\n                                                items if unspecified, each key-value pair in the Data field of the referenced\n                                                Secret will be projected into the volume as a file whose name is the\n                                                key and content is the value. If specified, the listed keys will be\n                                                projected into the specified paths, and unlisted keys will not be\n                                                present. If a key is specified which is not present in the Secret,\n                                                the volume setup will error unless it is marked optional. Paths must be\n                                                relative and may not contain the '..' path or start with '..'.\n                                              items:\n                                                description: Maps a string key to\n                                                  a path within a volume.\n                                                properties:\n                                                  key:\n                                                    description: key is the key to\n                                                      project.\n                                                    type: string\n                                                  mode:\n                                                    description: |-\n                                                      mode is Optional: mode bits used to set permissions on this file.\n                                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                      If not specified, the volume defaultMode will be used.\n                                                      This might be in conflict with other options that affect the file\n                                                      mode, like fsGroup, and the result can be other mode bits set.\n                                                    format: int32\n                                                    type: integer\n                                                  path:\n                                                    description: |-\n                                                      path is the relative path of the file to map the key to.\n                                                      May not be an absolute path.\n                                                      May not contain the path element '..'.\n                                                      May not start with the string '..'.\n                                                    type: string\n                                                required:\n                                                - key\n                                                - path\n                                                type: object\n                                              type: array\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: optional field specify\n                                                whether the Secret or its key must\n                                                be defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        serviceAccountToken:\n                                          description: serviceAccountToken is information\n                                            about the serviceAccountToken data to\n                                            project\n                                          properties:\n                                            audience:\n                                              description: |-\n                                                audience is the intended audience of the token. A recipient of a token\n                                                must identify itself with an identifier specified in the audience of the\n                                                token, and otherwise should reject the token. The audience defaults to the\n                                                identifier of the apiserver.\n                                              type: string\n                                            expirationSeconds:\n                                              description: |-\n                                                expirationSeconds is the requested duration of validity of the service\n                                                account token. As the token approaches expiration, the kubelet volume\n                                                plugin will proactively rotate the service account token. The kubelet will\n                                                start trying to rotate the token if the token is older than 80 percent of\n                                                its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                                and must be at least 10 minutes.\n                                              format: int64\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the path relative to the mount point of the file to project the\n                                                token into.\n                                              type: string\n                                          required:\n                                          - path\n                                          type: object\n                                      type: object\n                                    type: array\n                                type: object\n                              quobyte:\n                                description: quobyte represents a Quobyte mount on\n                                  the host that shares a pod's lifetime\n                                properties:\n                                  group:\n                                    description: |-\n                                      group to map volume access to\n                                      Default is no group\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                      Defaults to false.\n                                    type: boolean\n                                  registry:\n                                    description: |-\n                                      registry represents a single or multiple Quobyte Registry services\n                                      specified as a string as host:port pair (multiple entries are separated with commas)\n                                      which acts as the central registry for volumes\n                                    type: string\n                                  tenant:\n                                    description: |-\n                                      tenant owning the given Quobyte volume in the Backend\n                                      Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                    type: string\n                                  user:\n                                    description: |-\n                                      user to map volume access to\n                                      Defaults to serivceaccount user\n                                    type: string\n                                  volume:\n                                    description: volume is a string that references\n                                      an already created Quobyte volume by name.\n                                    type: string\n                                required:\n                                - registry\n                                - volume\n                                type: object\n                              rbd:\n                                description: |-\n                                  rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  image:\n                                    description: |-\n                                      image is the rados image name.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                  keyring:\n                                    description: |-\n                                      keyring is the path to key ring for RBDUser.\n                                      Default is /etc/ceph/keyring.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                  monitors:\n                                    description: |-\n                                      monitors is a collection of Ceph monitors.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    items:\n                                      type: string\n                                    type: array\n                                  pool:\n                                    description: |-\n                                      pool is the rados pool name.\n                                      Default is rbd.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the ReadOnly setting in VolumeMounts.\n                                      Defaults to false.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef is name of the authentication secret for RBDUser. If provided\n                                      overrides keyring.\n                                      Default is nil.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  user:\n                                    description: |-\n                                      user is the rados user name.\n                                      Default is admin.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                required:\n                                - image\n                                - monitors\n                                type: object\n                              scaleIO:\n                                description: scaleIO represents a ScaleIO persistent\n                                  volume attached and mounted on Kubernetes nodes.\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                      Default is \"xfs\".\n                                    type: string\n                                  gateway:\n                                    description: gateway is the host address of the\n                                      ScaleIO API Gateway.\n                                    type: string\n                                  protectionDomain:\n                                    description: protectionDomain is the name of the\n                                      ScaleIO Protection Domain for the configured\n                                      storage.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef references to the secret for ScaleIO user and other\n                                      sensitive information. If this is not provided, Login operation will fail.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  sslEnabled:\n                                    description: sslEnabled Flag enable/disable SSL\n                                      communication with Gateway, default false\n                                    type: boolean\n                                  storageMode:\n                                    description: |-\n                                      storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                      Default is ThinProvisioned.\n                                    type: string\n                                  storagePool:\n                                    description: storagePool is the ScaleIO Storage\n                                      Pool associated with the protection domain.\n                                    type: string\n                                  system:\n                                    description: system is the name of the storage\n                                      system as configured in ScaleIO.\n                                    type: string\n                                  volumeName:\n                                    description: |-\n                                      volumeName is the name of a volume already created in the ScaleIO system\n                                      that is associated with this volume source.\n                                    type: string\n                                required:\n                                - gateway\n                                - secretRef\n                                - system\n                                type: object\n                              secret:\n                                description: |-\n                                  secret represents a secret that should populate this volume.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values\n                                      for mode bits. Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items If unspecified, each key-value pair in the Data field of the referenced\n                                      Secret will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the Secret,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  optional:\n                                    description: optional field specify whether the\n                                      Secret or its keys must be defined\n                                    type: boolean\n                                  secretName:\n                                    description: |-\n                                      secretName is the name of the secret in the pod's namespace to use.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                    type: string\n                                type: object\n                              storageos:\n                                description: storageOS represents a StorageOS volume\n                                  attached and mounted on Kubernetes nodes.\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef specifies the secret to use for obtaining the StorageOS API\n                                      credentials.  If not specified, default values will be attempted.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  volumeName:\n                                    description: |-\n                                      volumeName is the human-readable name of the StorageOS volume.  Volume\n                                      names are only unique within a namespace.\n                                    type: string\n                                  volumeNamespace:\n                                    description: |-\n                                      volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                      namespace is specified then the Pod's namespace will be used.  This allows the\n                                      Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                      Set VolumeName to any name to override the default behaviour.\n                                      Set to \"default\" if you are not using namespaces within StorageOS.\n                                      Namespaces that do not pre-exist within StorageOS will be created.\n                                    type: string\n                                type: object\n                              vsphereVolume:\n                                description: vsphereVolume represents a vSphere volume\n                                  attached and mounted on kubelets host machine\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  storagePolicyID:\n                                    description: storagePolicyID is the storage Policy\n                                      Based Management (SPBM) profile ID associated\n                                      with the StoragePolicyName.\n                                    type: string\n                                  storagePolicyName:\n                                    description: storagePolicyName is the storage\n                                      Policy Based Management (SPBM) profile name.\n                                    type: string\n                                  volumePath:\n                                    description: volumePath is the path that identifies\n                                      vSphere volume vmdk\n                                    type: string\n                                required:\n                                - volumePath\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                      required:\n                      - containers\n                      type: object\n                      x-kubernetes-preserve-unknown-fields: true\n                    postStartSpec:\n                      description: |-\n                        Defines the command to be executed when the component is ready, and the command will only be executed once after\n                        the component becomes ready.\n                      properties:\n                        cmdExecutorConfig:\n                          description: Specifies the  post-start command to be executed.\n                          properties:\n                            args:\n                              description: Additional parameters used in the execution\n                                of the command.\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: The command to be executed.\n                              items:\n                                type: string\n                              minItems: 1\n                              type: array\n                            env:\n                              description: A list of environment variables that will\n                                be injected into the command execution context.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-preserve-unknown-fields: true\n                            image:\n                              description: Specifies the image used to execute the\n                                command.\n                              type: string\n                          required:\n                          - command\n                          - image\n                          type: object\n                        scriptSpecSelectors:\n                          description: |-\n                            Used to select the script that need to be referenced.\n                            When defined, the scripts defined in scriptSpecs can be referenced within the CmdExecutorConfig.\n                          items:\n                            properties:\n                              name:\n                                description: Represents the name of the ScriptSpec\n                                  referent.\n                                maxLength: 63\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                      required:\n                      - cmdExecutorConfig\n                      type: object\n                    probes:\n                      description: Settings for health checks.\n                      properties:\n                        roleProbe:\n                          description: Specifies the probe used for checking the role\n                            of the component.\n                          properties:\n                            commands:\n                              description: Commands used to execute for probe.\n                              properties:\n                                queries:\n                                  description: Defines read checks that are executed\n                                    on the probe sidecar.\n                                  items:\n                                    type: string\n                                  type: array\n                                writes:\n                                  description: Defines write checks that are executed\n                                    on the probe sidecar.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              default: 3\n                              description: Minimum consecutive failures for the probe\n                                to be considered failed after having succeeded.\n                              format: int32\n                              minimum: 2\n                              type: integer\n                            periodSeconds:\n                              default: 1\n                              description: How often (in seconds) to perform the probe.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                            timeoutSeconds:\n                              default: 1\n                              description: Number of seconds after which the probe\n                                times out. Defaults to 1 second.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                          type: object\n                        roleProbeTimeoutAfterPodsReady:\n                          description: |-\n                            Defines the timeout (in seconds) for the role probe after all pods of the component are ready.\n                            The system will check if the application is available in the pod.\n                            If pods exceed the InitializationTimeoutSeconds time without a role label, this component will enter the\n                            Failed/Abnormal phase.\n\n\n                            Note that this configuration will only take effect if the component supports RoleProbe\n                            and will not affect the life cycle of the pod. default values are 60 seconds.\n                          format: int32\n                          minimum: 30\n                          type: integer\n                        runningProbe:\n                          description: Specifies the probe used for checking the running\n                            status of the component.\n                          properties:\n                            commands:\n                              description: Commands used to execute for probe.\n                              properties:\n                                queries:\n                                  description: Defines read checks that are executed\n                                    on the probe sidecar.\n                                  items:\n                                    type: string\n                                  type: array\n                                writes:\n                                  description: Defines write checks that are executed\n                                    on the probe sidecar.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              default: 3\n                              description: Minimum consecutive failures for the probe\n                                to be considered failed after having succeeded.\n                              format: int32\n                              minimum: 2\n                              type: integer\n                            periodSeconds:\n                              default: 1\n                              description: How often (in seconds) to perform the probe.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                            timeoutSeconds:\n                              default: 1\n                              description: Number of seconds after which the probe\n                                times out. Defaults to 1 second.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                          type: object\n                        statusProbe:\n                          description: Specifies the probe used for checking the status\n                            of the component.\n                          properties:\n                            commands:\n                              description: Commands used to execute for probe.\n                              properties:\n                                queries:\n                                  description: Defines read checks that are executed\n                                    on the probe sidecar.\n                                  items:\n                                    type: string\n                                  type: array\n                                writes:\n                                  description: Defines write checks that are executed\n                                    on the probe sidecar.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              default: 3\n                              description: Minimum consecutive failures for the probe\n                                to be considered failed after having succeeded.\n                              format: int32\n                              minimum: 2\n                              type: integer\n                            periodSeconds:\n                              default: 1\n                              description: How often (in seconds) to perform the probe.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                            timeoutSeconds:\n                              default: 1\n                              description: Number of seconds after which the probe\n                                times out. Defaults to 1 second.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                          type: object\n                      type: object\n                    replicationSpec:\n                      description: Defines spec for `Replication` workloads.\n                      properties:\n                        llPodManagementPolicy:\n                          description: |-\n                            Controls the creation of pods during initial scale up, replacement of pods on nodes, and scaling down.\n\n\n                            - `OrderedReady`: Creates pods in increasing order (pod-0, then pod-1, etc). The controller waits until each pod\n                            is ready before continuing. Pods are removed in reverse order when scaling down.\n                            - `Parallel`: Creates pods in parallel to match the desired scale without waiting. All pods are deleted at once\n                            when scaling down.\n                          type: string\n                        llUpdateStrategy:\n                          description: |-\n                            Specifies the low-level StatefulSetUpdateStrategy to be used when updating Pods in the StatefulSet upon a\n                            revision to the Template.\n                            `UpdateStrategy` will be ignored if this is provided.\n                          properties:\n                            rollingUpdate:\n                              description: RollingUpdate is used to communicate parameters\n                                when Type is RollingUpdateStatefulSetStrategyType.\n                              properties:\n                                maxUnavailable:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    The maximum number of pods that can be unavailable during the update.\n                                    Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).\n                                    Absolute number is calculated from percentage by rounding up. This can not be 0.\n                                    Defaults to 1. This field is alpha-level and is only honored by servers that enable the\n                                    MaxUnavailableStatefulSet feature. The field applies to all pods in the range 0 to\n                                    Replicas-1. That means if there is any unavailable pod in the range 0 to Replicas-1, it\n                                    will be counted towards MaxUnavailable.\n                                  x-kubernetes-int-or-string: true\n                                partition:\n                                  description: |-\n                                    Partition indicates the ordinal at which the StatefulSet should be partitioned\n                                    for updates. During a rolling update, all pods from ordinal Replicas-1 to\n                                    Partition are updated. All pods from ordinal Partition-1 to 0 remain untouched.\n                                    This is helpful in being able to do a canary based deployment. The default value is 0.\n                                  format: int32\n                                  type: integer\n                              type: object\n                            type:\n                              description: |-\n                                Type indicates the type of the StatefulSetUpdateStrategy.\n                                Default is RollingUpdate.\n                              type: string\n                          type: object\n                        updateStrategy:\n                          default: Serial\n                          description: |-\n                            Specifies the strategy for updating Pods.\n                            For workloadType=`Consensus`, the update strategy can be one of the following:\n\n\n                            - `Serial`: Updates Members sequentially to minimize component downtime.\n                            - `BestEffortParallel`: Updates Members in parallel to minimize component write downtime. Majority remains online\n                            at all times.\n                            - `Parallel`: Forces parallel updates.\n                          enum:\n                          - Serial\n                          - BestEffortParallel\n                          - Parallel\n                          type: string\n                      type: object\n                    rsmSpec:\n                      description: |-\n                        Defines workload spec of this component.\n                        From KB 0.7.0, RSM(InstanceSetSpec) will be the underlying CR which powers all kinds of workload in KB.\n                        RSM is an enhanced stateful workload extension dedicated for heavy-state workloads like databases.\n                      properties:\n                        memberUpdateStrategy:\n                          description: |-\n                            Describes the strategy for updating Members (Pods).\n\n\n                            - `Serial`: Updates Members sequentially to ensure minimum component downtime.\n                            - `BestEffortParallel`: Updates Members in parallel to ensure minimum component write downtime.\n                            - `Parallel`: Forces parallel updates.\n                          enum:\n                          - Serial\n                          - BestEffortParallel\n                          - Parallel\n                          type: string\n                        membershipReconfiguration:\n                          description: Indicates the actions required for dynamic\n                            membership reconfiguration.\n                          properties:\n                            logSyncAction:\n                              description: |-\n                                Defines the action to trigger the new member to start log syncing.\n                                If the Image is not configured, the Image from the previous non-nil action will be used.\n                              properties:\n                                args:\n                                  description: Additional parameters used to perform\n                                    specific statements. This field is optional.\n                                  items:\n                                    type: string\n                                  type: array\n                                command:\n                                  description: A set of instructions that will be\n                                    executed within the Container to retrieve or process\n                                    role information. This field is required.\n                                  items:\n                                    type: string\n                                  type: array\n                                image:\n                                  description: Refers to the utility image that contains\n                                    the command which can be utilized to retrieve\n                                    or process role information.\n                                  type: string\n                              required:\n                              - command\n                              type: object\n                            memberJoinAction:\n                              description: |-\n                                Defines the action to add a member.\n                                If the Image is not configured, the Image from the previous non-nil action will be used.\n                              properties:\n                                args:\n                                  description: Additional parameters used to perform\n                                    specific statements. This field is optional.\n                                  items:\n                                    type: string\n                                  type: array\n                                command:\n                                  description: A set of instructions that will be\n                                    executed within the Container to retrieve or process\n                                    role information. This field is required.\n                                  items:\n                                    type: string\n                                  type: array\n                                image:\n                                  description: Refers to the utility image that contains\n                                    the command which can be utilized to retrieve\n                                    or process role information.\n                                  type: string\n                              required:\n                              - command\n                              type: object\n                            memberLeaveAction:\n                              description: |-\n                                Defines the action to remove a member.\n                                If the Image is not configured, the Image from the previous non-nil action will be used.\n                              properties:\n                                args:\n                                  description: Additional parameters used to perform\n                                    specific statements. This field is optional.\n                                  items:\n                                    type: string\n                                  type: array\n                                command:\n                                  description: A set of instructions that will be\n                                    executed within the Container to retrieve or process\n                                    role information. This field is required.\n                                  items:\n                                    type: string\n                                  type: array\n                                image:\n                                  description: Refers to the utility image that contains\n                                    the command which can be utilized to retrieve\n                                    or process role information.\n                                  type: string\n                              required:\n                              - command\n                              type: object\n                            promoteAction:\n                              description: |-\n                                Defines the action to inform the cluster that the new member can join voting now.\n                                If the Image is not configured, the Image from the previous non-nil action will be used.\n                              properties:\n                                args:\n                                  description: Additional parameters used to perform\n                                    specific statements. This field is optional.\n                                  items:\n                                    type: string\n                                  type: array\n                                command:\n                                  description: A set of instructions that will be\n                                    executed within the Container to retrieve or process\n                                    role information. This field is required.\n                                  items:\n                                    type: string\n                                  type: array\n                                image:\n                                  description: Refers to the utility image that contains\n                                    the command which can be utilized to retrieve\n                                    or process role information.\n                                  type: string\n                              required:\n                              - command\n                              type: object\n                            switchoverAction:\n                              description: |-\n                                Specifies the environment variables that can be used in all following Actions:\n                                - KB_ITS_USERNAME: Represents the username part of the credential\n                                - KB_ITS_PASSWORD: Represents the password part of the credential\n                                - KB_ITS_LEADER_HOST: Represents the leader host\n                                - KB_ITS_TARGET_HOST: Represents the target host\n                                - KB_ITS_SERVICE_PORT: Represents the service port\n\n\n                                Defines the action to perform a switchover.\n                                If the Image is not configured, the latest [BusyBox](https://busybox.net/) image will be used.\n                              properties:\n                                args:\n                                  description: Additional parameters used to perform\n                                    specific statements. This field is optional.\n                                  items:\n                                    type: string\n                                  type: array\n                                command:\n                                  description: A set of instructions that will be\n                                    executed within the Container to retrieve or process\n                                    role information. This field is required.\n                                  items:\n                                    type: string\n                                  type: array\n                                image:\n                                  description: Refers to the utility image that contains\n                                    the command which can be utilized to retrieve\n                                    or process role information.\n                                  type: string\n                              required:\n                              - command\n                              type: object\n                          type: object\n                        roleProbe:\n                          description: Defines the method used to probe a role.\n                          properties:\n                            builtinHandlerName:\n                              description: |-\n                                Specifies the builtin handler name to use to probe the role of the main container.\n                                Available handlers include: mysql, postgres, mongodb, redis, etcd, kafka.\n                                Use CustomHandler to define a custom role probe function if none of the built-in handlers meet the requirement.\n                              type: string\n                            customHandler:\n                              description: |-\n                                Defines a custom method for role probing.\n                                Actions defined here are executed in series.\n                                Upon completion of all actions, the final output should be a single string representing the role name defined in spec.Roles.\n                                The latest [BusyBox](https://busybox.net/) image will be used if Image is not configured.\n                                Environment variables can be used in Command:\n                                - v_KB_ITS_LAST_STDOUT: stdout from the last action, watch for 'v_' prefix\n                                - KB_ITS_USERNAME: username part of the credential\n                                - KB_ITS_PASSWORD: password part of the credential\n                              items:\n                                properties:\n                                  args:\n                                    description: Additional parameters used to perform\n                                      specific statements. This field is optional.\n                                    items:\n                                      type: string\n                                    type: array\n                                  command:\n                                    description: A set of instructions that will be\n                                      executed within the Container to retrieve or\n                                      process role information. This field is required.\n                                    items:\n                                      type: string\n                                    type: array\n                                  image:\n                                    description: Refers to the utility image that\n                                      contains the command which can be utilized to\n                                      retrieve or process role information.\n                                    type: string\n                                required:\n                                - command\n                                type: object\n                              type: array\n                            failureThreshold:\n                              default: 3\n                              description: Specifies the minimum number of consecutive\n                                failures for the probe to be considered failed after\n                                having succeeded.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                            initialDelaySeconds:\n                              default: 0\n                              description: Specifies the number of seconds to wait\n                                after the container has started before initiating\n                                role probing.\n                              format: int32\n                              minimum: 0\n                              type: integer\n                            periodSeconds:\n                              default: 2\n                              description: Specifies the frequency (in seconds) of\n                                probe execution.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                            roleUpdateMechanism:\n                              default: ReadinessProbeEventUpdate\n                              description: Specifies the method for updating the pod\n                                role label.\n                              enum:\n                              - ReadinessProbeEventUpdate\n                              - DirectAPIServerEventUpdate\n                              type: string\n                            successThreshold:\n                              default: 1\n                              description: Specifies the minimum number of consecutive\n                                successes for the probe to be considered successful\n                                after having failed.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                            timeoutSeconds:\n                              default: 1\n                              description: Specifies the number of seconds after which\n                                the probe times out.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                          type: object\n                        roles:\n                          description: Specifies a list of roles defined within the\n                            system.\n                          items:\n                            properties:\n                              accessMode:\n                                default: ReadWrite\n                                description: Specifies the service capabilities of\n                                  this member.\n                                enum:\n                                - None\n                                - Readonly\n                                - ReadWrite\n                                type: string\n                              canVote:\n                                default: true\n                                description: Indicates if this member has voting rights.\n                                type: boolean\n                              isLeader:\n                                default: false\n                                description: Determines if this member is the leader.\n                                type: boolean\n                              name:\n                                default: leader\n                                description: Defines the role name of the replica.\n                                type: string\n                            required:\n                            - accessMode\n                            - name\n                            type: object\n                          type: array\n                      type: object\n                    scriptSpecs:\n                      description: Defines the template of scripts.\n                      items:\n                        properties:\n                          defaultMode:\n                            description: |-\n                              The operator attempts to set default file permissions for scripts (0555) and configurations (0444).\n                              However, certain database engines may require different file permissions.\n                              You can specify the desired file permissions here.\n\n\n                              Must be specified as an octal value between 0000 and 0777 (inclusive),\n                              or as a decimal value between 0 and 511 (inclusive).\n                              YAML supports both octal and decimal values for file permissions.\n\n\n                              Please note that this setting only affects the permissions of the files themselves.\n                              Directories within the specified path are not impacted by this setting.\n                              It's important to be aware that this setting might conflict with other options\n                              that influence the file mode, such as fsGroup.\n                              In such cases, the resulting file mode may have additional bits set.\n                              Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                            format: int32\n                            type: integer\n                          name:\n                            description: Specifies the name of the configuration template.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          namespace:\n                            default: default\n                            description: |-\n                              Specifies the namespace of the referenced configuration template ConfigMap object.\n                              An empty namespace is equivalent to the \"default\" namespace.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                          templateRef:\n                            description: Specifies the name of the referenced configuration\n                              template ConfigMap object.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          volumeName:\n                            description: |-\n                              Refers to the volume name of PodTemplate. The configuration file produced through the configuration\n                              template will be mounted to the corresponding volume. Must be a DNS_LABEL name.\n                              The volume name must be defined in podSpec.containers[*].volumeMounts.\n                            maxLength: 63\n                            pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    service:\n                      description: Defines the service spec.\n                      properties:\n                        ports:\n                          description: |-\n                            The list of ports that are exposed by this service.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            description: ServicePort is deprecated since v0.8.\n                            properties:\n                              appProtocol:\n                                description: |-\n                                  The application protocol for this port.\n                                  This field follows standard Kubernetes label syntax.\n                                  Un-prefixed names are reserved for IANA standard service names (as per\n                                  RFC-6335 and https://www.iana.org/assignments/service-names).\n                                  Non-standard protocols should use prefixed names such as\n                                  mycompany.com/my-custom-protocol.\n                                type: string\n                              name:\n                                description: |-\n                                  The name of this port within the service. This must be a DNS_LABEL.\n                                  All ports within a ServiceSpec must have unique names. When considering\n                                  the endpoints for a Service, this must match the 'name' field in the\n                                  EndpointPort.\n                                type: string\n                              port:\n                                description: The port that will be exposed by this\n                                  service.\n                                format: int32\n                                type: integer\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\".\n                                  Default is TCP.\n                                enum:\n                                - TCP\n                                - UDP\n                                - SCTP\n                                type: string\n                              targetPort:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Number or name of the port to access on the pods targeted by the service.\n\n\n                                  Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.\n\n\n                                  - If this is a string, it will be looked up as a named port in the target Pod's container ports.\n                                  - If this is not specified, the value of the `port` field is used (an identity map).\n\n\n                                  This field is ignored for services with clusterIP=None, and should be\n                                  omitted or set equal to the `port` field.\n\n\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service\n                                x-kubernetes-int-or-string: true\n                            required:\n                            - port\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - port\n                          - protocol\n                          x-kubernetes-list-type: map\n                      type: object\n                    serviceRefDeclarations:\n                      description: Used to declare the service reference of the current\n                        component.\n                      items:\n                        description: |-\n                          ServiceRefDeclaration represents a reference to a service that can be either provided by a KubeBlocks Cluster\n                          or an external service.\n                          It acts as a placeholder for the actual service reference, which is determined later when a Cluster is created.\n\n\n                          The purpose of ServiceRefDeclaration is to declare a service dependency without specifying the concrete details\n                          of the service.\n                          It allows for flexibility and abstraction in defining service references within a Component.\n                          By using ServiceRefDeclaration, you can define service dependencies in a declarative manner, enabling loose coupling\n                          and easier management of service references across different components and clusters.\n\n\n                          Upon Cluster creation, the ServiceRefDeclaration is bound to an actual service through the ServiceRef field,\n                          effectively resolving and connecting to the specified service.\n                        properties:\n                          name:\n                            description: Specifies the name of the ServiceRefDeclaration.\n                            type: string\n                          optional:\n                            description: |-\n                              Specifies whether the service reference can be optional.\n\n\n                              For an optional service-ref, the component can still be created even if the service-ref is not provided.\n                            type: boolean\n                          serviceRefDeclarationSpecs:\n                            description: |-\n                              Defines a list of constraints and requirements for services that can be bound to this ServiceRefDeclaration\n                              upon Cluster creation.\n                              Each ServiceRefDeclarationSpec defines a ServiceKind and ServiceVersion,\n                              outlining the acceptable service types and versions that are compatible.\n\n\n                              This flexibility allows a ServiceRefDeclaration to be fulfilled by any one of the provided specs.\n                              For example, if it requires an OLTP database, specs for both MySQL and PostgreSQL are listed,\n                              either MySQL or PostgreSQL services can be used when binding.\n                            items:\n                              properties:\n                                serviceKind:\n                                  description: |-\n                                    Specifies the type or nature of the service. This should be a well-known application cluster type, such as\n                                    {mysql, redis, mongodb}.\n                                    The field is case-insensitive and supports abbreviations for some well-known databases.\n                                    For instance, both `zk` and `zookeeper` are considered as a ZooKeeper cluster, while `pg`, `postgres`, `postgresql`\n                                    are all recognized as a PostgreSQL cluster.\n                                  type: string\n                                serviceVersion:\n                                  description: |-\n                                    Defines the service version of the service reference. This is a regular expression that matches a version number pattern.\n                                    For instance, `^8.0.8$`, `8.0.\\d{1,2}$`, `^[v\\-]*?(\\d{1,2}\\.){0,3}\\d{1,2}$` are all valid patterns.\n                                  type: string\n                              required:\n                              - serviceKind\n                              - serviceVersion\n                              type: object\n                            type: array\n                        required:\n                        - name\n                        - serviceRefDeclarationSpecs\n                        type: object\n                      type: array\n                    statefulSpec:\n                      description: Defines spec for `Stateful` workloads.\n                      properties:\n                        llPodManagementPolicy:\n                          description: |-\n                            Controls the creation of pods during initial scale up, replacement of pods on nodes, and scaling down.\n\n\n                            - `OrderedReady`: Creates pods in increasing order (pod-0, then pod-1, etc). The controller waits until each pod\n                            is ready before continuing. Pods are removed in reverse order when scaling down.\n                            - `Parallel`: Creates pods in parallel to match the desired scale without waiting. All pods are deleted at once\n                            when scaling down.\n                          type: string\n                        llUpdateStrategy:\n                          description: |-\n                            Specifies the low-level StatefulSetUpdateStrategy to be used when updating Pods in the StatefulSet upon a\n                            revision to the Template.\n                            `UpdateStrategy` will be ignored if this is provided.\n                          properties:\n                            rollingUpdate:\n                              description: RollingUpdate is used to communicate parameters\n                                when Type is RollingUpdateStatefulSetStrategyType.\n                              properties:\n                                maxUnavailable:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    The maximum number of pods that can be unavailable during the update.\n                                    Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).\n                                    Absolute number is calculated from percentage by rounding up. This can not be 0.\n                                    Defaults to 1. This field is alpha-level and is only honored by servers that enable the\n                                    MaxUnavailableStatefulSet feature. The field applies to all pods in the range 0 to\n                                    Replicas-1. That means if there is any unavailable pod in the range 0 to Replicas-1, it\n                                    will be counted towards MaxUnavailable.\n                                  x-kubernetes-int-or-string: true\n                                partition:\n                                  description: |-\n                                    Partition indicates the ordinal at which the StatefulSet should be partitioned\n                                    for updates. During a rolling update, all pods from ordinal Replicas-1 to\n                                    Partition are updated. All pods from ordinal Partition-1 to 0 remain untouched.\n                                    This is helpful in being able to do a canary based deployment. The default value is 0.\n                                  format: int32\n                                  type: integer\n                              type: object\n                            type:\n                              description: |-\n                                Type indicates the type of the StatefulSetUpdateStrategy.\n                                Default is RollingUpdate.\n                              type: string\n                          type: object\n                        updateStrategy:\n                          default: Serial\n                          description: |-\n                            Specifies the strategy for updating Pods.\n                            For workloadType=`Consensus`, the update strategy can be one of the following:\n\n\n                            - `Serial`: Updates Members sequentially to minimize component downtime.\n                            - `BestEffortParallel`: Updates Members in parallel to minimize component write downtime. Majority remains online\n                            at all times.\n                            - `Parallel`: Forces parallel updates.\n                          enum:\n                          - Serial\n                          - BestEffortParallel\n                          - Parallel\n                          type: string\n                      type: object\n                    statelessSpec:\n                      description: Defines spec for `Stateless` workloads.\n                      properties:\n                        updateStrategy:\n                          description: Specifies the deployment strategy that will\n                            be used to replace existing pods with new ones.\n                          properties:\n                            rollingUpdate:\n                              description: |-\n                                Rolling update config params. Present only if DeploymentStrategyType =\n                                RollingUpdate.\n                                ---\n                                TODO: Update this to follow our convention for oneOf, whatever we decide it\n                                to be.\n                              properties:\n                                maxSurge:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    The maximum number of pods that can be scheduled above the desired number of\n                                    pods.\n                                    Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).\n                                    This can not be 0 if MaxUnavailable is 0.\n                                    Absolute number is calculated from percentage by rounding up.\n                                    Defaults to 25%.\n                                    Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when\n                                    the rolling update starts, such that the total number of old and new pods do not exceed\n                                    130% of desired pods. Once old pods have been killed,\n                                    new ReplicaSet can be scaled up further, ensuring that total number of pods running\n                                    at any time during the update is at most 130% of desired pods.\n                                  x-kubernetes-int-or-string: true\n                                maxUnavailable:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    The maximum number of pods that can be unavailable during the update.\n                                    Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).\n                                    Absolute number is calculated from percentage by rounding down.\n                                    This can not be 0 if MaxSurge is 0.\n                                    Defaults to 25%.\n                                    Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods\n                                    immediately when the rolling update starts. Once new pods are ready, old ReplicaSet\n                                    can be scaled down further, followed by scaling up the new ReplicaSet, ensuring\n                                    that the total number of pods available at all times during the update is at\n                                    least 70% of desired pods.\n                                  x-kubernetes-int-or-string: true\n                              type: object\n                            type:\n                              description: Type of deployment. Can be \"Recreate\" or\n                                \"RollingUpdate\". Default is RollingUpdate.\n                              type: string\n                          type: object\n                      type: object\n                    switchoverSpec:\n                      description: |-\n                        Defines command to do switchover.\n                        In particular, when workloadType=Replication, the command defined in switchoverSpec will only be executed under\n                        the condition of cluster.componentSpecs[x].SwitchPolicy.type=Noop.\n                      properties:\n                        withCandidate:\n                          description: Represents the action of switching over to\n                            a specified candidate primary or leader instance.\n                          properties:\n                            cmdExecutorConfig:\n                              description: Specifies the switchover command.\n                              properties:\n                                args:\n                                  description: Additional parameters used in the execution\n                                    of the command.\n                                  items:\n                                    type: string\n                                  type: array\n                                command:\n                                  description: The command to be executed.\n                                  items:\n                                    type: string\n                                  minItems: 1\n                                  type: array\n                                env:\n                                  description: A list of environment variables that\n                                    will be injected into the command execution context.\n                                  items:\n                                    description: EnvVar represents an environment\n                                      variable present in a Container.\n                                    properties:\n                                      name:\n                                        description: Name of the environment variable.\n                                          Must be a C_IDENTIFIER.\n                                        type: string\n                                      value:\n                                        description: |-\n                                          Variable references $(VAR_NAME) are expanded\n                                          using the previously defined environment variables in the container and\n                                          any service environment variables. If a variable cannot be resolved,\n                                          the reference in the input string will be unchanged. Double $$ are reduced\n                                          to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                          \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                          Escaped references will never be expanded, regardless of whether the variable\n                                          exists or not.\n                                          Defaults to \"\".\n                                        type: string\n                                      valueFrom:\n                                        description: Source for the environment variable's\n                                          value. Cannot be used if value is not empty.\n                                        properties:\n                                          configMapKeyRef:\n                                            description: Selects a key of a ConfigMap.\n                                            properties:\n                                              key:\n                                                description: The key to select.\n                                                type: string\n                                              name:\n                                                description: |-\n                                                  Name of the referent.\n                                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                                type: string\n                                              optional:\n                                                description: Specify whether the ConfigMap\n                                                  or its key must be defined\n                                                type: boolean\n                                            required:\n                                            - key\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          fieldRef:\n                                            description: |-\n                                              Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                              spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                            properties:\n                                              apiVersion:\n                                                description: Version of the schema\n                                                  the FieldPath is written in terms\n                                                  of, defaults to \"v1\".\n                                                type: string\n                                              fieldPath:\n                                                description: Path of the field to\n                                                  select in the specified API version.\n                                                type: string\n                                            required:\n                                            - fieldPath\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          resourceFieldRef:\n                                            description: |-\n                                              Selects a resource of the container: only resources limits and requests\n                                              (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                            properties:\n                                              containerName:\n                                                description: 'Container name: required\n                                                  for volumes, optional for env vars'\n                                                type: string\n                                              divisor:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: Specifies the output\n                                                  format of the exposed resources,\n                                                  defaults to \"1\"\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              resource:\n                                                description: 'Required: resource to\n                                                  select'\n                                                type: string\n                                            required:\n                                            - resource\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          secretKeyRef:\n                                            description: Selects a key of a secret\n                                              in the pod's namespace\n                                            properties:\n                                              key:\n                                                description: The key of the secret\n                                                  to select from.  Must be a valid\n                                                  secret key.\n                                                type: string\n                                              name:\n                                                description: |-\n                                                  Name of the referent.\n                                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                                type: string\n                                              optional:\n                                                description: Specify whether the Secret\n                                                  or its key must be defined\n                                                type: boolean\n                                            required:\n                                            - key\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                        type: object\n                                    required:\n                                    - name\n                                    type: object\n                                  type: array\n                                  x-kubernetes-preserve-unknown-fields: true\n                                image:\n                                  description: Specifies the image used to execute\n                                    the command.\n                                  type: string\n                              required:\n                              - command\n                              - image\n                              type: object\n                            scriptSpecSelectors:\n                              description: |-\n                                Used to select the script that need to be referenced.\n                                When defined, the scripts defined in scriptSpecs can be referenced within the SwitchoverAction.CmdExecutorConfig.\n                              items:\n                                properties:\n                                  name:\n                                    description: Represents the name of the ScriptSpec\n                                      referent.\n                                    maxLength: 63\n                                    pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                          required:\n                          - cmdExecutorConfig\n                          type: object\n                        withoutCandidate:\n                          description: Represents the action of switching over without\n                            specifying a candidate primary or leader instance.\n                          properties:\n                            cmdExecutorConfig:\n                              description: Specifies the switchover command.\n                              properties:\n                                args:\n                                  description: Additional parameters used in the execution\n                                    of the command.\n                                  items:\n                                    type: string\n                                  type: array\n                                command:\n                                  description: The command to be executed.\n                                  items:\n                                    type: string\n                                  minItems: 1\n                                  type: array\n                                env:\n                                  description: A list of environment variables that\n                                    will be injected into the command execution context.\n                                  items:\n                                    description: EnvVar represents an environment\n                                      variable present in a Container.\n                                    properties:\n                                      name:\n                                        description: Name of the environment variable.\n                                          Must be a C_IDENTIFIER.\n                                        type: string\n                                      value:\n                                        description: |-\n                                          Variable references $(VAR_NAME) are expanded\n                                          using the previously defined environment variables in the container and\n                                          any service environment variables. If a variable cannot be resolved,\n                                          the reference in the input string will be unchanged. Double $$ are reduced\n                                          to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                          \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                          Escaped references will never be expanded, regardless of whether the variable\n                                          exists or not.\n                                          Defaults to \"\".\n                                        type: string\n                                      valueFrom:\n                                        description: Source for the environment variable's\n                                          value. Cannot be used if value is not empty.\n                                        properties:\n                                          configMapKeyRef:\n                                            description: Selects a key of a ConfigMap.\n                                            properties:\n                                              key:\n                                                description: The key to select.\n                                                type: string\n                                              name:\n                                                description: |-\n                                                  Name of the referent.\n                                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                                type: string\n                                              optional:\n                                                description: Specify whether the ConfigMap\n                                                  or its key must be defined\n                                                type: boolean\n                                            required:\n                                            - key\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          fieldRef:\n                                            description: |-\n                                              Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                              spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                            properties:\n                                              apiVersion:\n                                                description: Version of the schema\n                                                  the FieldPath is written in terms\n                                                  of, defaults to \"v1\".\n                                                type: string\n                                              fieldPath:\n                                                description: Path of the field to\n                                                  select in the specified API version.\n                                                type: string\n                                            required:\n                                            - fieldPath\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          resourceFieldRef:\n                                            description: |-\n                                              Selects a resource of the container: only resources limits and requests\n                                              (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                            properties:\n                                              containerName:\n                                                description: 'Container name: required\n                                                  for volumes, optional for env vars'\n                                                type: string\n                                              divisor:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: Specifies the output\n                                                  format of the exposed resources,\n                                                  defaults to \"1\"\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              resource:\n                                                description: 'Required: resource to\n                                                  select'\n                                                type: string\n                                            required:\n                                            - resource\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          secretKeyRef:\n                                            description: Selects a key of a secret\n                                              in the pod's namespace\n                                            properties:\n                                              key:\n                                                description: The key of the secret\n                                                  to select from.  Must be a valid\n                                                  secret key.\n                                                type: string\n                                              name:\n                                                description: |-\n                                                  Name of the referent.\n                                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                                type: string\n                                              optional:\n                                                description: Specify whether the Secret\n                                                  or its key must be defined\n                                                type: boolean\n                                            required:\n                                            - key\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                        type: object\n                                    required:\n                                    - name\n                                    type: object\n                                  type: array\n                                  x-kubernetes-preserve-unknown-fields: true\n                                image:\n                                  description: Specifies the image used to execute\n                                    the command.\n                                  type: string\n                              required:\n                              - command\n                              - image\n                              type: object\n                            scriptSpecSelectors:\n                              description: |-\n                                Used to select the script that need to be referenced.\n                                When defined, the scripts defined in scriptSpecs can be referenced within the SwitchoverAction.CmdExecutorConfig.\n                              items:\n                                properties:\n                                  name:\n                                    description: Represents the name of the ScriptSpec\n                                      referent.\n                                    maxLength: 63\n                                    pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                          required:\n                          - cmdExecutorConfig\n                          type: object\n                      type: object\n                    systemAccounts:\n                      description: Defines system accounts needed to manage the component,\n                        and the statement to create them.\n                      properties:\n                        accounts:\n                          description: Defines the configuration settings for system\n                            accounts.\n                          items:\n                            description: |-\n                              SystemAccountConfig specifies how to create and delete system accounts.\n\n\n                              Deprecated since v0.9.\n                            properties:\n                              name:\n                                description: The unique identifier of a system account.\n                                enum:\n                                - kbadmin\n                                - kbdataprotection\n                                - kbprobe\n                                - kbmonitoring\n                                - kbreplicator\n                                type: string\n                              provisionPolicy:\n                                description: Outlines the strategy for creating the\n                                  account.\n                                properties:\n                                  scope:\n                                    default: AnyPods\n                                    description: Defines the scope within which the\n                                      account is provisioned.\n                                    type: string\n                                  secretRef:\n                                    description: The external secret to refer.\n                                    properties:\n                                      name:\n                                        description: The unique identifier of the\n                                          secret.\n                                        type: string\n                                      namespace:\n                                        description: The namespace where the secret\n                                          is located.\n                                        type: string\n                                    required:\n                                    - name\n                                    - namespace\n                                    type: object\n                                  statements:\n                                    description: The statement to provision an account.\n                                    properties:\n                                      creation:\n                                        description: Specifies the statement required\n                                          to create a new account with the necessary\n                                          privileges.\n                                        type: string\n                                      deletion:\n                                        description: |-\n                                          Defines the statement required to delete an existing account.\n                                          Typically used in conjunction with the creation statement to delete an account before recreating it.\n                                          For example, one might use a `drop user if exists` statement followed by a `create user` statement to ensure a fresh account.\n\n\n                                          Deprecated: This field is deprecated and the update statement should be used instead.\n                                        type: string\n                                      update:\n                                        description: Defines the statement required\n                                          to update the password of an existing account.\n                                        type: string\n                                    required:\n                                    - creation\n                                    type: object\n                                  type:\n                                    description: Specifies the method to provision\n                                      an account.\n                                    enum:\n                                    - CreateByStmt\n                                    - ReferToExisting\n                                    type: string\n                                required:\n                                - scope\n                                - type\n                                type: object\n                            required:\n                            - name\n                            - provisionPolicy\n                            type: object\n                          minItems: 1\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        cmdExecutorConfig:\n                          description: Configures how to obtain the client SDK and\n                            execute statements.\n                          properties:\n                            args:\n                              description: Additional parameters used in the execution\n                                of the command.\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: The command to be executed.\n                              items:\n                                type: string\n                              minItems: 1\n                              type: array\n                            env:\n                              description: A list of environment variables that will\n                                be injected into the command execution context.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-preserve-unknown-fields: true\n                            image:\n                              description: Specifies the image used to execute the\n                                command.\n                              type: string\n                          required:\n                          - command\n                          - image\n                          type: object\n                        passwordConfig:\n                          description: Defines the pattern used to generate passwords\n                            for system accounts.\n                          properties:\n                            length:\n                              default: 16\n                              description: The length of the password.\n                              format: int32\n                              maximum: 32\n                              minimum: 8\n                              type: integer\n                            letterCase:\n                              default: MixedCases\n                              description: The case of the letters in the password.\n                              enum:\n                              - LowerCases\n                              - UpperCases\n                              - MixedCases\n                              type: string\n                            numDigits:\n                              default: 4\n                              description: The number of digits in the password.\n                              format: int32\n                              maximum: 8\n                              minimum: 0\n                              type: integer\n                            numSymbols:\n                              default: 0\n                              description: The number of symbols in the password.\n                              format: int32\n                              maximum: 8\n                              minimum: 0\n                              type: integer\n                            seed:\n                              description: |-\n                                Seed to generate the account's password.\n                                Cannot be updated.\n                              type: string\n                          type: object\n                      required:\n                      - accounts\n                      - cmdExecutorConfig\n                      - passwordConfig\n                      type: object\n                    volumeProtectionSpec:\n                      description: Defines settings to do volume protect.\n                      properties:\n                        highWatermark:\n                          default: 90\n                          description: |-\n                            The high watermark threshold for volume space usage.\n                            If there is any specified volumes who's space usage is over the threshold, the pre-defined \"LOCK\" action\n                            will be triggered to degrade the service to protect volume from space exhaustion, such as to set the instance\n                            as read-only. And after that, if all volumes' space usage drops under the threshold later, the pre-defined\n                            \"UNLOCK\" action will be performed to recover the service normally.\n                          maximum: 100\n                          minimum: 0\n                          type: integer\n                        volumes:\n                          description: The Volumes to be protected.\n                          items:\n                            properties:\n                              highWatermark:\n                                description: |-\n                                  Defines the high watermark threshold for the volume, it will override the component level threshold.\n                                  If the value is invalid, it will be ignored and the component level threshold will be used.\n                                maximum: 100\n                                minimum: 0\n                                type: integer\n                              name:\n                                description: The Name of the volume to protect.\n                                type: string\n                            type: object\n                          type: array\n                      type: object\n                    volumeTypes:\n                      description: |-\n                        Used to describe the purpose of the volumes mapping the name of the VolumeMounts in the PodSpec.Container field,\n                        such as data volume, log volume, etc. When backing up the volume, the volume can be correctly backed up according\n                        to the volumeType.\n\n\n                        For example:\n\n\n                        - `name: data, type: data` means that the volume named `data` is used to store `data`.\n                        - `name: binlog, type: log` means that the volume named `binlog` is used to store `log`.\n\n\n                        NOTE: When volumeTypes is not defined, the backup function will not be supported, even if a persistent volume has\n                        been specified.\n                      items:\n                        description: VolumeTypeSpec is deprecated since v0.9, replaced\n                          with ComponentVolume.\n                        properties:\n                          name:\n                            description: Corresponds to the name of the VolumeMounts\n                              field in PodSpec.Container.\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          type:\n                            description: Type of data the volume will persistent.\n                            enum:\n                            - data\n                            - log\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    workloadType:\n                      description: |-\n                        Defines the type of the workload.\n\n\n                        - `Stateless` describes stateless applications.\n                        - `Stateful` describes common stateful applications.\n                        - `Consensus` describes applications based on consensus protocols, such as raft and paxos.\n                        - `Replication` describes applications based on the primary-secondary data replication protocol.\n                      enum:\n                      - Stateless\n                      - Stateful\n                      - Consensus\n                      - Replication\n                      type: string\n                  required:\n                  - name\n                  - workloadType\n                  type: object\n                  x-kubernetes-validations:\n                  - message: componentDefs.consensusSpec(deprecated) or componentDefs.rsmSpec(recommended)\n                      is required when componentDefs.workloadType is Consensus, and\n                      forbidden otherwise\n                    rule: 'has(self.workloadType) && self.workloadType == ''Consensus''\n                      ? (has(self.consensusSpec) || has(self.rsmSpec)) : !has(self.consensusSpec)'\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              connectionCredential:\n                additionalProperties:\n                  type: string\n                description: |-\n                  Connection credential template used for creating a connection credential secret for cluster objects.\n\n\n                  Built-in objects are:\n\n\n                  - `$(RANDOM_PASSWD)` random 8 characters.\n                  - `$(STRONG_RANDOM_PASSWD)` random 16 characters, with mixed cases, digits and symbols.\n                  - `$(UUID)` generate a random UUID v4 string.\n                  - `$(UUID_B64)` generate a random UUID v4 BASE64 encoded string.\n                  - `$(UUID_STR_B64)` generate a random UUID v4 string then BASE64 encoded.\n                  - `$(UUID_HEX)` generate a random UUID v4 HEX representation.\n                  - `$(HEADLESS_SVC_FQDN)` headless service FQDN placeholder, value pattern is `$(CLUSTER_NAME)-$(1ST_COMP_NAME)-headless.$(NAMESPACE).svc`,\n                     where 1ST_COMP_NAME is the 1st component that provide `ClusterDefinition.spec.componentDefs[].service` attribute;\n                  - `$(SVC_FQDN)` service FQDN placeholder, value pattern is `$(CLUSTER_NAME)-$(1ST_COMP_NAME).$(NAMESPACE).svc`,\n                     where 1ST_COMP_NAME is the 1st component that provide `ClusterDefinition.spec.componentDefs[].service` attribute;\n                  - `$(SVC_PORT_{PORT-NAME})` is ServicePort's port value with specified port name, i.e, a servicePort JSON struct:\n                     `{\"name\": \"mysql\", \"targetPort\": \"mysqlContainerPort\", \"port\": 3306}`, and `$(SVC_PORT_mysql)` in the\n                     connection credential value is 3306.\n\n\n                  Deprecated since v0.9.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                type: object\n              topologies:\n                description: Topologies defines all possible topologies within the\n                  cluster.\n                items:\n                  description: ClusterTopology represents the definition for a specific\n                    cluster topology.\n                  properties:\n                    components:\n                      description: Components specifies the components in the topology.\n                      items:\n                        description: ClusterTopologyComponent defines a Component\n                          within a ClusterTopology.\n                        properties:\n                          compDef:\n                            description: \"Specifies the exact name, name prefix, or\n                              regular expression pattern for matching the name of\n                              the ComponentDefinition\\ncustom resource (CR) that defines\n                              the Component's characteristics and behavior.\\n\\n\\nThe\n                              system selects the ComponentDefinition CR with the latest\n                              version that matches the pattern.\\nThis approach allows:\\n\\n\\n1.\n                              Precise selection by providing the exact name of a ComponentDefinition\n                              CR.\\n2. Flexible and automatic selection of the most\n                              up-to-date ComponentDefinition CR\\n\\t  by specifying\n                              a name prefix or regular expression pattern.\\n\\n\\nOnce\n                              set, this field cannot be updated.\"\n                            maxLength: 64\n                            type: string\n                          name:\n                            description: |-\n                              Defines the unique identifier of the component within the cluster topology.\n                              It follows IANA Service naming rules and is used as part of the Service's DNS name.\n                              The name must start with a lowercase letter, can contain lowercase letters, numbers,\n                              and hyphens, and must end with a lowercase letter or number.\n\n\n                              Cannot be updated once set.\n                            maxLength: 16\n                            pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                        required:\n                        - compDef\n                        - name\n                        type: object\n                      maxItems: 128\n                      minItems: 1\n                      type: array\n                    default:\n                      description: |-\n                        Default indicates whether this topology serves as the default configuration.\n                        When set to true, this topology is automatically used unless another is explicitly specified.\n                      type: boolean\n                    name:\n                      description: |-\n                        Name is the unique identifier for the cluster topology.\n                        Cannot be updated.\n                      maxLength: 32\n                      type: string\n                    orders:\n                      description: |-\n                        Specifies the sequence in which components within a cluster topology are\n                        started, stopped, and upgraded.\n                        This ordering is crucial for maintaining the correct dependencies and operational flow across components.\n                      properties:\n                        provision:\n                          description: |-\n                            Specifies the order for creating and initializing components.\n                            This is designed for components that depend on one another. Components without dependencies can be grouped together.\n\n\n                            Components that can be provisioned independently or have no dependencies can be listed together in the same stage,\n                            separated by commas.\n                          items:\n                            type: string\n                          type: array\n                        terminate:\n                          description: |-\n                            Outlines the order for stopping and deleting components.\n                            This sequence is designed for components that require a graceful shutdown or have interdependencies.\n\n\n                            Components that can be terminated independently or have no dependencies can be listed together in the same stage,\n                            separated by commas.\n                          items:\n                            type: string\n                          type: array\n                        update:\n                          description: |-\n                            Update determines the order for updating components' specifications, such as image upgrades or resource scaling.\n                            This sequence is designed for components that have dependencies or require specific update procedures.\n\n\n                            Components that can be updated independently or have no dependencies can be listed together in the same stage,\n                            separated by commas.\n                          items:\n                            type: string\n                          type: array\n                      type: object\n                  required:\n                  - components\n                  - name\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n              type:\n                description: |-\n                  Specifies the well-known database type, such as mysql, redis, or mongodb.\n\n\n                  Deprecated since v0.9.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                maxLength: 24\n                pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                type: string\n            type: object\n          status:\n            description: ClusterDefinitionStatus defines the observed state of ClusterDefinition\n            properties:\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: Represents the most recent generation observed for this\n                  ClusterDefinition.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Specifies the current phase of the ClusterDefinition. Valid values are `empty`, `Available`, `Unavailable`.\n                  When `Available`, the ClusterDefinition is ready and can be referenced by related objects.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n              serviceRefs:\n                description: The service references declared by this ClusterDefinition.\n                type: string\n              topologies:\n                description: Topologies this ClusterDefinition supported.\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: false\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: clusters.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    - all\n    kind: Cluster\n    listKind: ClusterList\n    plural: clusters\n    singular: cluster\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - description: ClusterDefinition referenced by cluster.\n      jsonPath: .spec.clusterDef\n      name: CLUSTER-DEFINITION\n      type: string\n    - description: Cluster termination policy.\n      jsonPath: .spec.terminationPolicy\n      name: TERMINATION-POLICY\n      type: string\n    - description: Cluster Status.\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          Cluster offers a unified management interface for a wide variety of database and storage systems:\n\n\n          - Relational databases: MySQL, PostgreSQL, MariaDB\n          - NoSQL databases: Redis, MongoDB\n          - KV stores: ZooKeeper, etcd\n          - Analytics systems: ElasticSearch, OpenSearch, ClickHouse, Doris, StarRocks, Solr\n          - Message queues: Kafka, Pulsar\n          - Distributed SQL: TiDB, OceanBase\n          - Vector databases: Qdrant, Milvus, Weaviate\n          - Object storage: Minio\n\n\n          KubeBlocks utilizes an abstraction layer to encapsulate the characteristics of these diverse systems.\n          A Cluster is composed of multiple Components, each defined by vendors or KubeBlocks Addon developers via ComponentDefinition,\n          arranged in Directed Acyclic Graph (DAG) topologies.\n          The topologies, defined in a ClusterDefinition, coordinate reconciliation across Cluster's lifecycle phases:\n          Creating, Running, Updating, Stopping, Stopped, Deleting.\n          Lifecycle management ensures that each Component operates in harmony, executing appropriate actions at each lifecycle stage.\n\n\n          For sharded-nothing architecture, the Cluster supports managing multiple shards,\n          each shard managed by a separate Component, supporting dynamic resharding.\n\n\n          The Cluster object is aimed to maintain the overall integrity and availability of a database cluster,\n          serves as the central control point, abstracting the complexity of multiple-component management,\n          and providing a unified interface for cluster-wide operations.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ClusterSpec defines the desired state of Cluster.\n            properties:\n              backup:\n                description: Specifies the backup configuration of the Cluster.\n                properties:\n                  continuousMethod:\n                    description: Specifies the backup method to use, if not set, use\n                      the first continuous method.\n                    type: string\n                  cronExpression:\n                    description: The cron expression for the schedule. The timezone\n                      is in UTC. See https://en.wikipedia.org/wiki/Cron.\n                    type: string\n                  enabled:\n                    default: false\n                    description: Specifies whether automated backup is enabled for\n                      the Cluster.\n                    type: boolean\n                  incrementalBackupEnabled:\n                    default: false\n                    description: Specifies whether to enable incremental backup.\n                    type: boolean\n                  incrementalCronExpression:\n                    description: The cron expression for the incremental backup schedule.\n                      The timezone is in UTC. See https://en.wikipedia.org/wiki/Cron.\n                    type: string\n                  method:\n                    description: Specifies the backup method to use, as defined in\n                      backupPolicy.\n                    type: string\n                  pitrEnabled:\n                    default: false\n                    description: Specifies whether to enable point-in-time recovery.\n                    type: boolean\n                  repoName:\n                    description: Specifies the name of the backupRepo. If not set,\n                      the default backupRepo will be used.\n                    type: string\n                  retentionPeriod:\n                    default: 7d\n                    description: \"Determines the duration to retain backups. Backups\n                      older than this period are automatically removed.\\n\\n\\nFor example,\n                      RetentionPeriod of `30d` will keep only the backups of last\n                      30 days.\\nSample duration format:\\n\\n\\n- years: \\t2y\\n- months:\n                      \\t6mo\\n- days: \\t\\t30d\\n- hours: \\t12h\\n- minutes: \\t30m\\n\\n\\nYou\n                      can also combine the above durations. For example: 30d12h30m.\\nDefault\n                      value is 7d.\"\n                    type: string\n                  startingDeadlineMinutes:\n                    description: |-\n                      Specifies the maximum time in minutes that the system will wait to start a missed backup job.\n                      If the scheduled backup time is missed for any reason, the backup job must start within this deadline.\n                      Values must be between 0 (immediate execution) and 1440 (one day).\n                    format: int64\n                    maximum: 1440\n                    minimum: 0\n                    type: integer\n                required:\n                - method\n                type: object\n              clusterDef:\n                description: |-\n                  Specifies the name of the ClusterDefinition to use when creating a Cluster.\n\n\n                  This field enables users to create a Cluster based on a specific ClusterDefinition.\n                  Which, in conjunction with the `topology` field, determine:\n\n\n                  - The Components to be included in the Cluster.\n                  - The sequences in which the Components are created, updated, and terminate.\n\n\n                  This facilitates multiple-components management with predefined ClusterDefinition.\n\n\n                  Users with advanced requirements can bypass this general setting and specify more precise control over\n                  the composition of the Cluster by directly referencing specific ComponentDefinitions for each component\n                  within `componentSpecs[*].componentDef`.\n\n\n                  If this field is not provided, each component must be explicitly defined in `componentSpecs[*].componentDef`.\n\n\n                  Note: Once set, this field cannot be modified; it is immutable.\n                maxLength: 63\n                pattern: ^[a-z]([a-z0-9\\.\\-]*[a-z0-9])?$\n                type: string\n                x-kubernetes-validations:\n                - message: clusterDef is immutable\n                  rule: self == oldSelf\n              componentSpecs:\n                description: |-\n                  Specifies a list of ClusterComponentSpec objects used to define the individual Components that make up a Cluster.\n                  This field allows for detailed configuration of each Component within the Cluster.\n\n\n                  Note: `shardings` and `componentSpecs` cannot both be empty; at least one must be defined to configure a Cluster.\n                items:\n                  description: ClusterComponentSpec defines the specification of a\n                    Component within a Cluster.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: Specifies Annotations to override or add for underlying\n                        Pods, PVCs, Account & TLS Secrets, Services Owned by Component.\n                      type: object\n                    componentDef:\n                      description: |-\n                        Specifies the ComponentDefinition custom resource (CR) that defines the Component's characteristics and behavior.\n\n\n                        Supports three different ways to specify the ComponentDefinition:\n\n\n                        - the regular expression - recommended\n                        - the full name - recommended\n                        - the name prefix\n                      maxLength: 64\n                      pattern: ^[a-z]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    configs:\n                      description: Specifies the configuration content of a config\n                        template.\n                      items:\n                        description: ClusterComponentConfig represents a configuration\n                          for a component.\n                        properties:\n                          configMap:\n                            description: ConfigMap source for the config.\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items if unspecified, each key-value pair in the Data field of the referenced\n                                  ConfigMap will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the ConfigMap,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: optional specify whether the ConfigMap\n                                  or its keys must be defined\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          externalManaged:\n                            description: |-\n                              ExternalManaged indicates whether the configuration is managed by an external system.\n                              When set to true, the controller will use the user-provided template and reconfigure action,\n                              ignoring the default template and update behavior.\n                            type: boolean\n                          name:\n                            description: The name of the config.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          reconfigure:\n                            description: |-\n                              The custom reconfigure action to reload the service configuration whenever changes to this config are detected.\n\n\n                              The container executing this action has access to following variables:\n\n\n                              - KB_CONFIG_FILES_CREATED: file1,file2...\n                              - KB_CONFIG_FILES_REMOVED: file1,file2...\n                              - KB_CONFIG_FILES_UPDATED: file1:checksum1,file2:checksum2...\n\n\n                              Note: This field is immutable once it has been set.\n                            properties:\n                              exec:\n                                description: |-\n                                  Defines the command to run.\n\n\n                                  This field cannot be updated.\n                                properties:\n                                  args:\n                                    description: Args represents the arguments that\n                                      are passed to the `command` for execution.\n                                    items:\n                                      type: string\n                                    type: array\n                                  command:\n                                    description: |-\n                                      Specifies the command to be executed inside the container.\n                                      The working directory for this command is the container's root directory('/').\n                                      Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                      If the shell is required, it must be explicitly invoked in the command.\n\n\n                                      A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                    items:\n                                      type: string\n                                    type: array\n                                  container:\n                                    description: |-\n                                      Specifies the name of the container within the same pod whose resources will be shared with the action.\n                                      This allows the action to utilize the specified container's resources without executing within it.\n\n\n                                      The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                                      The resources that can be shared are included:\n\n\n                                      - volume mounts\n\n\n                                      This field cannot be updated.\n                                    type: string\n                                  env:\n                                    description: |-\n                                      Represents a list of environment variables that will be injected into the container.\n                                      These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                                      This field cannot be updated.\n                                    items:\n                                      description: EnvVar represents an environment\n                                        variable present in a Container.\n                                      properties:\n                                        name:\n                                          description: Name of the environment variable.\n                                            Must be a C_IDENTIFIER.\n                                          type: string\n                                        value:\n                                          description: |-\n                                            Variable references $(VAR_NAME) are expanded\n                                            using the previously defined environment variables in the container and\n                                            any service environment variables. If a variable cannot be resolved,\n                                            the reference in the input string will be unchanged. Double $$ are reduced\n                                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                            \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                            Escaped references will never be expanded, regardless of whether the variable\n                                            exists or not.\n                                            Defaults to \"\".\n                                          type: string\n                                        valueFrom:\n                                          description: Source for the environment\n                                            variable's value. Cannot be used if value\n                                            is not empty.\n                                          properties:\n                                            configMapKeyRef:\n                                              description: Selects a key of a ConfigMap.\n                                              properties:\n                                                key:\n                                                  description: The key to select.\n                                                  type: string\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: Specify whether the\n                                                    ConfigMap or its key must be defined\n                                                  type: boolean\n                                              required:\n                                              - key\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            fieldRef:\n                                              description: |-\n                                                Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                                spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                              properties:\n                                                apiVersion:\n                                                  description: Version of the schema\n                                                    the FieldPath is written in terms\n                                                    of, defaults to \"v1\".\n                                                  type: string\n                                                fieldPath:\n                                                  description: Path of the field to\n                                                    select in the specified API version.\n                                                  type: string\n                                              required:\n                                              - fieldPath\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            resourceFieldRef:\n                                              description: |-\n                                                Selects a resource of the container: only resources limits and requests\n                                                (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                              properties:\n                                                containerName:\n                                                  description: 'Container name: required\n                                                    for volumes, optional for env\n                                                    vars'\n                                                  type: string\n                                                divisor:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  description: Specifies the output\n                                                    format of the exposed resources,\n                                                    defaults to \"1\"\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                resource:\n                                                  description: 'Required: resource\n                                                    to select'\n                                                  type: string\n                                              required:\n                                              - resource\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            secretKeyRef:\n                                              description: Selects a key of a secret\n                                                in the pod's namespace\n                                              properties:\n                                                key:\n                                                  description: The key of the secret\n                                                    to select from.  Must be a valid\n                                                    secret key.\n                                                  type: string\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: Specify whether the\n                                                    Secret or its key must be defined\n                                                  type: boolean\n                                              required:\n                                              - key\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                          type: object\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                  image:\n                                    description: |-\n                                      Specifies the container image to be used for running the Action.\n\n\n                                      When specified, a dedicated container will be created using this image to execute the Action.\n                                      All actions with same image will share the same container.\n\n\n                                      This field cannot be updated.\n                                    type: string\n                                  matchingKey:\n                                    description: |-\n                                      Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                                      The impact of this field depends on the `targetPodSelector` value:\n\n\n                                      - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                                      - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                        will be selected for the Action.\n\n\n                                      This field cannot be updated.\n                                    type: string\n                                  targetPodSelector:\n                                    description: |-\n                                      Defines the criteria used to select the target Pod(s) for executing the Action.\n                                      This is useful when there is no default target replica identified.\n                                      It allows for precise control over which Pod(s) the Action should run in.\n\n\n                                      If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                                      to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                                      post-provision or pre-terminate of the component.\n\n\n                                      This field cannot be updated.\n                                    enum:\n                                    - Any\n                                    - All\n                                    - Role\n                                    - Ordinal\n                                    type: string\n                                type: object\n                              grpc:\n                                description: |-\n                                  Defines the gRPC call to issue.\n\n\n                                  This field cannot be updated.\n                                properties:\n                                  host:\n                                    description: |-\n                                      The target host to connect to.\n                                      Defaults to \"127.0.0.1\" if not specified.\n                                    type: string\n                                  method:\n                                    description: Name of the method to invoke on the\n                                      gRPC service.\n                                    type: string\n                                  port:\n                                    description: |-\n                                      The port to access on the host.\n                                      It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                                    type: string\n                                  request:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      Request payload for the gRPC method.\n\n\n                                      Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                                      Templates are rendered with predefined action variables before the request is sent.\n                                    type: object\n                                  response:\n                                    description: Required response schema for the\n                                      gRPC method.\n                                    properties:\n                                      message:\n                                        description: |-\n                                          Name of the field in the response whose value should be output.\n                                          Printed to stdout on success, or stderr on failure.\n                                        type: string\n                                      status:\n                                        description: |-\n                                          Name of the string field in the response that carries status information.\n                                          If non-empty, the action fails.\n                                        type: string\n                                    type: object\n                                  service:\n                                    description: Fully-qualified name of the gRPC\n                                      service to call.\n                                    type: string\n                                required:\n                                - method\n                                - port\n                                - service\n                                type: object\n                              http:\n                                description: |-\n                                  Defines the HTTP request to perform.\n\n\n                                  This field cannot be updated.\n                                properties:\n                                  body:\n                                    description: |-\n                                      Optional HTTP request body.\n\n\n                                      Supports Go text/template syntax; rendered with predefined variables before sending.\n                                    type: string\n                                  headers:\n                                    description: |-\n                                      Custom headers to set in the request.\n                                      Header values may use Go text/template syntax, rendered with predefined variables.\n                                    items:\n                                      description: HTTPHeader represents a single\n                                        HTTP header key/value pair.\n                                      properties:\n                                        name:\n                                          description: Name of the header field.\n                                          type: string\n                                        value:\n                                          description: Value of the header field.\n                                          type: string\n                                      required:\n                                      - name\n                                      - value\n                                      type: object\n                                    type: array\n                                  host:\n                                    description: |-\n                                      The target host to connect to.\n                                      Defaults to \"127.0.0.1\" if not specified.\n                                    type: string\n                                  method:\n                                    default: GET\n                                    description: |-\n                                      The HTTP method to use.\n                                      Defaults to \"GET\".\n                                    enum:\n                                    - GET\n                                    - POST\n                                    - PUT\n                                    - DELETE\n                                    - HEAD\n                                    - PATCH\n                                    type: string\n                                  path:\n                                    default: /\n                                    description: |-\n                                      The path to request on the HTTP server.\n                                      Defaults to \"/\" if not specified.\n                                    pattern: ^/.*\n                                    type: string\n                                  port:\n                                    description: |-\n                                      The port to access on the host.\n                                      It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                                    type: string\n                                  scheme:\n                                    default: HTTP\n                                    description: |-\n                                      The scheme to use for connecting to the host.\n                                      Defaults to \"HTTP\".\n                                    enum:\n                                    - HTTP\n                                    - HTTPS\n                                    type: string\n                                required:\n                                - port\n                                type: object\n                              matchingKey:\n                                description: |-\n                                  Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                                  The impact of this field depends on the `targetPodSelector` value:\n\n\n                                  - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                                  - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                    will be selected for the Action.\n\n\n                                  This field cannot be updated.\n                                type: string\n                              preCondition:\n                                description: |-\n                                  Specifies the state that the cluster must reach before the Action is executed.\n                                  Currently, this is only applicable to the `postProvision` action.\n\n\n                                  The conditions are as follows:\n\n\n                                  - `Immediately`: Executed right after the Component object is created.\n                                    The readiness of the Component and its resources is not guaranteed at this stage.\n                                  - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                    runtime resources (e.g. Pods) are in a ready state.\n                                  - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                    This process does not affect the readiness state of the Component or the Cluster.\n                                  - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                    This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                                  This field cannot be updated.\n                                type: string\n                              retryPolicy:\n                                description: |-\n                                  Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                                  It specifies the conditions under which the Action should be retried and the limits to apply,\n                                  such as the maximum number of retries and backoff strategy.\n\n\n                                  This field cannot be updated.\n                                properties:\n                                  maxRetries:\n                                    default: 0\n                                    description: |-\n                                      Defines the maximum number of retry attempts that should be made for a given Action.\n                                      This value is set to 0 by default, indicating that no retries will be made.\n                                    type: integer\n                                  retryInterval:\n                                    default: 0\n                                    description: |-\n                                      Indicates the duration of time to wait between each retry attempt.\n                                      This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                    format: int64\n                                    type: integer\n                                type: object\n                              targetPodSelector:\n                                description: |-\n                                  Defines the criteria used to select the target Pod(s) for executing the Action.\n                                  This is useful when there is no default target replica identified.\n                                  It allows for precise control over which Pod(s) the Action should run in.\n\n\n                                  If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                                  to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                                  post-provision or pre-terminate of the component.\n\n\n                                  This field cannot be updated.\n                                enum:\n                                - Any\n                                - All\n                                - Role\n                                - Ordinal\n                                type: string\n                              timeoutSeconds:\n                                default: 0\n                                description: |-\n                                  Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                                  If the Action does not complete within this time frame, it will be terminated.\n\n\n                                  This field cannot be updated.\n                                format: int32\n                                type: integer\n                            type: object\n                          variables:\n                            additionalProperties:\n                              type: string\n                            description: Variables are key-value pairs for dynamic\n                              configuration values that can be provided by the user.\n                            type: object\n                        type: object\n                      type: array\n                    disableExporter:\n                      description: |-\n                        Determines whether metrics exporter information is annotated on the Component's headless Service.\n\n\n                        If set to true, the following annotations will not be patched into the Service:\n\n\n                        - \"monitor.kubeblocks.io/path\"\n                        - \"monitor.kubeblocks.io/port\"\n                        - \"monitor.kubeblocks.io/scheme\"\n\n\n                        These annotations allow the Prometheus installed by KubeBlocks to discover and scrape metrics from the exporter.\n                      type: boolean\n                    env:\n                      description: |-\n                        List of environment variables to add.\n                        These environment variables will be placed after the environment variables declared in the Pod.\n                      items:\n                        description: EnvVar represents an environment variable present\n                          in a Container.\n                        properties:\n                          name:\n                            description: Name of the environment variable. Must be\n                              a C_IDENTIFIER.\n                            type: string\n                          value:\n                            description: |-\n                              Variable references $(VAR_NAME) are expanded\n                              using the previously defined environment variables in the container and\n                              any service environment variables. If a variable cannot be resolved,\n                              the reference in the input string will be unchanged. Double $$ are reduced\n                              to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                              \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                              Escaped references will never be expanded, regardless of whether the variable\n                              exists or not.\n                              Defaults to \"\".\n                            type: string\n                          valueFrom:\n                            description: Source for the environment variable's value.\n                              Cannot be used if value is not empty.\n                            properties:\n                              configMapKeyRef:\n                                description: Selects a key of a ConfigMap.\n                                properties:\n                                  key:\n                                    description: The key to select.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap or\n                                      its key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              fieldRef:\n                                description: |-\n                                  Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                  spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              secretKeyRef:\n                                description: Selects a key of a secret in the pod's\n                                  namespace\n                                properties:\n                                  key:\n                                    description: The key of the secret to select from.  Must\n                                      be a valid secret key.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret or its\n                                      key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    instanceUpdateStrategy:\n                      description: Provides fine-grained control over the spec update\n                        process of all instances.\n                      properties:\n                        rollingUpdate:\n                          description: Specifies how the rolling update should be\n                            applied.\n                          properties:\n                            maxUnavailable:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                The maximum number of instances that can be unavailable during the update.\n                                Value can be an absolute number (ex: 5) or a percentage of desired instances (ex: 10%).\n                                Absolute number is calculated from percentage by rounding up. This can not be 0.\n                                Defaults to 1. The field applies to all instances. That means if there is any unavailable pod,\n                                it will be counted towards MaxUnavailable.\n                              x-kubernetes-int-or-string: true\n                            replicas:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                Indicates the number of instances that should be updated during a rolling update.\n                                The remaining instances will remain untouched. This is helpful in defining how many instances\n                                should participate in the update process.\n                                Value can be an absolute number (ex: 5) or a percentage of desired instances (ex: 10%).\n                                Absolute number is calculated from percentage by rounding up.\n                                The default value is ComponentSpec.Replicas (i.e., update all instances).\n                              x-kubernetes-int-or-string: true\n                          type: object\n                        type:\n                          description: |-\n                            Indicates the type of the update strategy.\n                            Default is RollingUpdate.\n                          enum:\n                          - RollingUpdate\n                          - OnDelete\n                          type: string\n                      type: object\n                    instances:\n                      description: |-\n                        Allows for the customization of configuration values for each instance within a Component.\n                        An instance represent a single replica (Pod and associated K8s resources like PVCs, Services, and ConfigMaps).\n                        While instances typically share a common configuration as defined in the ClusterComponentSpec,\n                        they can require unique settings in various scenarios:\n\n\n                        For example:\n                        - A database Component might require different resource allocations for primary and secondary instances,\n                          with primaries needing more resources.\n                        - During a rolling upgrade, a Component may first update the image for one or a few instances,\n                          and then update the remaining instances after verifying that the updated instances are functioning correctly.\n\n\n                        InstanceTemplate allows for specifying these unique configurations per instance.\n                        Each instance's name is constructed using the pattern: $(component.name)-$(template.name)-$(ordinal),\n                        starting with an ordinal of 0.\n                        It is crucial to maintain unique names for each InstanceTemplate to avoid conflicts.\n\n\n                        The sum of replicas across all InstanceTemplates should not exceed the total number of replicas specified for the Component.\n                        Any remaining replicas will be generated using the default template and will follow the default naming rules.\n                      items:\n                        description: InstanceTemplate allows customization of individual\n                          replica configurations in a Component.\n                        properties:\n                          annotations:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                              Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                            type: object\n                          env:\n                            description: |-\n                              Defines Env to override.\n                              Add new or override existing envs.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          labels:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                              Values for existing keys will be overwritten, and new keys will be added.\n                            type: object\n                          name:\n                            description: |-\n                              Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                              This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal\n                              using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                              The specified name overrides any default naming conventions or patterns.\n                            maxLength: 54\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          ordinals:\n                            description: |-\n                              Specifies the desired Ordinals of this InstanceTemplate.\n                              The Ordinals used to specify the ordinal of the instance (pod) names to be generated under this InstanceTemplate.\n\n\n                              For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},\n                              then the instance names generated under this InstanceTemplate would be\n                              $(cluster.name)-$(component.name)-$(template.name)-0、$(cluster.name)-$(component.name)-$(template.name)-1 and\n                              $(cluster.name)-$(component.name)-$(template.name)-7\n                            properties:\n                              discrete:\n                                items:\n                                  format: int32\n                                  type: integer\n                                type: array\n                              ranges:\n                                items:\n                                  description: |-\n                                    Range represents a range with a start and an end value.\n                                    It is used to define a continuous segment.\n                                  properties:\n                                    end:\n                                      format: int32\n                                      type: integer\n                                    start:\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - end\n                                  - start\n                                  type: object\n                                type: array\n                            type: object\n                          replicas:\n                            default: 1\n                            description: |-\n                              Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                              This field allows setting how many replicated instances of the Component,\n                              with the specific overrides in the InstanceTemplate, are created.\n                              The default value is 1. A value of 0 disables instance creation.\n                            format: int32\n                            minimum: 0\n                            type: integer\n                          resources:\n                            description: |-\n                              Specifies an override for the resource requirements of the first container in the Pod.\n                              This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                            properties:\n                              claims:\n                                description: |-\n                                  Claims lists the names of resources, defined in spec.resourceClaims,\n                                  that are used by this container.\n\n\n                                  This is an alpha field and requires enabling the\n                                  DynamicResourceAllocation feature gate.\n\n\n                                  This field is immutable. It can only be set for containers.\n                                items:\n                                  description: ResourceClaim references one entry\n                                    in PodSpec.ResourceClaims.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name must match the name of one entry in pod.spec.resourceClaims of\n                                        the Pod where this field is used. It makes that resource available\n                                        inside a container.\n                                      type: string\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                                x-kubernetes-list-map-keys:\n                                - name\n                                x-kubernetes-list-type: map\n                              limits:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: |-\n                                  Limits describes the maximum amount of compute resources allowed.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                type: object\n                              requests:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: |-\n                                  Requests describes the minimum amount of compute resources required.\n                                  If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                  otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                type: object\n                            type: object\n                          schedulingPolicy:\n                            description: |-\n                              Specifies the scheduling policy for the instance.\n                              If defined, it will overwrite the scheduling policy defined in ClusterSpec and/or ClusterComponentSpec.\n                            properties:\n                              affinity:\n                                description: Specifies a group of affinity scheduling\n                                  rules of the Cluster, including NodeAffinity, PodAffinity,\n                                  and PodAntiAffinity.\n                                properties:\n                                  nodeAffinity:\n                                    description: Describes node affinity scheduling\n                                      rules for the pod.\n                                    properties:\n                                      preferredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          The scheduler will prefer to schedule pods to nodes that satisfy\n                                          the affinity expressions specified by this field, but it may choose\n                                          a node that violates one or more of the expressions. The node that is\n                                          most preferred is the one with the greatest sum of weights, i.e.\n                                          for each node that meets all of the scheduling requirements (resource\n                                          request, requiredDuringScheduling affinity expressions, etc.),\n                                          compute a sum by iterating through the elements of this field and adding\n                                          \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                          node(s) with the highest sum are the most preferred.\n                                        items:\n                                          description: |-\n                                            An empty preferred scheduling term matches all objects with implicit weight 0\n                                            (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                          properties:\n                                            preference:\n                                              description: A node selector term, associated\n                                                with the corresponding weight.\n                                              properties:\n                                                matchExpressions:\n                                                  description: A list of node selector\n                                                    requirements by node's labels.\n                                                  items:\n                                                    description: |-\n                                                      A node selector requirement is a selector that contains values, a key, and an operator\n                                                      that relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: The label key\n                                                          that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          Represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          An array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. If the operator is Gt or Lt, the values\n                                                          array must have a single element, which will be interpreted as an integer.\n                                                          This array is replaced during a strategic merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchFields:\n                                                  description: A list of node selector\n                                                    requirements by node's fields.\n                                                  items:\n                                                    description: |-\n                                                      A node selector requirement is a selector that contains values, a key, and an operator\n                                                      that relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: The label key\n                                                          that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          Represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          An array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. If the operator is Gt or Lt, the values\n                                                          array must have a single element, which will be interpreted as an integer.\n                                                          This array is replaced during a strategic merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            weight:\n                                              description: Weight associated with\n                                                matching the corresponding nodeSelectorTerm,\n                                                in the range 1-100.\n                                              format: int32\n                                              type: integer\n                                          required:\n                                          - preference\n                                          - weight\n                                          type: object\n                                        type: array\n                                      requiredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          If the affinity requirements specified by this field are not met at\n                                          scheduling time, the pod will not be scheduled onto the node.\n                                          If the affinity requirements specified by this field cease to be met\n                                          at some point during pod execution (e.g. due to an update), the system\n                                          may or may not try to eventually evict the pod from its node.\n                                        properties:\n                                          nodeSelectorTerms:\n                                            description: Required. A list of node\n                                              selector terms. The terms are ORed.\n                                            items:\n                                              description: |-\n                                                A null or empty node selector term matches no objects. The requirements of\n                                                them are ANDed.\n                                                The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                              properties:\n                                                matchExpressions:\n                                                  description: A list of node selector\n                                                    requirements by node's labels.\n                                                  items:\n                                                    description: |-\n                                                      A node selector requirement is a selector that contains values, a key, and an operator\n                                                      that relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: The label key\n                                                          that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          Represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          An array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. If the operator is Gt or Lt, the values\n                                                          array must have a single element, which will be interpreted as an integer.\n                                                          This array is replaced during a strategic merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchFields:\n                                                  description: A list of node selector\n                                                    requirements by node's fields.\n                                                  items:\n                                                    description: |-\n                                                      A node selector requirement is a selector that contains values, a key, and an operator\n                                                      that relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: The label key\n                                                          that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          Represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          An array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. If the operator is Gt or Lt, the values\n                                                          array must have a single element, which will be interpreted as an integer.\n                                                          This array is replaced during a strategic merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            type: array\n                                        required:\n                                        - nodeSelectorTerms\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                  podAffinity:\n                                    description: Describes pod affinity scheduling\n                                      rules (e.g. co-locate this pod in the same node,\n                                      zone, etc. as some other pod(s)).\n                                    properties:\n                                      preferredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          The scheduler will prefer to schedule pods to nodes that satisfy\n                                          the affinity expressions specified by this field, but it may choose\n                                          a node that violates one or more of the expressions. The node that is\n                                          most preferred is the one with the greatest sum of weights, i.e.\n                                          for each node that meets all of the scheduling requirements (resource\n                                          request, requiredDuringScheduling affinity expressions, etc.),\n                                          compute a sum by iterating through the elements of this field and adding\n                                          \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                          node(s) with the highest sum are the most preferred.\n                                        items:\n                                          description: The weights of all of the matched\n                                            WeightedPodAffinityTerm fields are added\n                                            per-node to find the most preferred node(s)\n                                          properties:\n                                            podAffinityTerm:\n                                              description: Required. A pod affinity\n                                                term, associated with the corresponding\n                                                weight.\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            weight:\n                                              description: |-\n                                                weight associated with matching the corresponding podAffinityTerm,\n                                                in the range 1-100.\n                                              format: int32\n                                              type: integer\n                                          required:\n                                          - podAffinityTerm\n                                          - weight\n                                          type: object\n                                        type: array\n                                      requiredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          If the affinity requirements specified by this field are not met at\n                                          scheduling time, the pod will not be scheduled onto the node.\n                                          If the affinity requirements specified by this field cease to be met\n                                          at some point during pod execution (e.g. due to a pod label update), the\n                                          system may or may not try to eventually evict the pod from its node.\n                                          When there are multiple elements, the lists of nodes corresponding to each\n                                          podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                        items:\n                                          description: |-\n                                            Defines a set of pods (namely those matching the labelSelector\n                                            relative to the given namespace(s)) that this pod should be\n                                            co-located (affinity) or not co-located (anti-affinity) with,\n                                            where co-located is defined as running on a node whose value of\n                                            the label with key <topologyKey> matches that of any node on which\n                                            a pod of the set of pods is running\n                                          properties:\n                                            labelSelector:\n                                              description: |-\n                                                A label query over a set of resources, in this case pods.\n                                                If it's null, this PodAffinityTerm matches with no Pods.\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            matchLabelKeys:\n                                              description: |-\n                                                MatchLabelKeys is a set of pod label keys to select which pods will\n                                                be taken into consideration. The keys are used to lookup values from the\n                                                incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                to select the group of existing pods which pods will be taken into consideration\n                                                for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                pod labels will be ignored. The default value is empty.\n                                                The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                              items:\n                                                type: string\n                                              type: array\n                                              x-kubernetes-list-type: atomic\n                                            mismatchLabelKeys:\n                                              description: |-\n                                                MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                be taken into consideration. The keys are used to lookup values from the\n                                                incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                to select the group of existing pods which pods will be taken into consideration\n                                                for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                pod labels will be ignored. The default value is empty.\n                                                The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                              items:\n                                                type: string\n                                              type: array\n                                              x-kubernetes-list-type: atomic\n                                            namespaceSelector:\n                                              description: |-\n                                                A label query over the set of namespaces that the term applies to.\n                                                The term is applied to the union of the namespaces selected by this field\n                                                and the ones listed in the namespaces field.\n                                                null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                An empty selector ({}) matches all namespaces.\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            namespaces:\n                                              description: |-\n                                                namespaces specifies a static list of namespace names that the term applies to.\n                                                The term is applied to the union of the namespaces listed in this field\n                                                and the ones selected by namespaceSelector.\n                                                null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                              items:\n                                                type: string\n                                              type: array\n                                            topologyKey:\n                                              description: |-\n                                                This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                whose value of the label with key topologyKey matches that of any node on which any of the\n                                                selected pods is running.\n                                                Empty topologyKey is not allowed.\n                                              type: string\n                                          required:\n                                          - topologyKey\n                                          type: object\n                                        type: array\n                                    type: object\n                                  podAntiAffinity:\n                                    description: Describes pod anti-affinity scheduling\n                                      rules (e.g. avoid putting this pod in the same\n                                      node, zone, etc. as some other pod(s)).\n                                    properties:\n                                      preferredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          The scheduler will prefer to schedule pods to nodes that satisfy\n                                          the anti-affinity expressions specified by this field, but it may choose\n                                          a node that violates one or more of the expressions. The node that is\n                                          most preferred is the one with the greatest sum of weights, i.e.\n                                          for each node that meets all of the scheduling requirements (resource\n                                          request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                          compute a sum by iterating through the elements of this field and adding\n                                          \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                          node(s) with the highest sum are the most preferred.\n                                        items:\n                                          description: The weights of all of the matched\n                                            WeightedPodAffinityTerm fields are added\n                                            per-node to find the most preferred node(s)\n                                          properties:\n                                            podAffinityTerm:\n                                              description: Required. A pod affinity\n                                                term, associated with the corresponding\n                                                weight.\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            weight:\n                                              description: |-\n                                                weight associated with matching the corresponding podAffinityTerm,\n                                                in the range 1-100.\n                                              format: int32\n                                              type: integer\n                                          required:\n                                          - podAffinityTerm\n                                          - weight\n                                          type: object\n                                        type: array\n                                      requiredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          If the anti-affinity requirements specified by this field are not met at\n                                          scheduling time, the pod will not be scheduled onto the node.\n                                          If the anti-affinity requirements specified by this field cease to be met\n                                          at some point during pod execution (e.g. due to a pod label update), the\n                                          system may or may not try to eventually evict the pod from its node.\n                                          When there are multiple elements, the lists of nodes corresponding to each\n                                          podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                        items:\n                                          description: |-\n                                            Defines a set of pods (namely those matching the labelSelector\n                                            relative to the given namespace(s)) that this pod should be\n                                            co-located (affinity) or not co-located (anti-affinity) with,\n                                            where co-located is defined as running on a node whose value of\n                                            the label with key <topologyKey> matches that of any node on which\n                                            a pod of the set of pods is running\n                                          properties:\n                                            labelSelector:\n                                              description: |-\n                                                A label query over a set of resources, in this case pods.\n                                                If it's null, this PodAffinityTerm matches with no Pods.\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            matchLabelKeys:\n                                              description: |-\n                                                MatchLabelKeys is a set of pod label keys to select which pods will\n                                                be taken into consideration. The keys are used to lookup values from the\n                                                incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                to select the group of existing pods which pods will be taken into consideration\n                                                for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                pod labels will be ignored. The default value is empty.\n                                                The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                              items:\n                                                type: string\n                                              type: array\n                                              x-kubernetes-list-type: atomic\n                                            mismatchLabelKeys:\n                                              description: |-\n                                                MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                be taken into consideration. The keys are used to lookup values from the\n                                                incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                to select the group of existing pods which pods will be taken into consideration\n                                                for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                pod labels will be ignored. The default value is empty.\n                                                The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                              items:\n                                                type: string\n                                              type: array\n                                              x-kubernetes-list-type: atomic\n                                            namespaceSelector:\n                                              description: |-\n                                                A label query over the set of namespaces that the term applies to.\n                                                The term is applied to the union of the namespaces selected by this field\n                                                and the ones listed in the namespaces field.\n                                                null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                An empty selector ({}) matches all namespaces.\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            namespaces:\n                                              description: |-\n                                                namespaces specifies a static list of namespace names that the term applies to.\n                                                The term is applied to the union of the namespaces listed in this field\n                                                and the ones selected by namespaceSelector.\n                                                null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                              items:\n                                                type: string\n                                              type: array\n                                            topologyKey:\n                                              description: |-\n                                                This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                whose value of the label with key topologyKey matches that of any node on which any of the\n                                                selected pods is running.\n                                                Empty topologyKey is not allowed.\n                                              type: string\n                                          required:\n                                          - topologyKey\n                                          type: object\n                                        type: array\n                                    type: object\n                                type: object\n                              nodeName:\n                                description: |-\n                                  NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                                  the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                                  requirements.\n                                type: string\n                              nodeSelector:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  NodeSelector is a selector which must be true for the Pod to fit on a node.\n                                  Selector which must match a node's labels for the Pod to be scheduled on that node.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              schedulerName:\n                                description: |-\n                                  If specified, the Pod will be dispatched by specified scheduler.\n                                  If not specified, the Pod will be dispatched by default scheduler.\n                                type: string\n                              tolerations:\n                                description: |-\n                                  Allows Pods to be scheduled onto nodes with matching taints.\n                                  Each toleration in the array allows the Pod to tolerate node taints based on\n                                  specified `key`, `value`, `effect`, and `operator`.\n\n\n                                  - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                                  - The `operator` determines how the toleration matches the taint.\n\n\n                                  Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                                items:\n                                  description: |-\n                                    The pod this Toleration is attached to tolerates any taint that matches\n                                    the triple <key,value,effect> using the matching operator <operator>.\n                                  properties:\n                                    effect:\n                                      description: |-\n                                        Effect indicates the taint effect to match. Empty means match all taint effects.\n                                        When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                      type: string\n                                    key:\n                                      description: |-\n                                        Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                        If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                      type: string\n                                    operator:\n                                      description: |-\n                                        Operator represents a key's relationship to the value.\n                                        Valid operators are Exists and Equal. Defaults to Equal.\n                                        Exists is equivalent to wildcard for value, so that a pod can\n                                        tolerate all taints of a particular category.\n                                      type: string\n                                    tolerationSeconds:\n                                      description: |-\n                                        TolerationSeconds represents the period of time the toleration (which must be\n                                        of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                        it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                        negative values will be treated as 0 (evict immediately) by the system.\n                                      format: int64\n                                      type: integer\n                                    value:\n                                      description: |-\n                                        Value is the taint value the toleration matches to.\n                                        If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                      type: string\n                                  type: object\n                                type: array\n                              topologySpreadConstraints:\n                                description: |-\n                                  TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                                  domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                                  All topologySpreadConstraints are ANDed.\n                                items:\n                                  description: TopologySpreadConstraint specifies\n                                    how to spread matching pods among the given topology.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        LabelSelector is used to find matching pods.\n                                        Pods that match this label selector are counted to determine the number of pods\n                                        in their corresponding topology domain.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select the pods over which\n                                        spreading will be calculated. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are ANDed with labelSelector\n                                        to select the group of existing pods over which spreading will be calculated\n                                        for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        Keys that don't exist in the incoming pod labels will\n                                        be ignored. A null or empty list means only match against labelSelector.\n\n\n                                        This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    maxSkew:\n                                      description: |-\n                                        MaxSkew describes the degree to which pods may be unevenly distributed.\n                                        When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                        between the number of matching pods in the target topology and the global minimum.\n                                        The global minimum is the minimum number of matching pods in an eligible domain\n                                        or zero if the number of eligible domains is less than MinDomains.\n                                        For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                        labelSelector spread as 2/2/1:\n                                        In this case, the global minimum is 1.\n                                        | zone1 | zone2 | zone3 |\n                                        |  P P  |  P P  |   P   |\n                                        - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                        scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                        violate MaxSkew(1).\n                                        - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                        When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                        to topologies that satisfy it.\n                                        It's a required field. Default value is 1 and 0 is not allowed.\n                                      format: int32\n                                      type: integer\n                                    minDomains:\n                                      description: |-\n                                        MinDomains indicates a minimum number of eligible domains.\n                                        When the number of eligible domains with matching topology keys is less than minDomains,\n                                        Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                        And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                        this value has no effect on scheduling.\n                                        As a result, when the number of eligible domains is less than minDomains,\n                                        scheduler won't schedule more than maxSkew Pods to those domains.\n                                        If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                        Valid values are integers greater than 0.\n                                        When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                        For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                        labelSelector spread as 2/2/2:\n                                        | zone1 | zone2 | zone3 |\n                                        |  P P  |  P P  |  P P  |\n                                        The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                        In this situation, new pod with the same labelSelector cannot be scheduled,\n                                        because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                        it will violate MaxSkew.\n\n\n                                        This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                      format: int32\n                                      type: integer\n                                    nodeAffinityPolicy:\n                                      description: |-\n                                        NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                        when calculating pod topology spread skew. Options are:\n                                        - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                        - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                        If this value is nil, the behavior is equivalent to the Honor policy.\n                                        This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                      type: string\n                                    nodeTaintsPolicy:\n                                      description: |-\n                                        NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                        pod topology spread skew. Options are:\n                                        - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                        has a toleration, are included.\n                                        - Ignore: node taints are ignored. All nodes are included.\n\n\n                                        If this value is nil, the behavior is equivalent to the Ignore policy.\n                                        This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                      type: string\n                                    topologyKey:\n                                      description: |-\n                                        TopologyKey is the key of node labels. Nodes that have a label with this key\n                                        and identical values are considered to be in the same topology.\n                                        We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                        of pods into each bucket.\n                                        We define a domain as a particular instance of a topology.\n                                        Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                        nodeAffinityPolicy and nodeTaintsPolicy.\n                                        e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                        And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                        It's a required field.\n                                      type: string\n                                    whenUnsatisfiable:\n                                      description: |-\n                                        WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                        the spread constraint.\n                                        - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                        - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                          but giving higher precedence to topologies that would help reduce the\n                                          skew.\n                                        A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                        if and only if every possible node assignment for that pod would violate\n                                        \"MaxSkew\" on some topology.\n                                        For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                        labelSelector spread as 3/1/1:\n                                        | zone1 | zone2 | zone3 |\n                                        | P P P |   P   |   P   |\n                                        If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                        to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                        MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                        won't make it *more* imbalanced.\n                                        It's a required field.\n                                      type: string\n                                  required:\n                                  - maxSkew\n                                  - topologyKey\n                                  - whenUnsatisfiable\n                                  type: object\n                                type: array\n                            type: object\n                          volumeClaimTemplates:\n                            description: Specifies an override for the storage requirements\n                              of the instances.\n                            items:\n                              properties:\n                                annotations:\n                                  additionalProperties:\n                                    type: string\n                                  description: Specifies the annotations for the PVC\n                                    of the volume.\n                                  type: object\n                                labels:\n                                  additionalProperties:\n                                    type: string\n                                  description: Specifies the labels for the PVC of\n                                    the volume.\n                                  type: object\n                                name:\n                                  description: |-\n                                    Refers to the name of a volumeMount defined in either:\n\n\n                                    - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                                    - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                                    The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                                  type: string\n                                spec:\n                                  description: |-\n                                    Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                                    with the mount name specified in the `name` field.\n\n\n                                    When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                                    defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                                  properties:\n                                    accessModes:\n                                      description: |-\n                                        Contains the desired access modes the volume should have.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-preserve-unknown-fields: true\n                                    resources:\n                                      description: |-\n                                        Represents the minimum resources the volume should have.\n                                        If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                        are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                      properties:\n                                        limits:\n                                          additionalProperties:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          description: |-\n                                            Limits describes the maximum amount of compute resources allowed.\n                                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                          type: object\n                                        requests:\n                                          additionalProperties:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          description: |-\n                                            Requests describes the minimum amount of compute resources required.\n                                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                          type: object\n                                      type: object\n                                      x-kubernetes-preserve-unknown-fields: true\n                                    storageClassName:\n                                      description: |-\n                                        The name of the StorageClass required by the claim.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                      type: string\n                                    volumeAttributesClassName:\n                                      description: |-\n                                        volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n\n\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                      type: string\n                                    volumeMode:\n                                      description: Defines what type of volume is\n                                        required by the claim, either Block or Filesystem.\n                                      type: string\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    issuer:\n                      description: |-\n                        Specifies the configuration for the TLS certificates issuer.\n                        It allows defining the issuer name and the reference to the secret containing the TLS certificates and key.\n                        The secret should contain the CA certificate, TLS certificate, and private key in the specified keys.\n                        Required when TLS is enabled.\n                      properties:\n                        name:\n                          allOf:\n                          - enum:\n                            - KubeBlocks\n                            - UserProvided\n                          - enum:\n                            - KubeBlocks\n                            - UserProvided\n                          default: KubeBlocks\n                          description: |-\n                            The issuer for TLS certificates.\n                            It only allows two enum values: `KubeBlocks` and `UserProvided`.\n\n\n                            - `KubeBlocks` indicates that the self-signed TLS certificates generated by the KubeBlocks Operator will be used.\n                            - `UserProvided` means that the user is responsible for providing their own CA, Cert, and Key.\n                              In this case, the user-provided CA certificate, server certificate, and private key will be used\n                              for TLS communication.\n                          type: string\n                        secretRef:\n                          description: |-\n                            SecretRef is the reference to the secret that contains user-provided certificates.\n                            It is required when the issuer is set to `UserProvided`.\n                          properties:\n                            ca:\n                              description: Key of CA cert in Secret\n                              type: string\n                            cert:\n                              description: Key of Cert in Secret\n                              type: string\n                            key:\n                              description: Key of TLS private key in Secret\n                              type: string\n                            name:\n                              description: Name of the Secret that contains user-provided\n                                certificates.\n                              type: string\n                            namespace:\n                              description: |-\n                                The namespace where the secret is located.\n                                If not provided, the secret is assumed to be in the same namespace as the Cluster object.\n                              type: string\n                          required:\n                          - ca\n                          - cert\n                          - key\n                          - name\n                          type: object\n                      required:\n                      - name\n                      type: object\n                    labels:\n                      additionalProperties:\n                        type: string\n                      description: Specifies Labels to override or add for underlying\n                        Pods, PVCs, Account & TLS Secrets, Services Owned by Component.\n                      type: object\n                    name:\n                      description: |-\n                        Specifies the Component's name.\n                        It's part of the Service DNS name and must comply with the IANA service naming rule.\n                        The name is optional when ClusterComponentSpec is used as a template (e.g., in `clusterSharding`),\n                        but required otherwise.\n                      maxLength: 22\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    offlineInstances:\n                      description: |-\n                        Specifies the names of instances to be transitioned to offline status.\n\n\n                        Marking an instance as offline results in the following:\n\n\n                        1. The associated Pod is stopped, and its PersistentVolumeClaim (PVC) is retained for potential\n                           future reuse or data recovery, but it is no longer actively used.\n                        2. The ordinal number assigned to this instance is preserved, ensuring it remains unique\n                           and avoiding conflicts with new instances.\n\n\n                        Setting instances to offline allows for a controlled scale-in process, preserving their data and maintaining\n                        ordinal consistency within the Cluster.\n                      items:\n                        type: string\n                      type: array\n                    parallelPodManagementConcurrency:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      description: |-\n                        Controls the concurrency of pods during initial scale up, when replacing pods on nodes,\n                        or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.\n                        The default Concurrency is 100%.\n                      x-kubernetes-int-or-string: true\n                    persistentVolumeClaimRetentionPolicy:\n                      description: |-\n                        persistentVolumeClaimRetentionPolicy describes the lifecycle of persistent\n                        volume claims created from volumeClaimTemplates. By default, all persistent\n                        volume claims are created as needed and retained until manually deleted. This\n                        policy allows the lifecycle to be altered, for example by deleting persistent\n                        volume claims when their workload is deleted, or when their pod is scaled\n                        down.\n                      properties:\n                        whenDeleted:\n                          description: |-\n                            WhenDeleted specifies what happens to PVCs created from VolumeClaimTemplates when the workload is deleted.\n                            The `Retain` policy causes PVCs to not be affected by workload deletion.\n                            The default policy of `Delete` causes those PVCs to be deleted.\n                          enum:\n                          - Retain\n                          - Delete\n                          type: string\n                        whenScaled:\n                          description: |-\n                            WhenScaled specifies what happens to PVCs created from VolumeClaimTemplates when the workload is scaled down.\n                            The `Retain` policy causes PVCs to not be affected by a scale down.\n                            The default policy of `Delete` causes the associated PVCs for pods scaled down to be deleted.\n                          enum:\n                          - Retain\n                          - Delete\n                          type: string\n                      type: object\n                    podUpdatePolicy:\n                      description: |-\n                        PodUpdatePolicy indicates how pods should be updated\n\n\n                        - `StrictInPlace` indicates that only allows in-place upgrades.\n                        Any attempt to modify other fields will be rejected.\n                        - `PreferInPlace` indicates that we will first attempt an in-place upgrade of the Pod.\n                        If that fails, it will fall back to the ReCreate, where pod will be recreated.\n                        Default value is \"PreferInPlace\"\n                      enum:\n                      - StrictInPlace\n                      - PreferInPlace\n                      type: string\n                    replicas:\n                      default: 1\n                      description: Specifies the desired number of replicas in the\n                        Component for enhancing availability and durability, or load\n                        balancing.\n                      format: int32\n                      minimum: 0\n                      type: integer\n                    resources:\n                      description: |-\n                        Specifies the resources required by the Component.\n                        It allows defining the CPU, memory requirements and limits for the Component's containers.\n                      properties:\n                        claims:\n                          description: |-\n                            Claims lists the names of resources, defined in spec.resourceClaims,\n                            that are used by this container.\n\n\n                            This is an alpha field and requires enabling the\n                            DynamicResourceAllocation feature gate.\n\n\n                            This field is immutable. It can only be set for containers.\n                          items:\n                            description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                            properties:\n                              name:\n                                description: |-\n                                  Name must match the name of one entry in pod.spec.resourceClaims of\n                                  the Pod where this field is used. It makes that resource available\n                                  inside a container.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        limits:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Limits describes the maximum amount of compute resources allowed.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                        requests:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Requests describes the minimum amount of compute resources required.\n                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                      type: object\n                      x-kubernetes-preserve-unknown-fields: true\n                    schedulingPolicy:\n                      description: |-\n                        Specifies the scheduling policy for the Component.\n                        If defined, it will overwrite the scheduling policy defined in ClusterSpec.\n                      properties:\n                        affinity:\n                          description: Specifies a group of affinity scheduling rules\n                            of the Cluster, including NodeAffinity, PodAffinity, and\n                            PodAntiAffinity.\n                          properties:\n                            nodeAffinity:\n                              description: Describes node affinity scheduling rules\n                                for the pod.\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: |-\n                                      An empty preferred scheduling term matches all objects with implicit weight 0\n                                      (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                    properties:\n                                      preference:\n                                        description: A node selector term, associated\n                                          with the corresponding weight.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      weight:\n                                        description: Weight associated with matching\n                                          the corresponding nodeSelectorTerm, in the\n                                          range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - preference\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to an update), the system\n                                    may or may not try to eventually evict the pod from its node.\n                                  properties:\n                                    nodeSelectorTerms:\n                                      description: Required. A list of node selector\n                                        terms. The terms are ORed.\n                                      items:\n                                        description: |-\n                                          A null or empty node selector term matches no objects. The requirements of\n                                          them are ANDed.\n                                          The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      type: array\n                                  required:\n                                  - nodeSelectorTerms\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                              type: object\n                            podAffinity:\n                              description: Describes pod affinity scheduling rules\n                                (e.g. co-locate this pod in the same node, zone, etc.\n                                as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                            podAntiAffinity:\n                              description: Describes pod anti-affinity scheduling\n                                rules (e.g. avoid putting this pod in the same node,\n                                zone, etc. as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the anti-affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the anti-affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the anti-affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                          type: object\n                        nodeName:\n                          description: |-\n                            NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                            the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                            requirements.\n                          type: string\n                        nodeSelector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            NodeSelector is a selector which must be true for the Pod to fit on a node.\n                            Selector which must match a node's labels for the Pod to be scheduled on that node.\n                            More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        schedulerName:\n                          description: |-\n                            If specified, the Pod will be dispatched by specified scheduler.\n                            If not specified, the Pod will be dispatched by default scheduler.\n                          type: string\n                        tolerations:\n                          description: |-\n                            Allows Pods to be scheduled onto nodes with matching taints.\n                            Each toleration in the array allows the Pod to tolerate node taints based on\n                            specified `key`, `value`, `effect`, and `operator`.\n\n\n                            - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                            - The `operator` determines how the toleration matches the taint.\n\n\n                            Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                          items:\n                            description: |-\n                              The pod this Toleration is attached to tolerates any taint that matches\n                              the triple <key,value,effect> using the matching operator <operator>.\n                            properties:\n                              effect:\n                                description: |-\n                                  Effect indicates the taint effect to match. Empty means match all taint effects.\n                                  When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                type: string\n                              key:\n                                description: |-\n                                  Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                  If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                type: string\n                              operator:\n                                description: |-\n                                  Operator represents a key's relationship to the value.\n                                  Valid operators are Exists and Equal. Defaults to Equal.\n                                  Exists is equivalent to wildcard for value, so that a pod can\n                                  tolerate all taints of a particular category.\n                                type: string\n                              tolerationSeconds:\n                                description: |-\n                                  TolerationSeconds represents the period of time the toleration (which must be\n                                  of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                  it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                  negative values will be treated as 0 (evict immediately) by the system.\n                                format: int64\n                                type: integer\n                              value:\n                                description: |-\n                                  Value is the taint value the toleration matches to.\n                                  If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                type: string\n                            type: object\n                          type: array\n                        topologySpreadConstraints:\n                          description: |-\n                            TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                            domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                            All topologySpreadConstraints are ANDed.\n                          items:\n                            description: TopologySpreadConstraint specifies how to\n                              spread matching pods among the given topology.\n                            properties:\n                              labelSelector:\n                                description: |-\n                                  LabelSelector is used to find matching pods.\n                                  Pods that match this label selector are counted to determine the number of pods\n                                  in their corresponding topology domain.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              matchLabelKeys:\n                                description: |-\n                                  MatchLabelKeys is a set of pod label keys to select the pods over which\n                                  spreading will be calculated. The keys are used to lookup values from the\n                                  incoming pod labels, those key-value labels are ANDed with labelSelector\n                                  to select the group of existing pods over which spreading will be calculated\n                                  for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                  MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                  Keys that don't exist in the incoming pod labels will\n                                  be ignored. A null or empty list means only match against labelSelector.\n\n\n                                  This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              maxSkew:\n                                description: |-\n                                  MaxSkew describes the degree to which pods may be unevenly distributed.\n                                  When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                  between the number of matching pods in the target topology and the global minimum.\n                                  The global minimum is the minimum number of matching pods in an eligible domain\n                                  or zero if the number of eligible domains is less than MinDomains.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 2/2/1:\n                                  In this case, the global minimum is 1.\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |   P   |\n                                  - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                  scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                  violate MaxSkew(1).\n                                  - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                  When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                  to topologies that satisfy it.\n                                  It's a required field. Default value is 1 and 0 is not allowed.\n                                format: int32\n                                type: integer\n                              minDomains:\n                                description: |-\n                                  MinDomains indicates a minimum number of eligible domains.\n                                  When the number of eligible domains with matching topology keys is less than minDomains,\n                                  Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                  And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                  this value has no effect on scheduling.\n                                  As a result, when the number of eligible domains is less than minDomains,\n                                  scheduler won't schedule more than maxSkew Pods to those domains.\n                                  If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                  Valid values are integers greater than 0.\n                                  When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                  For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                  labelSelector spread as 2/2/2:\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |  P P  |\n                                  The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                  In this situation, new pod with the same labelSelector cannot be scheduled,\n                                  because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                  it will violate MaxSkew.\n\n\n                                  This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                format: int32\n                                type: integer\n                              nodeAffinityPolicy:\n                                description: |-\n                                  NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                  when calculating pod topology spread skew. Options are:\n                                  - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                  - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                  If this value is nil, the behavior is equivalent to the Honor policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              nodeTaintsPolicy:\n                                description: |-\n                                  NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                  pod topology spread skew. Options are:\n                                  - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                  has a toleration, are included.\n                                  - Ignore: node taints are ignored. All nodes are included.\n\n\n                                  If this value is nil, the behavior is equivalent to the Ignore policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              topologyKey:\n                                description: |-\n                                  TopologyKey is the key of node labels. Nodes that have a label with this key\n                                  and identical values are considered to be in the same topology.\n                                  We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                  of pods into each bucket.\n                                  We define a domain as a particular instance of a topology.\n                                  Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                  nodeAffinityPolicy and nodeTaintsPolicy.\n                                  e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                  And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                  It's a required field.\n                                type: string\n                              whenUnsatisfiable:\n                                description: |-\n                                  WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                  the spread constraint.\n                                  - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                  - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                    but giving higher precedence to topologies that would help reduce the\n                                    skew.\n                                  A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                  if and only if every possible node assignment for that pod would violate\n                                  \"MaxSkew\" on some topology.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 3/1/1:\n                                  | zone1 | zone2 | zone3 |\n                                  | P P P |   P   |   P   |\n                                  If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                  to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                  MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                  won't make it *more* imbalanced.\n                                  It's a required field.\n                                type: string\n                            required:\n                            - maxSkew\n                            - topologyKey\n                            - whenUnsatisfiable\n                            type: object\n                          type: array\n                      type: object\n                    serviceAccountName:\n                      description: |-\n                        Specifies the name of the ServiceAccount required by the running Component.\n                        This ServiceAccount is used to grant necessary permissions for the Component's Pods to interact\n                        with other Kubernetes resources, such as modifying Pod labels or sending events.\n\n\n                        If not specified, KubeBlocks automatically creates a default ServiceAccount named\n                        \"kb-{componentdefinition.name}\", bound to a role with rules defined in ComponentDefinition's\n                        `policyRules` field. If needed (currently this means if any lifecycleAction is enabled),\n                        it will also be bound to a default role named\n                        \"kubeblocks-cluster-pod-role\", which is installed together with KubeBlocks.\n                        If multiple components use the same ComponentDefinition, they will share one ServiceAccount.\n\n\n                        If the field is not empty, the specified ServiceAccount will be used, and KubeBlocks will not\n                        create a ServiceAccount. But KubeBlocks does create RoleBindings for the specified ServiceAccount.\n                      type: string\n                    serviceRefs:\n                      description: |-\n                        Defines a list of ServiceRef for a Component, enabling access to both external services and\n                        Services provided by other Clusters.\n\n\n                        Types of services:\n\n\n                        - External services: Not managed by KubeBlocks or managed by a different KubeBlocks operator;\n                          Require a ServiceDescriptor for connection details.\n                        - Services provided by a Cluster: Managed by the same KubeBlocks operator;\n                          identified using Cluster, Component and Service names.\n\n\n                        ServiceRefs with identical `serviceRef.name` in the same Cluster are considered the same.\n\n\n                        Example:\n                        ```yaml\n                        serviceRefs:\n                          - name: \"redis-sentinel\"\n                            serviceDescriptor:\n                              name: \"external-redis-sentinel\"\n                          - name: \"postgres-cluster\"\n                            clusterServiceSelector:\n                              cluster: \"my-postgres-cluster\"\n                              service:\n                                component: \"postgresql\"\n                        ```\n                        The example above includes ServiceRefs to an external Redis Sentinel service and a PostgreSQL Cluster.\n                      items:\n                        properties:\n                          cluster:\n                            description: |-\n                              Specifies the name of the KubeBlocks Cluster being referenced.\n                              This is used when services from another KubeBlocks Cluster are consumed.\n\n\n                              By default, the referenced KubeBlocks Cluster's `clusterDefinition.spec.connectionCredential`\n                              will be utilized to bind to the current Component. This credential should include:\n                              `endpoint`, `port`, `username`, and `password`.\n\n\n                              Note:\n\n\n                              - The `ServiceKind` and `ServiceVersion` specified in the service reference within the\n                                ClusterDefinition are not validated when using this approach.\n                              - If both `cluster` and `serviceDescriptor` are present, `cluster` will take precedence.\n\n\n                              Deprecated since v0.9 since `clusterDefinition.spec.connectionCredential` is deprecated,\n                              use `clusterServiceSelector` instead.\n                              This field is maintained for backward compatibility and its use is discouraged.\n                              Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                            type: string\n                          clusterServiceSelector:\n                            description: |-\n                              References a service provided by another KubeBlocks Cluster.\n                              It specifies the ClusterService and the account credentials needed for access.\n                            properties:\n                              cluster:\n                                description: The name of the Cluster being referenced.\n                                type: string\n                              credential:\n                                description: |-\n                                  Specifies the SystemAccount to authenticate and establish a connection with the referenced Cluster.\n                                  The SystemAccount should be defined in `componentDefinition.spec.systemAccounts`\n                                  of the Component providing the service in the referenced Cluster.\n                                properties:\n                                  component:\n                                    description: The name of the Component where the\n                                      credential resides in.\n                                    type: string\n                                  name:\n                                    description: The name of the credential (SystemAccount)\n                                      to reference.\n                                    type: string\n                                required:\n                                - component\n                                - name\n                                type: object\n                              podFQDNs:\n                                properties:\n                                  component:\n                                    description: The name of the Component where the\n                                      pods reside in.\n                                    type: string\n                                  role:\n                                    description: The role of the pods to reference.\n                                    type: string\n                                required:\n                                - component\n                                type: object\n                              service:\n                                description: Identifies a ClusterService from the\n                                  list of Services defined in `cluster.spec.services`\n                                  of the referenced Cluster.\n                                properties:\n                                  component:\n                                    description: |-\n                                      The name of the Component where the Service resides in.\n\n\n                                      It is required when referencing a Component's Service.\n                                    type: string\n                                  port:\n                                    description: |-\n                                      The port name of the Service to be referenced.\n\n\n                                      If there is a non-zero node-port exist for the matched Service port, the node-port will be selected first.\n\n\n                                      If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                      and the resolved value will be presented in the following format: service1.name:port1,service2.name:port2...\n                                    type: string\n                                  service:\n                                    description: |-\n                                      The name of the Service to be referenced.\n\n\n                                      Leave it empty to reference the default Service. Set it to \"headless\" to reference the default headless Service.\n\n\n                                      If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                      and the resolved value will be presented in the following format: service1.name,service2.name...\n                                    type: string\n                                required:\n                                - service\n                                type: object\n                            required:\n                            - cluster\n                            type: object\n                          name:\n                            description: |-\n                              Specifies the identifier of the service reference declaration.\n                              It corresponds to the serviceRefDeclaration name defined in either:\n\n\n                              - `componentDefinition.spec.serviceRefDeclarations[*].name`\n                              - `clusterDefinition.spec.componentDefs[*].serviceRefDeclarations[*].name` (deprecated)\n                            type: string\n                          namespace:\n                            description: |-\n                              Specifies the namespace of the referenced Cluster or the namespace of the referenced ServiceDescriptor object.\n                              If not provided, the referenced Cluster and ServiceDescriptor will be searched in the namespace of the current\n                              Cluster by default.\n                            type: string\n                          serviceDescriptor:\n                            description: |-\n                              Specifies the name of the ServiceDescriptor object that describes a service provided by external sources.\n\n\n                              When referencing a service provided by external sources, a ServiceDescriptor object is required to establish\n                              the service binding.\n                              The `serviceDescriptor.spec.serviceKind` and `serviceDescriptor.spec.serviceVersion` should match the serviceKind\n                              and serviceVersion declared in the definition.\n\n\n                              If both `cluster` and `serviceDescriptor` are specified, the `cluster` takes precedence.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    serviceVersion:\n                      description: |-\n                        ServiceVersion specifies the version of the Service expected to be provisioned by this Component.\n                        The version should follow the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n                        If no version is specified, the latest available version will be used.\n                      maxLength: 32\n                      type: string\n                    services:\n                      description: Overrides services defined in referenced ComponentDefinition.\n                      items:\n                        properties:\n                          annotations:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              If ServiceType is LoadBalancer, cloud provider related parameters can be put here.\n                              More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                            type: object\n                          name:\n                            description: References the ComponentService name defined\n                              in the `componentDefinition.spec.services[*].name`.\n                            maxLength: 25\n                            type: string\n                          podService:\n                            default: false\n                            description: |-\n                              Indicates whether to generate individual Services for each Pod.\n                              If set to true, a separate Service will be created for each Pod in the Cluster.\n                            type: boolean\n                          serviceType:\n                            default: ClusterIP\n                            description: |-\n                              Determines how the Service is exposed. Valid options are `ClusterIP`, `NodePort`, and `LoadBalancer`.\n\n\n                              - `ClusterIP` allocates a Cluster-internal IP address for load-balancing to endpoints.\n                                 Endpoints are determined by the selector or if that is not specified,\n                                 they are determined by manual construction of an Endpoints object or EndpointSlice objects.\n                              - `NodePort` builds on ClusterIP and allocates a port on every node which routes to the same endpoints as the ClusterIP.\n                              - `LoadBalancer` builds on NodePort and creates an external load-balancer (if supported in the current cloud)\n                                 which routes to the same endpoints as the ClusterIP.\n\n\n                              Note: although K8s Service type allows the 'ExternalName' type, it is not a valid option for ClusterComponentService.\n\n\n                              For more info, see:\n                              https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types.\n                            enum:\n                            - ClusterIP\n                            - NodePort\n                            - LoadBalancer\n                            type: string\n                            x-kubernetes-preserve-unknown-fields: true\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    stop:\n                      description: |-\n                        Stop the Component.\n                        If set, all the computing resources will be released.\n                      type: boolean\n                    systemAccounts:\n                      description: Overrides system accounts defined in referenced\n                        ComponentDefinition.\n                      items:\n                        properties:\n                          disabled:\n                            default: false\n                            description: Specifies whether the system account is disabled.\n                            type: boolean\n                          name:\n                            description: The name of the system account.\n                            type: string\n                          passwordConfig:\n                            description: |-\n                              Specifies the policy for generating the account's password.\n\n\n                              This field is immutable once set.\n                            properties:\n                              length:\n                                default: 16\n                                description: The length of the password.\n                                format: int32\n                                maximum: 32\n                                minimum: 8\n                                type: integer\n                              letterCase:\n                                default: MixedCases\n                                description: The case of the letters in the password.\n                                enum:\n                                - LowerCases\n                                - UpperCases\n                                - MixedCases\n                                type: string\n                              numDigits:\n                                default: 4\n                                description: The number of digits in the password.\n                                format: int32\n                                maximum: 8\n                                minimum: 0\n                                type: integer\n                              numSymbols:\n                                default: 0\n                                description: The number of symbols in the password.\n                                format: int32\n                                maximum: 8\n                                minimum: 0\n                                type: integer\n                              seed:\n                                description: |-\n                                  Seed to generate the account's password.\n                                  Cannot be updated.\n                                type: string\n                              symbolCharacters:\n                                description: |-\n                                  The set of symbols allowed when generating password. If empty, kubeblocks will\n                                  use a default symbol set, which is \"!@#&*\".\n                                type: string\n                            type: object\n                          secretRef:\n                            description: |-\n                              Refers to the secret from which data will be copied to create the new account.\n\n\n                              For user-specified passwords, the maximum length is limited to 64 bytes.\n\n\n                              This field is immutable once set.\n                            properties:\n                              name:\n                                description: The unique identifier of the secret.\n                                type: string\n                              namespace:\n                                description: The namespace where the secret is located.\n                                type: string\n                              password:\n                                default: password\n                                description: The key in the secret data that contains\n                                  the password.\n                                type: string\n                            required:\n                            - name\n                            - namespace\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    tls:\n                      description: |-\n                        A boolean flag that indicates whether the Component should use Transport Layer Security (TLS)\n                        for secure communication.\n                        When set to true, the Component will be configured to use TLS encryption for its network connections.\n                        This ensures that the data transmitted between the Component and its clients or other Components is encrypted\n                        and protected from unauthorized access.\n                        If TLS is enabled, the Component may require additional configuration, such as specifying TLS certificates and keys,\n                        to properly set up the secure communication channel.\n                      type: boolean\n                    volumeClaimTemplates:\n                      description: |-\n                        Specifies a list of PersistentVolumeClaim templates that represent the storage requirements for the Component.\n                        Each template specifies the desired characteristics of a persistent volume, such as storage class,\n                        size, and access modes.\n                        These templates are used to dynamically provision persistent volumes for the Component.\n                      items:\n                        properties:\n                          annotations:\n                            additionalProperties:\n                              type: string\n                            description: Specifies the annotations for the PVC of\n                              the volume.\n                            type: object\n                          labels:\n                            additionalProperties:\n                              type: string\n                            description: Specifies the labels for the PVC of the volume.\n                            type: object\n                          name:\n                            description: |-\n                              Refers to the name of a volumeMount defined in either:\n\n\n                              - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                              - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                              The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                            type: string\n                          spec:\n                            description: |-\n                              Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                              with the mount name specified in the `name` field.\n\n\n                              When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                              defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                            properties:\n                              accessModes:\n                                description: |-\n                                  Contains the desired access modes the volume should have.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-preserve-unknown-fields: true\n                              resources:\n                                description: |-\n                                  Represents the minimum resources the volume should have.\n                                  If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                  are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                properties:\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                                x-kubernetes-preserve-unknown-fields: true\n                              storageClassName:\n                                description: |-\n                                  The name of the StorageClass required by the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                type: string\n                              volumeAttributesClassName:\n                                description: |-\n                                  volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n\n\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                type: string\n                              volumeMode:\n                                description: Defines what type of volume is required\n                                  by the claim, either Block or Filesystem.\n                                type: string\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    volumes:\n                      description: List of volumes to override.\n                      items:\n                        description: Volume represents a named volume in a pod that\n                          may be accessed by any container in the pod.\n                        properties:\n                          awsElasticBlockStore:\n                            description: |-\n                              awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              partition:\n                                description: |-\n                                  partition is the partition in the volume that you want to mount.\n                                  If omitted, the default is to mount by volume name.\n                                  Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                  Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                format: int32\n                                type: integer\n                              readOnly:\n                                description: |-\n                                  readOnly value true will force the readOnly setting in VolumeMounts.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                type: boolean\n                              volumeID:\n                                description: |-\n                                  volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          azureDisk:\n                            description: azureDisk represents an Azure Data Disk mount\n                              on the host and bind mount to the pod.\n                            properties:\n                              cachingMode:\n                                description: 'cachingMode is the Host Caching mode:\n                                  None, Read Only, Read Write.'\n                                type: string\n                              diskName:\n                                description: diskName is the Name of the data disk\n                                  in the blob storage\n                                type: string\n                              diskURI:\n                                description: diskURI is the URI of data disk in the\n                                  blob storage\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType is Filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              kind:\n                                description: 'kind expected values are Shared: multiple\n                                  blob disks per storage account  Dedicated: single\n                                  blob disk per storage account  Managed: azure managed\n                                  data disk (only in managed availability set). defaults\n                                  to shared'\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                            required:\n                            - diskName\n                            - diskURI\n                            type: object\n                          azureFile:\n                            description: azureFile represents an Azure File Service\n                              mount on the host and bind mount to the pod.\n                            properties:\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretName:\n                                description: secretName is the  name of secret that\n                                  contains Azure Storage Account Name and Key\n                                type: string\n                              shareName:\n                                description: shareName is the azure share Name\n                                type: string\n                            required:\n                            - secretName\n                            - shareName\n                            type: object\n                          cephfs:\n                            description: cephFS represents a Ceph FS mount on the\n                              host that shares a pod's lifetime\n                            properties:\n                              monitors:\n                                description: |-\n                                  monitors is Required: Monitors is a collection of Ceph monitors\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                items:\n                                  type: string\n                                type: array\n                              path:\n                                description: 'path is Optional: Used as the mounted\n                                  root, rather than the full Ceph tree, default is\n                                  /'\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: boolean\n                              secretFile:\n                                description: |-\n                                  secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: string\n                              secretRef:\n                                description: |-\n                                  secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              user:\n                                description: |-\n                                  user is optional: User is the rados user name, default is admin\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: string\n                            required:\n                            - monitors\n                            type: object\n                          cinder:\n                            description: |-\n                              cinder represents a cinder volume attached and mounted on kubelets host machine.\n                              More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is optional: points to a secret object containing parameters used to connect\n                                  to OpenStack.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              volumeID:\n                                description: |-\n                                  volumeID used to identify the volume in cinder.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          configMap:\n                            description: configMap represents a configMap that should\n                              populate this volume\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items if unspecified, each key-value pair in the Data field of the referenced\n                                  ConfigMap will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the ConfigMap,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: optional specify whether the ConfigMap\n                                  or its keys must be defined\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          csi:\n                            description: csi (Container Storage Interface) represents\n                              ephemeral storage that is handled by certain external\n                              CSI drivers (Beta feature).\n                            properties:\n                              driver:\n                                description: |-\n                                  driver is the name of the CSI driver that handles this volume.\n                                  Consult with your admin for the correct name as registered in the cluster.\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                  If not provided, the empty value is passed to the associated CSI driver\n                                  which will determine the default filesystem to apply.\n                                type: string\n                              nodePublishSecretRef:\n                                description: |-\n                                  nodePublishSecretRef is a reference to the secret object containing\n                                  sensitive information to pass to the CSI driver to complete the CSI\n                                  NodePublishVolume and NodeUnpublishVolume calls.\n                                  This field is optional, and  may be empty if no secret is required. If the\n                                  secret object contains more than one secret, all secret references are passed.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              readOnly:\n                                description: |-\n                                  readOnly specifies a read-only configuration for the volume.\n                                  Defaults to false (read/write).\n                                type: boolean\n                              volumeAttributes:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  volumeAttributes stores driver-specific properties that are passed to the CSI\n                                  driver. Consult your driver's documentation for supported values.\n                                type: object\n                            required:\n                            - driver\n                            type: object\n                          downwardAPI:\n                            description: downwardAPI represents downward API about\n                              the pod that should populate this volume\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  Optional: mode bits to use on created files by default. Must be a\n                                  Optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: Items is a list of downward API volume\n                                  file\n                                items:\n                                  description: DownwardAPIVolumeFile represents information\n                                    to create the file containing the pod field\n                                  properties:\n                                    fieldRef:\n                                      description: 'Required: Selects a field of the\n                                        pod: only annotations, labels, name and namespace\n                                        are supported.'\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    mode:\n                                      description: |-\n                                        Optional: mode bits used to set permissions on this file, must be an octal value\n                                        between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: 'Required: Path is  the relative\n                                        path name of the file to be created. Must\n                                        not be absolute or contain the ''..'' path.\n                                        Must be utf-8 encoded. The first item of the\n                                        relative path must not start with ''..'''\n                                      type: string\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  required:\n                                  - path\n                                  type: object\n                                type: array\n                            type: object\n                          emptyDir:\n                            description: |-\n                              emptyDir represents a temporary directory that shares a pod's lifetime.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                            properties:\n                              medium:\n                                description: |-\n                                  medium represents what type of storage medium should back this directory.\n                                  The default is \"\" which means to use the node's default medium.\n                                  Must be an empty string (default) or Memory.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                type: string\n                              sizeLimit:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                  The size limit is also applicable for memory medium.\n                                  The maximum usage on memory medium EmptyDir would be the minimum value between\n                                  the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                  The default is nil which means that the limit is undefined.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                            type: object\n                          ephemeral:\n                            description: |-\n                              ephemeral represents a volume that is handled by a cluster storage driver.\n                              The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                              and deleted when the pod is removed.\n\n\n                              Use this if:\n                              a) the volume is only needed while the pod runs,\n                              b) features of normal volumes like restoring from snapshot or capacity\n                                 tracking are needed,\n                              c) the storage driver is specified through a storage class, and\n                              d) the storage driver supports dynamic volume provisioning through\n                                 a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                 information on the connection between this volume type\n                                 and PersistentVolumeClaim).\n\n\n                              Use PersistentVolumeClaim or one of the vendor-specific\n                              APIs for volumes that persist for longer than the lifecycle\n                              of an individual pod.\n\n\n                              Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                              be used that way - see the documentation of the driver for\n                              more information.\n\n\n                              A pod can use both types of ephemeral volumes and\n                              persistent volumes at the same time.\n                            properties:\n                              volumeClaimTemplate:\n                                description: |-\n                                  Will be used to create a stand-alone PVC to provision the volume.\n                                  The pod in which this EphemeralVolumeSource is embedded will be the\n                                  owner of the PVC, i.e. the PVC will be deleted together with the\n                                  pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                  `<volume name>` is the name from the `PodSpec.Volumes` array\n                                  entry. Pod validation will reject the pod if the concatenated name\n                                  is not valid for a PVC (for example, too long).\n\n\n                                  An existing PVC with that name that is not owned by the pod\n                                  will *not* be used for the pod to avoid using an unrelated\n                                  volume by mistake. Starting the pod is then blocked until\n                                  the unrelated PVC is removed. If such a pre-created PVC is\n                                  meant to be used by the pod, the PVC has to updated with an\n                                  owner reference to the pod once the pod exists. Normally\n                                  this should not be necessary, but it may be useful when\n                                  manually reconstructing a broken cluster.\n\n\n                                  This field is read-only and no changes will be made by Kubernetes\n                                  to the PVC after it has been created.\n\n\n                                  Required, must not be nil.\n                                properties:\n                                  metadata:\n                                    description: |-\n                                      May contain labels and annotations that will be copied into the PVC\n                                      when creating it. No other fields are allowed and will be rejected during\n                                      validation.\n                                    properties:\n                                      annotations:\n                                        additionalProperties:\n                                          type: string\n                                        type: object\n                                      finalizers:\n                                        items:\n                                          type: string\n                                        type: array\n                                      labels:\n                                        additionalProperties:\n                                          type: string\n                                        type: object\n                                      name:\n                                        type: string\n                                      namespace:\n                                        type: string\n                                    type: object\n                                  spec:\n                                    description: |-\n                                      The specification for the PersistentVolumeClaim. The entire content is\n                                      copied unchanged into the PVC that gets created from this\n                                      template. The same fields as in a PersistentVolumeClaim\n                                      are also valid here.\n                                    properties:\n                                      accessModes:\n                                        description: |-\n                                          accessModes contains the desired access modes the volume should have.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                        items:\n                                          type: string\n                                        type: array\n                                      dataSource:\n                                        description: |-\n                                          dataSource field can be used to specify either:\n                                          * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                          * An existing PVC (PersistentVolumeClaim)\n                                          If the provisioner or an external controller can support the specified data source,\n                                          it will create a new volume based on the contents of the specified data source.\n                                          When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                          and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                          If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                        properties:\n                                          apiGroup:\n                                            description: |-\n                                              APIGroup is the group for the resource being referenced.\n                                              If APIGroup is not specified, the specified Kind must be in the core API group.\n                                              For any other third-party types, APIGroup is required.\n                                            type: string\n                                          kind:\n                                            description: Kind is the type of resource\n                                              being referenced\n                                            type: string\n                                          name:\n                                            description: Name is the name of resource\n                                              being referenced\n                                            type: string\n                                        required:\n                                        - kind\n                                        - name\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      dataSourceRef:\n                                        description: |-\n                                          dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                          volume is desired. This may be any object from a non-empty API group (non\n                                          core object) or a PersistentVolumeClaim object.\n                                          When this field is specified, volume binding will only succeed if the type of\n                                          the specified object matches some installed volume populator or dynamic\n                                          provisioner.\n                                          This field will replace the functionality of the dataSource field and as such\n                                          if both fields are non-empty, they must have the same value. For backwards\n                                          compatibility, when namespace isn't specified in dataSourceRef,\n                                          both fields (dataSource and dataSourceRef) will be set to the same\n                                          value automatically if one of them is empty and the other is non-empty.\n                                          When namespace is specified in dataSourceRef,\n                                          dataSource isn't set to the same value and must be empty.\n                                          There are three important differences between dataSource and dataSourceRef:\n                                          * While dataSource only allows two specific types of objects, dataSourceRef\n                                            allows any non-core object, as well as PersistentVolumeClaim objects.\n                                          * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                            preserves all values, and generates an error if a disallowed value is\n                                            specified.\n                                          * While dataSource only allows local objects, dataSourceRef allows objects\n                                            in any namespaces.\n                                          (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                          (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                        properties:\n                                          apiGroup:\n                                            description: |-\n                                              APIGroup is the group for the resource being referenced.\n                                              If APIGroup is not specified, the specified Kind must be in the core API group.\n                                              For any other third-party types, APIGroup is required.\n                                            type: string\n                                          kind:\n                                            description: Kind is the type of resource\n                                              being referenced\n                                            type: string\n                                          name:\n                                            description: Name is the name of resource\n                                              being referenced\n                                            type: string\n                                          namespace:\n                                            description: |-\n                                              Namespace is the namespace of resource being referenced\n                                              Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                              (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                            type: string\n                                        required:\n                                        - kind\n                                        - name\n                                        type: object\n                                      resources:\n                                        description: |-\n                                          resources represents the minimum resources the volume should have.\n                                          If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                          that are lower than previous value but must still be higher than capacity recorded in the\n                                          status field of the claim.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                        properties:\n                                          limits:\n                                            additionalProperties:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            description: |-\n                                              Limits describes the maximum amount of compute resources allowed.\n                                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                            type: object\n                                          requests:\n                                            additionalProperties:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            description: |-\n                                              Requests describes the minimum amount of compute resources required.\n                                              If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                              otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                            type: object\n                                        type: object\n                                      selector:\n                                        description: selector is a label query over\n                                          volumes to consider for binding.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      storageClassName:\n                                        description: |-\n                                          storageClassName is the name of the StorageClass required by the claim.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                        type: string\n                                      volumeAttributesClassName:\n                                        description: |-\n                                          volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                          If specified, the CSI driver will create or update the volume with the attributes defined\n                                          in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                          it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                          will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                          If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                          will be set by the persistentvolume controller if it exists.\n                                          If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                          set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                          exists.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                          (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                        type: string\n                                      volumeMode:\n                                        description: |-\n                                          volumeMode defines what type of volume is required by the claim.\n                                          Value of Filesystem is implied when not included in claim spec.\n                                        type: string\n                                      volumeName:\n                                        description: volumeName is the binding reference\n                                          to the PersistentVolume backing this claim.\n                                        type: string\n                                    type: object\n                                required:\n                                - spec\n                                type: object\n                            type: object\n                          fc:\n                            description: fc represents a Fibre Channel resource that\n                              is attached to a kubelet's host machine and then exposed\n                              to the pod.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              lun:\n                                description: 'lun is Optional: FC target lun number'\n                                format: int32\n                                type: integer\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              targetWWNs:\n                                description: 'targetWWNs is Optional: FC target worldwide\n                                  names (WWNs)'\n                                items:\n                                  type: string\n                                type: array\n                              wwids:\n                                description: |-\n                                  wwids Optional: FC volume world wide identifiers (wwids)\n                                  Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          flexVolume:\n                            description: |-\n                              flexVolume represents a generic volume resource that is\n                              provisioned/attached using an exec based plugin.\n                            properties:\n                              driver:\n                                description: driver is the name of the driver to use\n                                  for this volume.\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                type: string\n                              options:\n                                additionalProperties:\n                                  type: string\n                                description: 'options is Optional: this field holds\n                                  extra command options if any.'\n                                type: object\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is Optional: secretRef is reference to the secret object containing\n                                  sensitive information to pass to the plugin scripts. This may be\n                                  empty if no secret object is specified. If the secret object\n                                  contains more than one secret, all secrets are passed to the plugin\n                                  scripts.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            required:\n                            - driver\n                            type: object\n                          flocker:\n                            description: flocker represents a Flocker volume attached\n                              to a kubelet's host machine. This depends on the Flocker\n                              control service being running\n                            properties:\n                              datasetName:\n                                description: |-\n                                  datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                  should be considered as deprecated\n                                type: string\n                              datasetUUID:\n                                description: datasetUUID is the UUID of the dataset.\n                                  This is unique identifier of a Flocker dataset\n                                type: string\n                            type: object\n                          gcePersistentDisk:\n                            description: |-\n                              gcePersistentDisk represents a GCE Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              partition:\n                                description: |-\n                                  partition is the partition in the volume that you want to mount.\n                                  If omitted, the default is to mount by volume name.\n                                  Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                  Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                format: int32\n                                type: integer\n                              pdName:\n                                description: |-\n                                  pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                type: boolean\n                            required:\n                            - pdName\n                            type: object\n                          gitRepo:\n                            description: |-\n                              gitRepo represents a git repository at a particular revision.\n                              DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                              EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                              into the Pod's container.\n                            properties:\n                              directory:\n                                description: |-\n                                  directory is the target directory name.\n                                  Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                  git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                  the subdirectory with the given name.\n                                type: string\n                              repository:\n                                description: repository is the URL\n                                type: string\n                              revision:\n                                description: revision is the commit hash for the specified\n                                  revision.\n                                type: string\n                            required:\n                            - repository\n                            type: object\n                          glusterfs:\n                            description: |-\n                              glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                              More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                            properties:\n                              endpoints:\n                                description: |-\n                                  endpoints is the endpoint name that details Glusterfs topology.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: string\n                              path:\n                                description: |-\n                                  path is the Glusterfs volume path.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                  Defaults to false.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: boolean\n                            required:\n                            - endpoints\n                            - path\n                            type: object\n                          hostPath:\n                            description: |-\n                              hostPath represents a pre-existing file or directory on the host\n                              machine that is directly exposed to the container. This is generally\n                              used for system agents or other privileged things that are allowed\n                              to see the host machine. Most containers will NOT need this.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                              ---\n                              TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                              mount host directories as read/write.\n                            properties:\n                              path:\n                                description: |-\n                                  path of the directory on the host.\n                                  If the path is a symlink, it will follow the link to the real path.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                type: string\n                              type:\n                                description: |-\n                                  type for HostPath Volume\n                                  Defaults to \"\"\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                type: string\n                            required:\n                            - path\n                            type: object\n                          iscsi:\n                            description: |-\n                              iscsi represents an ISCSI Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://examples.k8s.io/volumes/iscsi/README.md\n                            properties:\n                              chapAuthDiscovery:\n                                description: chapAuthDiscovery defines whether support\n                                  iSCSI Discovery CHAP authentication\n                                type: boolean\n                              chapAuthSession:\n                                description: chapAuthSession defines whether support\n                                  iSCSI Session CHAP authentication\n                                type: boolean\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              initiatorName:\n                                description: |-\n                                  initiatorName is the custom iSCSI Initiator Name.\n                                  If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                  <target portal>:<volume name> will be created for the connection.\n                                type: string\n                              iqn:\n                                description: iqn is the target iSCSI Qualified Name.\n                                type: string\n                              iscsiInterface:\n                                description: |-\n                                  iscsiInterface is the interface Name that uses an iSCSI transport.\n                                  Defaults to 'default' (tcp).\n                                type: string\n                              lun:\n                                description: lun represents iSCSI Target Lun number.\n                                format: int32\n                                type: integer\n                              portals:\n                                description: |-\n                                  portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                  is other than default (typically TCP ports 860 and 3260).\n                                items:\n                                  type: string\n                                type: array\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                type: boolean\n                              secretRef:\n                                description: secretRef is the CHAP Secret for iSCSI\n                                  target and initiator authentication\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              targetPortal:\n                                description: |-\n                                  targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                  is other than default (typically TCP ports 860 and 3260).\n                                type: string\n                            required:\n                            - iqn\n                            - lun\n                            - targetPortal\n                            type: object\n                          name:\n                            description: |-\n                              name of the volume.\n                              Must be a DNS_LABEL and unique within the pod.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            type: string\n                          nfs:\n                            description: |-\n                              nfs represents an NFS mount on the host that shares a pod's lifetime\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                            properties:\n                              path:\n                                description: |-\n                                  path that is exported by the NFS server.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the NFS export to be mounted with read-only permissions.\n                                  Defaults to false.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: boolean\n                              server:\n                                description: |-\n                                  server is the hostname or IP address of the NFS server.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: string\n                            required:\n                            - path\n                            - server\n                            type: object\n                          persistentVolumeClaim:\n                            description: |-\n                              persistentVolumeClaimVolumeSource represents a reference to a\n                              PersistentVolumeClaim in the same namespace.\n                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                            properties:\n                              claimName:\n                                description: |-\n                                  claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Will force the ReadOnly setting in VolumeMounts.\n                                  Default false.\n                                type: boolean\n                            required:\n                            - claimName\n                            type: object\n                          photonPersistentDisk:\n                            description: photonPersistentDisk represents a PhotonController\n                              persistent disk attached and mounted on kubelets host\n                              machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              pdID:\n                                description: pdID is the ID that identifies Photon\n                                  Controller persistent disk\n                                type: string\n                            required:\n                            - pdID\n                            type: object\n                          portworxVolume:\n                            description: portworxVolume represents a portworx volume\n                              attached and mounted on kubelets host machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fSType represents the filesystem type to mount\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              volumeID:\n                                description: volumeID uniquely identifies a Portworx\n                                  volume\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          projected:\n                            description: projected items for all in one resources\n                              secrets, configmaps, and downward API\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode are the mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              sources:\n                                description: sources is the list of volume projections\n                                items:\n                                  description: Projection that may be projected along\n                                    with other supported volume types\n                                  properties:\n                                    clusterTrustBundle:\n                                      description: |-\n                                        ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                        of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                        Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                        ClusterTrustBundle objects can either be selected by name, or by the\n                                        combination of signer name and a label selector.\n\n\n                                        Kubelet performs aggressive normalization of the PEM contents written\n                                        into the pod filesystem.  Esoteric PEM features such as inter-block\n                                        comments and block headers are stripped.  Certificates are deduplicated.\n                                        The ordering of certificates within the file is arbitrary, and Kubelet\n                                        may change the order over time.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            Select all ClusterTrustBundles that match this label selector.  Only has\n                                            effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                            interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                            everything\".\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        name:\n                                          description: |-\n                                            Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                            with signerName and labelSelector.\n                                          type: string\n                                        optional:\n                                          description: |-\n                                            If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                            aren't available.  If using name, then the named ClusterTrustBundle is\n                                            allowed not to exist.  If using signerName, then the combination of\n                                            signerName and labelSelector is allowed to match zero\n                                            ClusterTrustBundles.\n                                          type: boolean\n                                        path:\n                                          description: Relative path from the volume\n                                            root to write the bundle.\n                                          type: string\n                                        signerName:\n                                          description: |-\n                                            Select all ClusterTrustBundles that match this signer name.\n                                            Mutually-exclusive with name.  The contents of all selected\n                                            ClusterTrustBundles will be unified and deduplicated.\n                                          type: string\n                                      required:\n                                      - path\n                                      type: object\n                                    configMap:\n                                      description: configMap information about the\n                                        configMap data to project\n                                      properties:\n                                        items:\n                                          description: |-\n                                            items if unspecified, each key-value pair in the Data field of the referenced\n                                            ConfigMap will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the ConfigMap,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: optional specify whether the\n                                            ConfigMap or its keys must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    downwardAPI:\n                                      description: downwardAPI information about the\n                                        downwardAPI data to project\n                                      properties:\n                                        items:\n                                          description: Items is a list of DownwardAPIVolume\n                                            file\n                                          items:\n                                            description: DownwardAPIVolumeFile represents\n                                              information to create the file containing\n                                              the pod field\n                                            properties:\n                                              fieldRef:\n                                                description: 'Required: Selects a\n                                                  field of the pod: only annotations,\n                                                  labels, name and namespace are supported.'\n                                                properties:\n                                                  apiVersion:\n                                                    description: Version of the schema\n                                                      the FieldPath is written in\n                                                      terms of, defaults to \"v1\".\n                                                    type: string\n                                                  fieldPath:\n                                                    description: Path of the field\n                                                      to select in the specified API\n                                                      version.\n                                                    type: string\n                                                required:\n                                                - fieldPath\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              mode:\n                                                description: |-\n                                                  Optional: mode bits used to set permissions on this file, must be an octal value\n                                                  between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: 'Required: Path is  the\n                                                  relative path name of the file to\n                                                  be created. Must not be absolute\n                                                  or contain the ''..'' path. Must\n                                                  be utf-8 encoded. The first item\n                                                  of the relative path must not start\n                                                  with ''..'''\n                                                type: string\n                                              resourceFieldRef:\n                                                description: |-\n                                                  Selects a resource of the container: only resources limits and requests\n                                                  (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                properties:\n                                                  containerName:\n                                                    description: 'Container name:\n                                                      required for volumes, optional\n                                                      for env vars'\n                                                    type: string\n                                                  divisor:\n                                                    anyOf:\n                                                    - type: integer\n                                                    - type: string\n                                                    description: Specifies the output\n                                                      format of the exposed resources,\n                                                      defaults to \"1\"\n                                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                    x-kubernetes-int-or-string: true\n                                                  resource:\n                                                    description: 'Required: resource\n                                                      to select'\n                                                    type: string\n                                                required:\n                                                - resource\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                            required:\n                                            - path\n                                            type: object\n                                          type: array\n                                      type: object\n                                    secret:\n                                      description: secret information about the secret\n                                        data to project\n                                      properties:\n                                        items:\n                                          description: |-\n                                            items if unspecified, each key-value pair in the Data field of the referenced\n                                            Secret will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the Secret,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: optional field specify whether\n                                            the Secret or its key must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    serviceAccountToken:\n                                      description: serviceAccountToken is information\n                                        about the serviceAccountToken data to project\n                                      properties:\n                                        audience:\n                                          description: |-\n                                            audience is the intended audience of the token. A recipient of a token\n                                            must identify itself with an identifier specified in the audience of the\n                                            token, and otherwise should reject the token. The audience defaults to the\n                                            identifier of the apiserver.\n                                          type: string\n                                        expirationSeconds:\n                                          description: |-\n                                            expirationSeconds is the requested duration of validity of the service\n                                            account token. As the token approaches expiration, the kubelet volume\n                                            plugin will proactively rotate the service account token. The kubelet will\n                                            start trying to rotate the token if the token is older than 80 percent of\n                                            its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                            and must be at least 10 minutes.\n                                          format: int64\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the path relative to the mount point of the file to project the\n                                            token into.\n                                          type: string\n                                      required:\n                                      - path\n                                      type: object\n                                  type: object\n                                type: array\n                            type: object\n                          quobyte:\n                            description: quobyte represents a Quobyte mount on the\n                              host that shares a pod's lifetime\n                            properties:\n                              group:\n                                description: |-\n                                  group to map volume access to\n                                  Default is no group\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                  Defaults to false.\n                                type: boolean\n                              registry:\n                                description: |-\n                                  registry represents a single or multiple Quobyte Registry services\n                                  specified as a string as host:port pair (multiple entries are separated with commas)\n                                  which acts as the central registry for volumes\n                                type: string\n                              tenant:\n                                description: |-\n                                  tenant owning the given Quobyte volume in the Backend\n                                  Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                type: string\n                              user:\n                                description: |-\n                                  user to map volume access to\n                                  Defaults to serivceaccount user\n                                type: string\n                              volume:\n                                description: volume is a string that references an\n                                  already created Quobyte volume by name.\n                                type: string\n                            required:\n                            - registry\n                            - volume\n                            type: object\n                          rbd:\n                            description: |-\n                              rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                              More info: https://examples.k8s.io/volumes/rbd/README.md\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              image:\n                                description: |-\n                                  image is the rados image name.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              keyring:\n                                description: |-\n                                  keyring is the path to key ring for RBDUser.\n                                  Default is /etc/ceph/keyring.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              monitors:\n                                description: |-\n                                  monitors is a collection of Ceph monitors.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                items:\n                                  type: string\n                                type: array\n                              pool:\n                                description: |-\n                                  pool is the rados pool name.\n                                  Default is rbd.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is name of the authentication secret for RBDUser. If provided\n                                  overrides keyring.\n                                  Default is nil.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              user:\n                                description: |-\n                                  user is the rados user name.\n                                  Default is admin.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                            required:\n                            - image\n                            - monitors\n                            type: object\n                          scaleIO:\n                            description: scaleIO represents a ScaleIO persistent volume\n                              attached and mounted on Kubernetes nodes.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                  Default is \"xfs\".\n                                type: string\n                              gateway:\n                                description: gateway is the host address of the ScaleIO\n                                  API Gateway.\n                                type: string\n                              protectionDomain:\n                                description: protectionDomain is the name of the ScaleIO\n                                  Protection Domain for the configured storage.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef references to the secret for ScaleIO user and other\n                                  sensitive information. If this is not provided, Login operation will fail.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              sslEnabled:\n                                description: sslEnabled Flag enable/disable SSL communication\n                                  with Gateway, default false\n                                type: boolean\n                              storageMode:\n                                description: |-\n                                  storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                  Default is ThinProvisioned.\n                                type: string\n                              storagePool:\n                                description: storagePool is the ScaleIO Storage Pool\n                                  associated with the protection domain.\n                                type: string\n                              system:\n                                description: system is the name of the storage system\n                                  as configured in ScaleIO.\n                                type: string\n                              volumeName:\n                                description: |-\n                                  volumeName is the name of a volume already created in the ScaleIO system\n                                  that is associated with this volume source.\n                                type: string\n                            required:\n                            - gateway\n                            - secretRef\n                            - system\n                            type: object\n                          secret:\n                            description: |-\n                              secret represents a secret that should populate this volume.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values\n                                  for mode bits. Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items If unspecified, each key-value pair in the Data field of the referenced\n                                  Secret will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the Secret,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              optional:\n                                description: optional field specify whether the Secret\n                                  or its keys must be defined\n                                type: boolean\n                              secretName:\n                                description: |-\n                                  secretName is the name of the secret in the pod's namespace to use.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                type: string\n                            type: object\n                          storageos:\n                            description: storageOS represents a StorageOS volume attached\n                              and mounted on Kubernetes nodes.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef specifies the secret to use for obtaining the StorageOS API\n                                  credentials.  If not specified, default values will be attempted.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              volumeName:\n                                description: |-\n                                  volumeName is the human-readable name of the StorageOS volume.  Volume\n                                  names are only unique within a namespace.\n                                type: string\n                              volumeNamespace:\n                                description: |-\n                                  volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                  namespace is specified then the Pod's namespace will be used.  This allows the\n                                  Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                  Set VolumeName to any name to override the default behaviour.\n                                  Set to \"default\" if you are not using namespaces within StorageOS.\n                                  Namespaces that do not pre-exist within StorageOS will be created.\n                                type: string\n                            type: object\n                          vsphereVolume:\n                            description: vsphereVolume represents a vSphere volume\n                              attached and mounted on kubelets host machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              storagePolicyID:\n                                description: storagePolicyID is the storage Policy\n                                  Based Management (SPBM) profile ID associated with\n                                  the StoragePolicyName.\n                                type: string\n                              storagePolicyName:\n                                description: storagePolicyName is the storage Policy\n                                  Based Management (SPBM) profile name.\n                                type: string\n                              volumePath:\n                                description: volumePath is the path that identifies\n                                  vSphere volume vmdk\n                                type: string\n                            required:\n                            - volumePath\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                  required:\n                  - replicas\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n                x-kubernetes-validations:\n                - message: duplicated component\n                  rule: self.all(x, size(self.filter(c, c.name == x.name)) == 1)\n                - message: two kinds of definition API can not be used simultaneously\n                  rule: self.all(x, size(self.filter(c, has(c.componentDef))) == 0)\n                    || self.all(x, size(self.filter(c, has(c.componentDef))) == size(self))\n              runtimeClassName:\n                description: Specifies runtimeClassName for all Pods managed by this\n                  Cluster.\n                type: string\n              schedulingPolicy:\n                description: Specifies the scheduling policy for the Cluster.\n                properties:\n                  affinity:\n                    description: Specifies a group of affinity scheduling rules of\n                      the Cluster, including NodeAffinity, PodAffinity, and PodAntiAffinity.\n                    properties:\n                      nodeAffinity:\n                        description: Describes node affinity scheduling rules for\n                          the pod.\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: |-\n                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                              properties:\n                                preference:\n                                  description: A node selector term, associated with\n                                    the corresponding weight.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                weight:\n                                  description: Weight associated with matching the\n                                    corresponding nodeSelectorTerm, in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - preference\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to an update), the system\n                              may or may not try to eventually evict the pod from its node.\n                            properties:\n                              nodeSelectorTerms:\n                                description: Required. A list of node selector terms.\n                                  The terms are ORed.\n                                items:\n                                  description: |-\n                                    A null or empty node selector term matches no objects. The requirements of\n                                    them are ANDed.\n                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                type: array\n                            required:\n                            - nodeSelectorTerms\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                      podAffinity:\n                        description: Describes pod affinity scheduling rules (e.g.\n                          co-locate this pod in the same node, zone, etc. as some\n                          other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                      podAntiAffinity:\n                        description: Describes pod anti-affinity scheduling rules\n                          (e.g. avoid putting this pod in the same node, zone, etc.\n                          as some other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the anti-affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the anti-affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the anti-affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                    type: object\n                  nodeName:\n                    description: |-\n                      NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                      the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                      requirements.\n                    type: string\n                  nodeSelector:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      NodeSelector is a selector which must be true for the Pod to fit on a node.\n                      Selector which must match a node's labels for the Pod to be scheduled on that node.\n                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  schedulerName:\n                    description: |-\n                      If specified, the Pod will be dispatched by specified scheduler.\n                      If not specified, the Pod will be dispatched by default scheduler.\n                    type: string\n                  tolerations:\n                    description: |-\n                      Allows Pods to be scheduled onto nodes with matching taints.\n                      Each toleration in the array allows the Pod to tolerate node taints based on\n                      specified `key`, `value`, `effect`, and `operator`.\n\n\n                      - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                      - The `operator` determines how the toleration matches the taint.\n\n\n                      Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                    items:\n                      description: |-\n                        The pod this Toleration is attached to tolerates any taint that matches\n                        the triple <key,value,effect> using the matching operator <operator>.\n                      properties:\n                        effect:\n                          description: |-\n                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                          type: string\n                        key:\n                          description: |-\n                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                          type: string\n                        operator:\n                          description: |-\n                            Operator represents a key's relationship to the value.\n                            Valid operators are Exists and Equal. Defaults to Equal.\n                            Exists is equivalent to wildcard for value, so that a pod can\n                            tolerate all taints of a particular category.\n                          type: string\n                        tolerationSeconds:\n                          description: |-\n                            TolerationSeconds represents the period of time the toleration (which must be\n                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                            negative values will be treated as 0 (evict immediately) by the system.\n                          format: int64\n                          type: integer\n                        value:\n                          description: |-\n                            Value is the taint value the toleration matches to.\n                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                          type: string\n                      type: object\n                    type: array\n                  topologySpreadConstraints:\n                    description: |-\n                      TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                      domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                      All topologySpreadConstraints are ANDed.\n                    items:\n                      description: TopologySpreadConstraint specifies how to spread\n                        matching pods among the given topology.\n                      properties:\n                        labelSelector:\n                          description: |-\n                            LabelSelector is used to find matching pods.\n                            Pods that match this label selector are counted to determine the number of pods\n                            in their corresponding topology domain.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        matchLabelKeys:\n                          description: |-\n                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                            spreading will be calculated. The keys are used to lookup values from the\n                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                            to select the group of existing pods over which spreading will be calculated\n                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                            Keys that don't exist in the incoming pod labels will\n                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        maxSkew:\n                          description: |-\n                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                            between the number of matching pods in the target topology and the global minimum.\n                            The global minimum is the minimum number of matching pods in an eligible domain\n                            or zero if the number of eligible domains is less than MinDomains.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 2/2/1:\n                            In this case, the global minimum is 1.\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |   P   |\n                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                            violate MaxSkew(1).\n                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                            to topologies that satisfy it.\n                            It's a required field. Default value is 1 and 0 is not allowed.\n                          format: int32\n                          type: integer\n                        minDomains:\n                          description: |-\n                            MinDomains indicates a minimum number of eligible domains.\n                            When the number of eligible domains with matching topology keys is less than minDomains,\n                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                            this value has no effect on scheduling.\n                            As a result, when the number of eligible domains is less than minDomains,\n                            scheduler won't schedule more than maxSkew Pods to those domains.\n                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                            Valid values are integers greater than 0.\n                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                            labelSelector spread as 2/2/2:\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |  P P  |\n                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                            it will violate MaxSkew.\n\n\n                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                          format: int32\n                          type: integer\n                        nodeAffinityPolicy:\n                          description: |-\n                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                            when calculating pod topology spread skew. Options are:\n                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                            If this value is nil, the behavior is equivalent to the Honor policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        nodeTaintsPolicy:\n                          description: |-\n                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                            pod topology spread skew. Options are:\n                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                            has a toleration, are included.\n                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        topologyKey:\n                          description: |-\n                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                            and identical values are considered to be in the same topology.\n                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                            of pods into each bucket.\n                            We define a domain as a particular instance of a topology.\n                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                            nodeAffinityPolicy and nodeTaintsPolicy.\n                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                            It's a required field.\n                          type: string\n                        whenUnsatisfiable:\n                          description: |-\n                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                            the spread constraint.\n                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                              but giving higher precedence to topologies that would help reduce the\n                              skew.\n                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                            if and only if every possible node assignment for that pod would violate\n                            \"MaxSkew\" on some topology.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 3/1/1:\n                            | zone1 | zone2 | zone3 |\n                            | P P P |   P   |   P   |\n                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                            won't make it *more* imbalanced.\n                            It's a required field.\n                          type: string\n                      required:\n                      - maxSkew\n                      - topologyKey\n                      - whenUnsatisfiable\n                      type: object\n                    type: array\n                type: object\n              services:\n                description: |-\n                  Defines a list of additional Services that are exposed by a Cluster.\n                  This field allows Services of selected Components, either from `componentSpecs` or `shardings` to be exposed,\n                  alongside Services defined with ComponentService.\n\n\n                  Services defined here can be referenced by other clusters using the ServiceRefClusterSelector.\n                items:\n                  description: |-\n                    ClusterService defines a service that is exposed externally, allowing entities outside the cluster to access it.\n                    For example, external applications, or other Clusters.\n                    And another Cluster managed by the same KubeBlocks operator can resolve the address exposed by a ClusterService\n                    using the `serviceRef` field.\n\n\n                    When a Component needs to access another Cluster's ClusterService using the `serviceRef` field,\n                    it must also define the service type and version information in the `componentDefinition.spec.serviceRefDeclarations`\n                    section.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        If ServiceType is LoadBalancer, cloud provider related parameters can be put here\n                        More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                      type: object\n                    componentSelector:\n                      description: |-\n                        Extends the ServiceSpec.Selector by allowing the specification of components, to be used as a selector for the service.\n\n\n                        If the `componentSelector` is set as the name of a sharding, the service will be exposed to all components in the sharding.\n                      type: string\n                    name:\n                      description: |-\n                        Name defines the name of the service.\n                        otherwise, it indicates the name of the service.\n                        Others can refer to this service by its name. (e.g., connection credential)\n                        Cannot be updated.\n                      maxLength: 25\n                      type: string\n                    roleSelector:\n                      description: \"Extends the above `serviceSpec.selector` by allowing\n                        you to specify defined role as selector for the service.\\nWhen\n                        `roleSelector` is set, it adds a label selector \\\"kubeblocks.io/role:\n                        {roleSelector}\\\"\\nto the `serviceSpec.selector`.\\nExample\n                        usage:\\n\\n\\n\\t  roleSelector: \\\"leader\\\"\\n\\n\\nIn this example,\n                        setting `roleSelector` to \\\"leader\\\" will add a label selector\\n\\\"kubeblocks.io/role:\n                        leader\\\" to the `serviceSpec.selector`.\\nThis means that the\n                        service will select and route traffic to Pods with the label\\n\\\"kubeblocks.io/role\\\"\n                        set to \\\"leader\\\".\\n\\n\\nNote that if `podService` sets to\n                        true, RoleSelector will be ignored.\\nThe `podService` flag\n                        takes precedence over `roleSelector` and generates a service\n                        for each Pod.\"\n                      type: string\n                    serviceName:\n                      description: |-\n                        ServiceName defines the name of the underlying service object.\n                        If not specified, the default service name with different patterns will be used:\n\n\n                        - CLUSTER_NAME: for cluster-level services\n                        - CLUSTER_NAME-COMPONENT_NAME: for component-level services\n\n\n                        Only one default service name is allowed.\n                        Cannot be updated.\n                      maxLength: 25\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    spec:\n                      description: |-\n                        Spec defines the behavior of a service.\n                        https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                      properties:\n                        allocateLoadBalancerNodePorts:\n                          description: |-\n                            allocateLoadBalancerNodePorts defines if NodePorts will be automatically\n                            allocated for services with type LoadBalancer.  Default is \"true\". It\n                            may be set to \"false\" if the cluster load-balancer does not rely on\n                            NodePorts.  If the caller requests specific NodePorts (by specifying a\n                            value), those requests will be respected, regardless of this field.\n                            This field may only be set for services with type LoadBalancer and will\n                            be cleared if the type is changed to any other type.\n                          type: boolean\n                        clusterIP:\n                          description: |-\n                            clusterIP is the IP address of the service and is usually assigned\n                            randomly. If an address is specified manually, is in-range (as per\n                            system configuration), and is not in use, it will be allocated to the\n                            service; otherwise creation of the service will fail. This field may not\n                            be changed through updates unless the type field is also being changed\n                            to ExternalName (which requires this field to be blank) or the type\n                            field is being changed from ExternalName (in which case this field may\n                            optionally be specified, as describe above).  Valid values are \"None\",\n                            empty string (\"\"), or a valid IP address. Setting this to \"None\" makes a\n                            \"headless service\" (no virtual IP), which is useful when direct endpoint\n                            connections are preferred and proxying is not required.  Only applies to\n                            types ClusterIP, NodePort, and LoadBalancer. If this field is specified\n                            when creating a Service of type ExternalName, creation will fail. This\n                            field will be wiped when updating a Service to type ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        clusterIPs:\n                          description: |-\n                            ClusterIPs is a list of IP addresses assigned to this service, and are\n                            usually assigned randomly.  If an address is specified manually, is\n                            in-range (as per system configuration), and is not in use, it will be\n                            allocated to the service; otherwise creation of the service will fail.\n                            This field may not be changed through updates unless the type field is\n                            also being changed to ExternalName (which requires this field to be\n                            empty) or the type field is being changed from ExternalName (in which\n                            case this field may optionally be specified, as describe above).  Valid\n                            values are \"None\", empty string (\"\"), or a valid IP address.  Setting\n                            this to \"None\" makes a \"headless service\" (no virtual IP), which is\n                            useful when direct endpoint connections are preferred and proxying is\n                            not required.  Only applies to types ClusterIP, NodePort, and\n                            LoadBalancer. If this field is specified when creating a Service of type\n                            ExternalName, creation will fail. This field will be wiped when updating\n                            a Service to type ExternalName.  If this field is not specified, it will\n                            be initialized from the clusterIP field.  If this field is specified,\n                            clients must ensure that clusterIPs[0] and clusterIP have the same\n                            value.\n\n\n                            This field may hold a maximum of two entries (dual-stack IPs, in either order).\n                            These IPs must correspond to the values of the ipFamilies field. Both\n                            clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        externalIPs:\n                          description: |-\n                            externalIPs is a list of IP addresses for which nodes in the cluster\n                            will also accept traffic for this service.  These IPs are not managed by\n                            Kubernetes.  The user is responsible for ensuring that traffic arrives\n                            at a node with this IP.  A common example is external load-balancers\n                            that are not part of the Kubernetes system.\n                          items:\n                            type: string\n                          type: array\n                        externalName:\n                          description: |-\n                            externalName is the external reference that discovery mechanisms will\n                            return as an alias for this service (e.g. a DNS CNAME record). No\n                            proxying will be involved.  Must be a lowercase RFC-1123 hostname\n                            (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".\n                          type: string\n                        externalTrafficPolicy:\n                          description: |-\n                            externalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on one of the Service's \"externally-facing\" addresses (NodePorts,\n                            ExternalIPs, and LoadBalancer IPs). If set to \"Local\", the proxy will configure\n                            the service in a way that assumes that external load balancers will take care\n                            of balancing the service traffic between nodes, and so each node will deliver\n                            traffic only to the node-local endpoints of the service, without masquerading\n                            the client source IP. (Traffic mistakenly sent to a node with no endpoints will\n                            be dropped.) The default value, \"Cluster\", uses the standard behavior of\n                            routing to all endpoints evenly (possibly modified by topology and other\n                            features). Note that traffic sent to an External IP or LoadBalancer IP from\n                            within the cluster will always get \"Cluster\" semantics, but clients sending to\n                            a NodePort from within the cluster may need to take traffic policy into account\n                            when picking a node.\n                          type: string\n                        healthCheckNodePort:\n                          description: |-\n                            healthCheckNodePort specifies the healthcheck nodePort for the service.\n                            This only applies when type is set to LoadBalancer and\n                            externalTrafficPolicy is set to Local. If a value is specified, is\n                            in-range, and is not in use, it will be used.  If not specified, a value\n                            will be automatically allocated.  External systems (e.g. load-balancers)\n                            can use this port to determine if a given node holds endpoints for this\n                            service or not.  If this field is specified when creating a Service\n                            which does not need it, creation will fail. This field will be wiped\n                            when updating a Service to no longer need it (e.g. changing type).\n                            This field cannot be updated once set.\n                          format: int32\n                          type: integer\n                        internalTrafficPolicy:\n                          description: |-\n                            InternalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on the ClusterIP. If set to \"Local\", the proxy will assume that pods\n                            only want to talk to endpoints of the service on the same node as the pod,\n                            dropping the traffic if there are no local endpoints. The default value,\n                            \"Cluster\", uses the standard behavior of routing to all endpoints evenly\n                            (possibly modified by topology and other features).\n                          type: string\n                        ipFamilies:\n                          description: |-\n                            IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this\n                            service. This field is usually assigned automatically based on cluster\n                            configuration and the ipFamilyPolicy field. If this field is specified\n                            manually, the requested family is available in the cluster,\n                            and ipFamilyPolicy allows it, it will be used; otherwise creation of\n                            the service will fail. This field is conditionally mutable: it allows\n                            for adding or removing a secondary IP family, but it does not allow\n                            changing the primary IP family of the Service. Valid values are \"IPv4\"\n                            and \"IPv6\".  This field only applies to Services of types ClusterIP,\n                            NodePort, and LoadBalancer, and does apply to \"headless\" services.\n                            This field will be wiped when updating a Service to type ExternalName.\n\n\n                            This field may hold a maximum of two entries (dual-stack families, in\n                            either order).  These families must correspond to the values of the\n                            clusterIPs field, if specified. Both clusterIPs and ipFamilies are\n                            governed by the ipFamilyPolicy field.\n                          items:\n                            description: |-\n                              IPFamily represents the IP Family (IPv4 or IPv6). This type is used\n                              to express the family of an IP expressed by a type (e.g. service.spec.ipFamilies).\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        ipFamilyPolicy:\n                          description: |-\n                            IPFamilyPolicy represents the dual-stack-ness requested or required by\n                            this Service. If there is no value provided, then this field will be set\n                            to SingleStack. Services can be \"SingleStack\" (a single IP family),\n                            \"PreferDualStack\" (two IP families on dual-stack configured clusters or\n                            a single IP family on single-stack clusters), or \"RequireDualStack\"\n                            (two IP families on dual-stack configured clusters, otherwise fail). The\n                            ipFamilies and clusterIPs fields depend on the value of this field. This\n                            field will be wiped when updating a service to type ExternalName.\n                          type: string\n                        loadBalancerClass:\n                          description: |-\n                            loadBalancerClass is the class of the load balancer implementation this Service belongs to.\n                            If specified, the value of this field must be a label-style identifier, with an optional prefix,\n                            e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users.\n                            This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load\n                            balancer implementation is used, today this is typically done through the cloud provider integration,\n                            but should apply for any default implementation. If set, it is assumed that a load balancer\n                            implementation is watching for Services with a matching class. Any default load balancer\n                            implementation (e.g. cloud providers) should ignore Services that set this field.\n                            This field can only be set when creating or updating a Service to type 'LoadBalancer'.\n                            Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.\n                          type: string\n                        loadBalancerIP:\n                          description: |-\n                            Only applies to Service Type: LoadBalancer.\n                            This feature depends on whether the underlying cloud-provider supports specifying\n                            the loadBalancerIP when a load balancer is created.\n                            This field will be ignored if the cloud-provider does not support the feature.\n                            Deprecated: This field was under-specified and its meaning varies across implementations.\n                            Using it is non-portable and it may not support dual-stack.\n                            Users are encouraged to use implementation-specific annotations when available.\n                          type: string\n                        loadBalancerSourceRanges:\n                          description: |-\n                            If specified and supported by the platform, this will restrict traffic through the cloud-provider\n                            load-balancer will be restricted to the specified client IPs. This field will be ignored if the\n                            cloud-provider does not support the feature.\"\n                            More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/\n                          items:\n                            type: string\n                          type: array\n                        ports:\n                          description: |-\n                            The list of ports that are exposed by this service.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            description: ServicePort contains information on service's\n                              port.\n                            properties:\n                              appProtocol:\n                                description: |-\n                                  The application protocol for this port.\n                                  This is used as a hint for implementations to offer richer behavior for protocols that they understand.\n                                  This field follows standard Kubernetes label syntax.\n                                  Valid values are either:\n\n\n                                  * Un-prefixed protocol names - reserved for IANA standard service names (as per\n                                  RFC-6335 and https://www.iana.org/assignments/service-names).\n\n\n                                  * Kubernetes-defined prefixed names:\n                                    * 'kubernetes.io/h2c' - HTTP/2 prior knowledge over cleartext as described in https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior-\n                                    * 'kubernetes.io/ws'  - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n                                    * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n\n                                  * Other protocols should use implementation-defined prefixed names such as\n                                  mycompany.com/my-custom-protocol.\n                                type: string\n                              name:\n                                description: |-\n                                  The name of this port within the service. This must be a DNS_LABEL.\n                                  All ports within a ServiceSpec must have unique names. When considering\n                                  the endpoints for a Service, this must match the 'name' field in the\n                                  EndpointPort.\n                                  Optional if only one ServicePort is defined on this service.\n                                type: string\n                              nodePort:\n                                description: |-\n                                  The port on each node on which this service is exposed when type is\n                                  NodePort or LoadBalancer.  Usually assigned by the system. If a value is\n                                  specified, in-range, and not in use it will be used, otherwise the\n                                  operation will fail.  If not specified, a port will be allocated if this\n                                  Service requires one.  If this field is specified when creating a\n                                  Service which does not need it, creation will fail. This field will be\n                                  wiped when updating a Service to no longer need it (e.g. changing type\n                                  from NodePort to ClusterIP).\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n                                format: int32\n                                type: integer\n                              port:\n                                description: The port that will be exposed by this\n                                  service.\n                                format: int32\n                                type: integer\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\".\n                                  Default is TCP.\n                                type: string\n                              targetPort:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Number or name of the port to access on the pods targeted by the service.\n                                  Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.\n                                  If this is a string, it will be looked up as a named port in the\n                                  target Pod's container ports. If this is not specified, the value\n                                  of the 'port' field is used (an identity map).\n                                  This field is ignored for services with clusterIP=None, and should be\n                                  omitted or set equal to the 'port' field.\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service\n                                x-kubernetes-int-or-string: true\n                            required:\n                            - port\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - port\n                          - protocol\n                          x-kubernetes-list-type: map\n                        publishNotReadyAddresses:\n                          description: |-\n                            publishNotReadyAddresses indicates that any agent which deals with endpoints for this\n                            Service should disregard any indications of ready/not-ready.\n                            The primary use case for setting this field is for a StatefulSet's Headless Service to\n                            propagate SRV DNS records for its Pods for the purpose of peer discovery.\n                            The Kubernetes controllers that generate Endpoints and EndpointSlice resources for\n                            Services interpret this to mean that all endpoints are considered \"ready\" even if the\n                            Pods themselves are not. Agents which consume only Kubernetes generated endpoints\n                            through the Endpoints or EndpointSlice resources can safely assume this behavior.\n                          type: boolean\n                        selector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            Route service traffic to pods with label keys and values matching this\n                            selector. If empty or not present, the service is assumed to have an\n                            external process managing its endpoints, which Kubernetes will not\n                            modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.\n                            Ignored if type is ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        sessionAffinity:\n                          description: |-\n                            Supports \"ClientIP\" and \"None\". Used to maintain session affinity.\n                            Enable client IP based session affinity.\n                            Must be ClientIP or None.\n                            Defaults to None.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        sessionAffinityConfig:\n                          description: sessionAffinityConfig contains the configurations\n                            of session affinity.\n                          properties:\n                            clientIP:\n                              description: clientIP contains the configurations of\n                                Client IP based session affinity.\n                              properties:\n                                timeoutSeconds:\n                                  description: |-\n                                    timeoutSeconds specifies the seconds of ClientIP type session sticky time.\n                                    The value must be >0 && <=86400(for 1 day) if ServiceAffinity == \"ClientIP\".\n                                    Default value is 10800(for 3 hours).\n                                  format: int32\n                                  type: integer\n                              type: object\n                          type: object\n                        type:\n                          description: |-\n                            type determines how the Service is exposed. Defaults to ClusterIP. Valid\n                            options are ExternalName, ClusterIP, NodePort, and LoadBalancer.\n                            \"ClusterIP\" allocates a cluster-internal IP address for load-balancing\n                            to endpoints. Endpoints are determined by the selector or if that is not\n                            specified, by manual construction of an Endpoints object or\n                            EndpointSlice objects. If clusterIP is \"None\", no virtual IP is\n                            allocated and the endpoints are published as a set of endpoints rather\n                            than a virtual IP.\n                            \"NodePort\" builds on ClusterIP and allocates a port on every node which\n                            routes to the same endpoints as the clusterIP.\n                            \"LoadBalancer\" builds on NodePort and creates an external load-balancer\n                            (if supported in the current cloud) which routes to the same endpoints\n                            as the clusterIP.\n                            \"ExternalName\" aliases this service to the specified externalName.\n                            Several other fields do not apply to ExternalName services.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types\n                          type: string\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-preserve-unknown-fields: true\n              shardings:\n                description: |-\n                  Specifies a list of ClusterSharding objects that manage the sharding topology for Cluster Components.\n                  Each ClusterSharding organizes components into shards, with each shard corresponding to a Component.\n                  Components within a shard are all based on a common ClusterComponentSpec template, ensuring uniform configurations.\n\n\n                  This field supports dynamic resharding by facilitating the addition or removal of shards\n                  through the `shards` field in ClusterSharding.\n\n\n                  Note: `shardings` and `componentSpecs` cannot both be empty; at least one must be defined to configure a Cluster.\n                items:\n                  description: |-\n                    ClusterSharding defines how KubeBlocks manage dynamic provisioned shards.\n                    A typical design pattern for distributed databases is to distribute data across multiple shards,\n                    with each shard consisting of multiple replicas.\n                    Therefore, KubeBlocks supports representing a shard with a Component and dynamically instantiating Components\n                    using a template when shards are added.\n                    When shards are removed, the corresponding Components are also deleted.\n                  properties:\n                    name:\n                      description: |-\n                        Represents the common parent part of all shard names.\n\n\n                        This identifier is included as part of the Service DNS name and must comply with IANA service naming rules.\n                        It is used to generate the names of underlying Components following the pattern `$(clusterSharding.name)-$(ShardID)`.\n                        ShardID is a random string that is appended to the Name to generate unique identifiers for each shard.\n                        For example, if the sharding specification name is \"my-shard\" and the ShardID is \"abc\", the resulting Component name\n                        would be \"my-shard-abc\".\n\n\n                        Note that the name defined in Component template(`clusterSharding.template.name`) will be disregarded\n                        when generating the Component names of the shards. The `clusterSharding.name` field takes precedence.\n                      maxLength: 15\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                      x-kubernetes-validations:\n                      - message: name is immutable\n                        rule: self == oldSelf\n                    shardingDef:\n                      description: |-\n                        Specifies the ShardingDefinition custom resource (CR) that defines the sharding's characteristics and behavior.\n\n\n                        The full name or regular expression is supported to match the ShardingDefinition.\n                      maxLength: 64\n                      type: string\n                    shards:\n                      description: |-\n                        Specifies the desired number of shards.\n\n\n                        Users can declare the desired number of shards through this field.\n                        KubeBlocks dynamically creates and deletes Components based on the difference\n                        between the desired and actual number of shards.\n                        KubeBlocks provides lifecycle management for sharding, including:\n\n\n                        - Executing the shardProvision Action defined in the ShardingDefinition when the number of shards increases.\n                          This allows for custom actions to be performed after a new shard is provisioned.\n                        - Executing the shardTerminate Action defined in the ShardingDefinition when the number of shards decreases.\n                          This enables custom cleanup or data migration tasks to be executed before a shard is terminated.\n                          Resources and data associated with the corresponding Component will also be deleted.\n                      format: int32\n                      maximum: 2048\n                      minimum: 0\n                      type: integer\n                    template:\n                      description: |-\n                        The template for generating Components for shards, where each shard consists of one Component.\n\n\n                        This field is of type ClusterComponentSpec, which encapsulates all the required details and\n                        definitions for creating and managing the Components.\n                        KubeBlocks uses this template to generate a set of identical Components of shards.\n                        All the generated Components will have the same specifications and definitions as specified in the `template` field.\n\n\n                        This allows for the creation of multiple Components with consistent configurations,\n                        enabling sharding and distribution of workloads across Components.\n                      properties:\n                        annotations:\n                          additionalProperties:\n                            type: string\n                          description: Specifies Annotations to override or add for\n                            underlying Pods, PVCs, Account & TLS Secrets, Services\n                            Owned by Component.\n                          type: object\n                        componentDef:\n                          description: |-\n                            Specifies the ComponentDefinition custom resource (CR) that defines the Component's characteristics and behavior.\n\n\n                            Supports three different ways to specify the ComponentDefinition:\n\n\n                            - the regular expression - recommended\n                            - the full name - recommended\n                            - the name prefix\n                          maxLength: 64\n                          pattern: ^[a-z]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                        configs:\n                          description: Specifies the configuration content of a config\n                            template.\n                          items:\n                            description: ClusterComponentConfig represents a configuration\n                              for a component.\n                            properties:\n                              configMap:\n                                description: ConfigMap source for the config.\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      ConfigMap will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the ConfigMap,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional specify whether the ConfigMap\n                                      or its keys must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              externalManaged:\n                                description: |-\n                                  ExternalManaged indicates whether the configuration is managed by an external system.\n                                  When set to true, the controller will use the user-provided template and reconfigure action,\n                                  ignoring the default template and update behavior.\n                                type: boolean\n                              name:\n                                description: The name of the config.\n                                maxLength: 63\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                              reconfigure:\n                                description: |-\n                                  The custom reconfigure action to reload the service configuration whenever changes to this config are detected.\n\n\n                                  The container executing this action has access to following variables:\n\n\n                                  - KB_CONFIG_FILES_CREATED: file1,file2...\n                                  - KB_CONFIG_FILES_REMOVED: file1,file2...\n                                  - KB_CONFIG_FILES_UPDATED: file1:checksum1,file2:checksum2...\n\n\n                                  Note: This field is immutable once it has been set.\n                                properties:\n                                  exec:\n                                    description: |-\n                                      Defines the command to run.\n\n\n                                      This field cannot be updated.\n                                    properties:\n                                      args:\n                                        description: Args represents the arguments\n                                          that are passed to the `command` for execution.\n                                        items:\n                                          type: string\n                                        type: array\n                                      command:\n                                        description: |-\n                                          Specifies the command to be executed inside the container.\n                                          The working directory for this command is the container's root directory('/').\n                                          Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                          If the shell is required, it must be explicitly invoked in the command.\n\n\n                                          A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                        items:\n                                          type: string\n                                        type: array\n                                      container:\n                                        description: |-\n                                          Specifies the name of the container within the same pod whose resources will be shared with the action.\n                                          This allows the action to utilize the specified container's resources without executing within it.\n\n\n                                          The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                                          The resources that can be shared are included:\n\n\n                                          - volume mounts\n\n\n                                          This field cannot be updated.\n                                        type: string\n                                      env:\n                                        description: |-\n                                          Represents a list of environment variables that will be injected into the container.\n                                          These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                                          This field cannot be updated.\n                                        items:\n                                          description: EnvVar represents an environment\n                                            variable present in a Container.\n                                          properties:\n                                            name:\n                                              description: Name of the environment\n                                                variable. Must be a C_IDENTIFIER.\n                                              type: string\n                                            value:\n                                              description: |-\n                                                Variable references $(VAR_NAME) are expanded\n                                                using the previously defined environment variables in the container and\n                                                any service environment variables. If a variable cannot be resolved,\n                                                the reference in the input string will be unchanged. Double $$ are reduced\n                                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                                \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                                Escaped references will never be expanded, regardless of whether the variable\n                                                exists or not.\n                                                Defaults to \"\".\n                                              type: string\n                                            valueFrom:\n                                              description: Source for the environment\n                                                variable's value. Cannot be used if\n                                                value is not empty.\n                                              properties:\n                                                configMapKeyRef:\n                                                  description: Selects a key of a\n                                                    ConfigMap.\n                                                  properties:\n                                                    key:\n                                                      description: The key to select.\n                                                      type: string\n                                                    name:\n                                                      description: |-\n                                                        Name of the referent.\n                                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                                      type: string\n                                                    optional:\n                                                      description: Specify whether\n                                                        the ConfigMap or its key must\n                                                        be defined\n                                                      type: boolean\n                                                  required:\n                                                  - key\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                fieldRef:\n                                                  description: |-\n                                                    Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                                    spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                                  properties:\n                                                    apiVersion:\n                                                      description: Version of the\n                                                        schema the FieldPath is written\n                                                        in terms of, defaults to \"v1\".\n                                                      type: string\n                                                    fieldPath:\n                                                      description: Path of the field\n                                                        to select in the specified\n                                                        API version.\n                                                      type: string\n                                                  required:\n                                                  - fieldPath\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                resourceFieldRef:\n                                                  description: |-\n                                                    Selects a resource of the container: only resources limits and requests\n                                                    (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                                  properties:\n                                                    containerName:\n                                                      description: 'Container name:\n                                                        required for volumes, optional\n                                                        for env vars'\n                                                      type: string\n                                                    divisor:\n                                                      anyOf:\n                                                      - type: integer\n                                                      - type: string\n                                                      description: Specifies the output\n                                                        format of the exposed resources,\n                                                        defaults to \"1\"\n                                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                      x-kubernetes-int-or-string: true\n                                                    resource:\n                                                      description: 'Required: resource\n                                                        to select'\n                                                      type: string\n                                                  required:\n                                                  - resource\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                secretKeyRef:\n                                                  description: Selects a key of a\n                                                    secret in the pod's namespace\n                                                  properties:\n                                                    key:\n                                                      description: The key of the\n                                                        secret to select from.  Must\n                                                        be a valid secret key.\n                                                      type: string\n                                                    name:\n                                                      description: |-\n                                                        Name of the referent.\n                                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                                      type: string\n                                                    optional:\n                                                      description: Specify whether\n                                                        the Secret or its key must\n                                                        be defined\n                                                      type: boolean\n                                                  required:\n                                                  - key\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                              type: object\n                                          required:\n                                          - name\n                                          type: object\n                                        type: array\n                                      image:\n                                        description: |-\n                                          Specifies the container image to be used for running the Action.\n\n\n                                          When specified, a dedicated container will be created using this image to execute the Action.\n                                          All actions with same image will share the same container.\n\n\n                                          This field cannot be updated.\n                                        type: string\n                                      matchingKey:\n                                        description: |-\n                                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                            will be selected for the Action.\n\n\n                                          This field cannot be updated.\n                                        type: string\n                                      targetPodSelector:\n                                        description: |-\n                                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                                          This is useful when there is no default target replica identified.\n                                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                                          post-provision or pre-terminate of the component.\n\n\n                                          This field cannot be updated.\n                                        enum:\n                                        - Any\n                                        - All\n                                        - Role\n                                        - Ordinal\n                                        type: string\n                                    type: object\n                                  grpc:\n                                    description: |-\n                                      Defines the gRPC call to issue.\n\n\n                                      This field cannot be updated.\n                                    properties:\n                                      host:\n                                        description: |-\n                                          The target host to connect to.\n                                          Defaults to \"127.0.0.1\" if not specified.\n                                        type: string\n                                      method:\n                                        description: Name of the method to invoke\n                                          on the gRPC service.\n                                        type: string\n                                      port:\n                                        description: |-\n                                          The port to access on the host.\n                                          It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                                        type: string\n                                      request:\n                                        additionalProperties:\n                                          type: string\n                                        description: |-\n                                          Request payload for the gRPC method.\n\n\n                                          Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                                          Templates are rendered with predefined action variables before the request is sent.\n                                        type: object\n                                      response:\n                                        description: Required response schema for\n                                          the gRPC method.\n                                        properties:\n                                          message:\n                                            description: |-\n                                              Name of the field in the response whose value should be output.\n                                              Printed to stdout on success, or stderr on failure.\n                                            type: string\n                                          status:\n                                            description: |-\n                                              Name of the string field in the response that carries status information.\n                                              If non-empty, the action fails.\n                                            type: string\n                                        type: object\n                                      service:\n                                        description: Fully-qualified name of the gRPC\n                                          service to call.\n                                        type: string\n                                    required:\n                                    - method\n                                    - port\n                                    - service\n                                    type: object\n                                  http:\n                                    description: |-\n                                      Defines the HTTP request to perform.\n\n\n                                      This field cannot be updated.\n                                    properties:\n                                      body:\n                                        description: |-\n                                          Optional HTTP request body.\n\n\n                                          Supports Go text/template syntax; rendered with predefined variables before sending.\n                                        type: string\n                                      headers:\n                                        description: |-\n                                          Custom headers to set in the request.\n                                          Header values may use Go text/template syntax, rendered with predefined variables.\n                                        items:\n                                          description: HTTPHeader represents a single\n                                            HTTP header key/value pair.\n                                          properties:\n                                            name:\n                                              description: Name of the header field.\n                                              type: string\n                                            value:\n                                              description: Value of the header field.\n                                              type: string\n                                          required:\n                                          - name\n                                          - value\n                                          type: object\n                                        type: array\n                                      host:\n                                        description: |-\n                                          The target host to connect to.\n                                          Defaults to \"127.0.0.1\" if not specified.\n                                        type: string\n                                      method:\n                                        default: GET\n                                        description: |-\n                                          The HTTP method to use.\n                                          Defaults to \"GET\".\n                                        enum:\n                                        - GET\n                                        - POST\n                                        - PUT\n                                        - DELETE\n                                        - HEAD\n                                        - PATCH\n                                        type: string\n                                      path:\n                                        default: /\n                                        description: |-\n                                          The path to request on the HTTP server.\n                                          Defaults to \"/\" if not specified.\n                                        pattern: ^/.*\n                                        type: string\n                                      port:\n                                        description: |-\n                                          The port to access on the host.\n                                          It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                                        type: string\n                                      scheme:\n                                        default: HTTP\n                                        description: |-\n                                          The scheme to use for connecting to the host.\n                                          Defaults to \"HTTP\".\n                                        enum:\n                                        - HTTP\n                                        - HTTPS\n                                        type: string\n                                    required:\n                                    - port\n                                    type: object\n                                  matchingKey:\n                                    description: |-\n                                      Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                                      The impact of this field depends on the `targetPodSelector` value:\n\n\n                                      - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                                      - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                        will be selected for the Action.\n\n\n                                      This field cannot be updated.\n                                    type: string\n                                  preCondition:\n                                    description: |-\n                                      Specifies the state that the cluster must reach before the Action is executed.\n                                      Currently, this is only applicable to the `postProvision` action.\n\n\n                                      The conditions are as follows:\n\n\n                                      - `Immediately`: Executed right after the Component object is created.\n                                        The readiness of the Component and its resources is not guaranteed at this stage.\n                                      - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                        runtime resources (e.g. Pods) are in a ready state.\n                                      - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                        This process does not affect the readiness state of the Component or the Cluster.\n                                      - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                        This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                                      This field cannot be updated.\n                                    type: string\n                                  retryPolicy:\n                                    description: |-\n                                      Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                                      It specifies the conditions under which the Action should be retried and the limits to apply,\n                                      such as the maximum number of retries and backoff strategy.\n\n\n                                      This field cannot be updated.\n                                    properties:\n                                      maxRetries:\n                                        default: 0\n                                        description: |-\n                                          Defines the maximum number of retry attempts that should be made for a given Action.\n                                          This value is set to 0 by default, indicating that no retries will be made.\n                                        type: integer\n                                      retryInterval:\n                                        default: 0\n                                        description: |-\n                                          Indicates the duration of time to wait between each retry attempt.\n                                          This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                        format: int64\n                                        type: integer\n                                    type: object\n                                  targetPodSelector:\n                                    description: |-\n                                      Defines the criteria used to select the target Pod(s) for executing the Action.\n                                      This is useful when there is no default target replica identified.\n                                      It allows for precise control over which Pod(s) the Action should run in.\n\n\n                                      If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                                      to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                                      post-provision or pre-terminate of the component.\n\n\n                                      This field cannot be updated.\n                                    enum:\n                                    - Any\n                                    - All\n                                    - Role\n                                    - Ordinal\n                                    type: string\n                                  timeoutSeconds:\n                                    default: 0\n                                    description: |-\n                                      Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                                      If the Action does not complete within this time frame, it will be terminated.\n\n\n                                      This field cannot be updated.\n                                    format: int32\n                                    type: integer\n                                type: object\n                              variables:\n                                additionalProperties:\n                                  type: string\n                                description: Variables are key-value pairs for dynamic\n                                  configuration values that can be provided by the\n                                  user.\n                                type: object\n                            type: object\n                          type: array\n                        disableExporter:\n                          description: |-\n                            Determines whether metrics exporter information is annotated on the Component's headless Service.\n\n\n                            If set to true, the following annotations will not be patched into the Service:\n\n\n                            - \"monitor.kubeblocks.io/path\"\n                            - \"monitor.kubeblocks.io/port\"\n                            - \"monitor.kubeblocks.io/scheme\"\n\n\n                            These annotations allow the Prometheus installed by KubeBlocks to discover and scrape metrics from the exporter.\n                          type: boolean\n                        env:\n                          description: |-\n                            List of environment variables to add.\n                            These environment variables will be placed after the environment variables declared in the Pod.\n                          items:\n                            description: EnvVar represents an environment variable\n                              present in a Container.\n                            properties:\n                              name:\n                                description: Name of the environment variable. Must\n                                  be a C_IDENTIFIER.\n                                type: string\n                              value:\n                                description: |-\n                                  Variable references $(VAR_NAME) are expanded\n                                  using the previously defined environment variables in the container and\n                                  any service environment variables. If a variable cannot be resolved,\n                                  the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                  \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                  Escaped references will never be expanded, regardless of whether the variable\n                                  exists or not.\n                                  Defaults to \"\".\n                                type: string\n                              valueFrom:\n                                description: Source for the environment variable's\n                                  value. Cannot be used if value is not empty.\n                                properties:\n                                  configMapKeyRef:\n                                    description: Selects a key of a ConfigMap.\n                                    properties:\n                                      key:\n                                        description: The key to select.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          or its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  fieldRef:\n                                    description: |-\n                                      Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                      spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  secretKeyRef:\n                                    description: Selects a key of a secret in the\n                                      pod's namespace\n                                    properties:\n                                      key:\n                                        description: The key of the secret to select\n                                          from.  Must be a valid secret key.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret or\n                                          its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        instanceUpdateStrategy:\n                          description: Provides fine-grained control over the spec\n                            update process of all instances.\n                          properties:\n                            rollingUpdate:\n                              description: Specifies how the rolling update should\n                                be applied.\n                              properties:\n                                maxUnavailable:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    The maximum number of instances that can be unavailable during the update.\n                                    Value can be an absolute number (ex: 5) or a percentage of desired instances (ex: 10%).\n                                    Absolute number is calculated from percentage by rounding up. This can not be 0.\n                                    Defaults to 1. The field applies to all instances. That means if there is any unavailable pod,\n                                    it will be counted towards MaxUnavailable.\n                                  x-kubernetes-int-or-string: true\n                                replicas:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Indicates the number of instances that should be updated during a rolling update.\n                                    The remaining instances will remain untouched. This is helpful in defining how many instances\n                                    should participate in the update process.\n                                    Value can be an absolute number (ex: 5) or a percentage of desired instances (ex: 10%).\n                                    Absolute number is calculated from percentage by rounding up.\n                                    The default value is ComponentSpec.Replicas (i.e., update all instances).\n                                  x-kubernetes-int-or-string: true\n                              type: object\n                            type:\n                              description: |-\n                                Indicates the type of the update strategy.\n                                Default is RollingUpdate.\n                              enum:\n                              - RollingUpdate\n                              - OnDelete\n                              type: string\n                          type: object\n                        instances:\n                          description: |-\n                            Allows for the customization of configuration values for each instance within a Component.\n                            An instance represent a single replica (Pod and associated K8s resources like PVCs, Services, and ConfigMaps).\n                            While instances typically share a common configuration as defined in the ClusterComponentSpec,\n                            they can require unique settings in various scenarios:\n\n\n                            For example:\n                            - A database Component might require different resource allocations for primary and secondary instances,\n                              with primaries needing more resources.\n                            - During a rolling upgrade, a Component may first update the image for one or a few instances,\n                              and then update the remaining instances after verifying that the updated instances are functioning correctly.\n\n\n                            InstanceTemplate allows for specifying these unique configurations per instance.\n                            Each instance's name is constructed using the pattern: $(component.name)-$(template.name)-$(ordinal),\n                            starting with an ordinal of 0.\n                            It is crucial to maintain unique names for each InstanceTemplate to avoid conflicts.\n\n\n                            The sum of replicas across all InstanceTemplates should not exceed the total number of replicas specified for the Component.\n                            Any remaining replicas will be generated using the default template and will follow the default naming rules.\n                          items:\n                            description: InstanceTemplate allows customization of\n                              individual replica configurations in a Component.\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                                  Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                                type: object\n                              env:\n                                description: |-\n                                  Defines Env to override.\n                                  Add new or override existing envs.\n                                items:\n                                  description: EnvVar represents an environment variable\n                                    present in a Container.\n                                  properties:\n                                    name:\n                                      description: Name of the environment variable.\n                                        Must be a C_IDENTIFIER.\n                                      type: string\n                                    value:\n                                      description: |-\n                                        Variable references $(VAR_NAME) are expanded\n                                        using the previously defined environment variables in the container and\n                                        any service environment variables. If a variable cannot be resolved,\n                                        the reference in the input string will be unchanged. Double $$ are reduced\n                                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                        Escaped references will never be expanded, regardless of whether the variable\n                                        exists or not.\n                                        Defaults to \"\".\n                                      type: string\n                                    valueFrom:\n                                      description: Source for the environment variable's\n                                        value. Cannot be used if value is not empty.\n                                      properties:\n                                        configMapKeyRef:\n                                          description: Selects a key of a ConfigMap.\n                                          properties:\n                                            key:\n                                              description: The key to select.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        fieldRef:\n                                          description: |-\n                                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        secretKeyRef:\n                                          description: Selects a key of a secret in\n                                            the pod's namespace\n                                          properties:\n                                            key:\n                                              description: The key of the secret to\n                                                select from.  Must be a valid secret\n                                                key.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                              labels:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                                  Values for existing keys will be overwritten, and new keys will be added.\n                                type: object\n                              name:\n                                description: |-\n                                  Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                                  This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal\n                                  using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                                  The specified name overrides any default naming conventions or patterns.\n                                maxLength: 54\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                              ordinals:\n                                description: |-\n                                  Specifies the desired Ordinals of this InstanceTemplate.\n                                  The Ordinals used to specify the ordinal of the instance (pod) names to be generated under this InstanceTemplate.\n\n\n                                  For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},\n                                  then the instance names generated under this InstanceTemplate would be\n                                  $(cluster.name)-$(component.name)-$(template.name)-0、$(cluster.name)-$(component.name)-$(template.name)-1 and\n                                  $(cluster.name)-$(component.name)-$(template.name)-7\n                                properties:\n                                  discrete:\n                                    items:\n                                      format: int32\n                                      type: integer\n                                    type: array\n                                  ranges:\n                                    items:\n                                      description: |-\n                                        Range represents a range with a start and an end value.\n                                        It is used to define a continuous segment.\n                                      properties:\n                                        end:\n                                          format: int32\n                                          type: integer\n                                        start:\n                                          format: int32\n                                          type: integer\n                                      required:\n                                      - end\n                                      - start\n                                      type: object\n                                    type: array\n                                type: object\n                              replicas:\n                                default: 1\n                                description: |-\n                                  Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                                  This field allows setting how many replicated instances of the Component,\n                                  with the specific overrides in the InstanceTemplate, are created.\n                                  The default value is 1. A value of 0 disables instance creation.\n                                format: int32\n                                minimum: 0\n                                type: integer\n                              resources:\n                                description: |-\n                                  Specifies an override for the resource requirements of the first container in the Pod.\n                                  This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                                properties:\n                                  claims:\n                                    description: |-\n                                      Claims lists the names of resources, defined in spec.resourceClaims,\n                                      that are used by this container.\n\n\n                                      This is an alpha field and requires enabling the\n                                      DynamicResourceAllocation feature gate.\n\n\n                                      This field is immutable. It can only be set for containers.\n                                    items:\n                                      description: ResourceClaim references one entry\n                                        in PodSpec.ResourceClaims.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name must match the name of one entry in pod.spec.resourceClaims of\n                                            the Pod where this field is used. It makes that resource available\n                                            inside a container.\n                                          type: string\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - name\n                                    x-kubernetes-list-type: map\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                              schedulingPolicy:\n                                description: |-\n                                  Specifies the scheduling policy for the instance.\n                                  If defined, it will overwrite the scheduling policy defined in ClusterSpec and/or ClusterComponentSpec.\n                                properties:\n                                  affinity:\n                                    description: Specifies a group of affinity scheduling\n                                      rules of the Cluster, including NodeAffinity,\n                                      PodAffinity, and PodAntiAffinity.\n                                    properties:\n                                      nodeAffinity:\n                                        description: Describes node affinity scheduling\n                                          rules for the pod.\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: |-\n                                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                              properties:\n                                                preference:\n                                                  description: A node selector term,\n                                                    associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        labels.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchFields:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        fields.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                weight:\n                                                  description: Weight associated with\n                                                    matching the corresponding nodeSelectorTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - preference\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to an update), the system\n                                              may or may not try to eventually evict the pod from its node.\n                                            properties:\n                                              nodeSelectorTerms:\n                                                description: Required. A list of node\n                                                  selector terms. The terms are ORed.\n                                                items:\n                                                  description: |-\n                                                    A null or empty node selector term matches no objects. The requirements of\n                                                    them are ANDed.\n                                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        labels.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchFields:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        fields.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                type: array\n                                            required:\n                                            - nodeSelectorTerms\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                        type: object\n                                      podAffinity:\n                                        description: Describes pod affinity scheduling\n                                          rules (e.g. co-locate this pod in the same\n                                          node, zone, etc. as some other pod(s)).\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: The weights of all of the\n                                                matched WeightedPodAffinityTerm fields\n                                                are added per-node to find the most\n                                                preferred node(s)\n                                              properties:\n                                                podAffinityTerm:\n                                                  description: Required. A pod affinity\n                                                    term, associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    labelSelector:\n                                                      description: |-\n                                                        A label query over a set of resources, in this case pods.\n                                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    matchLabelKeys:\n                                                      description: |-\n                                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    mismatchLabelKeys:\n                                                      description: |-\n                                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    namespaceSelector:\n                                                      description: |-\n                                                        A label query over the set of namespaces that the term applies to.\n                                                        The term is applied to the union of the namespaces selected by this field\n                                                        and the ones listed in the namespaces field.\n                                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                        An empty selector ({}) matches all namespaces.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    namespaces:\n                                                      description: |-\n                                                        namespaces specifies a static list of namespace names that the term applies to.\n                                                        The term is applied to the union of the namespaces listed in this field\n                                                        and the ones selected by namespaceSelector.\n                                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                    topologyKey:\n                                                      description: |-\n                                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                                        selected pods is running.\n                                                        Empty topologyKey is not allowed.\n                                                      type: string\n                                                  required:\n                                                  - topologyKey\n                                                  type: object\n                                                weight:\n                                                  description: |-\n                                                    weight associated with matching the corresponding podAffinityTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - podAffinityTerm\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to a pod label update), the\n                                              system may or may not try to eventually evict the pod from its node.\n                                              When there are multiple elements, the lists of nodes corresponding to each\n                                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                            items:\n                                              description: |-\n                                                Defines a set of pods (namely those matching the labelSelector\n                                                relative to the given namespace(s)) that this pod should be\n                                                co-located (affinity) or not co-located (anti-affinity) with,\n                                                where co-located is defined as running on a node whose value of\n                                                the label with key <topologyKey> matches that of any node on which\n                                                a pod of the set of pods is running\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            type: array\n                                        type: object\n                                      podAntiAffinity:\n                                        description: Describes pod anti-affinity scheduling\n                                          rules (e.g. avoid putting this pod in the\n                                          same node, zone, etc. as some other pod(s)).\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the anti-affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: The weights of all of the\n                                                matched WeightedPodAffinityTerm fields\n                                                are added per-node to find the most\n                                                preferred node(s)\n                                              properties:\n                                                podAffinityTerm:\n                                                  description: Required. A pod affinity\n                                                    term, associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    labelSelector:\n                                                      description: |-\n                                                        A label query over a set of resources, in this case pods.\n                                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    matchLabelKeys:\n                                                      description: |-\n                                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    mismatchLabelKeys:\n                                                      description: |-\n                                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    namespaceSelector:\n                                                      description: |-\n                                                        A label query over the set of namespaces that the term applies to.\n                                                        The term is applied to the union of the namespaces selected by this field\n                                                        and the ones listed in the namespaces field.\n                                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                        An empty selector ({}) matches all namespaces.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    namespaces:\n                                                      description: |-\n                                                        namespaces specifies a static list of namespace names that the term applies to.\n                                                        The term is applied to the union of the namespaces listed in this field\n                                                        and the ones selected by namespaceSelector.\n                                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                    topologyKey:\n                                                      description: |-\n                                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                                        selected pods is running.\n                                                        Empty topologyKey is not allowed.\n                                                      type: string\n                                                  required:\n                                                  - topologyKey\n                                                  type: object\n                                                weight:\n                                                  description: |-\n                                                    weight associated with matching the corresponding podAffinityTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - podAffinityTerm\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the anti-affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the anti-affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to a pod label update), the\n                                              system may or may not try to eventually evict the pod from its node.\n                                              When there are multiple elements, the lists of nodes corresponding to each\n                                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                            items:\n                                              description: |-\n                                                Defines a set of pods (namely those matching the labelSelector\n                                                relative to the given namespace(s)) that this pod should be\n                                                co-located (affinity) or not co-located (anti-affinity) with,\n                                                where co-located is defined as running on a node whose value of\n                                                the label with key <topologyKey> matches that of any node on which\n                                                a pod of the set of pods is running\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            type: array\n                                        type: object\n                                    type: object\n                                  nodeName:\n                                    description: |-\n                                      NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                                      the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                                      requirements.\n                                    type: string\n                                  nodeSelector:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      NodeSelector is a selector which must be true for the Pod to fit on a node.\n                                      Selector which must match a node's labels for the Pod to be scheduled on that node.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  schedulerName:\n                                    description: |-\n                                      If specified, the Pod will be dispatched by specified scheduler.\n                                      If not specified, the Pod will be dispatched by default scheduler.\n                                    type: string\n                                  tolerations:\n                                    description: |-\n                                      Allows Pods to be scheduled onto nodes with matching taints.\n                                      Each toleration in the array allows the Pod to tolerate node taints based on\n                                      specified `key`, `value`, `effect`, and `operator`.\n\n\n                                      - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                                      - The `operator` determines how the toleration matches the taint.\n\n\n                                      Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                                    items:\n                                      description: |-\n                                        The pod this Toleration is attached to tolerates any taint that matches\n                                        the triple <key,value,effect> using the matching operator <operator>.\n                                      properties:\n                                        effect:\n                                          description: |-\n                                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                          type: string\n                                        key:\n                                          description: |-\n                                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            Operator represents a key's relationship to the value.\n                                            Valid operators are Exists and Equal. Defaults to Equal.\n                                            Exists is equivalent to wildcard for value, so that a pod can\n                                            tolerate all taints of a particular category.\n                                          type: string\n                                        tolerationSeconds:\n                                          description: |-\n                                            TolerationSeconds represents the period of time the toleration (which must be\n                                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                            negative values will be treated as 0 (evict immediately) by the system.\n                                          format: int64\n                                          type: integer\n                                        value:\n                                          description: |-\n                                            Value is the taint value the toleration matches to.\n                                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                          type: string\n                                      type: object\n                                    type: array\n                                  topologySpreadConstraints:\n                                    description: |-\n                                      TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                                      domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                                      All topologySpreadConstraints are ANDed.\n                                    items:\n                                      description: TopologySpreadConstraint specifies\n                                        how to spread matching pods among the given\n                                        topology.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            LabelSelector is used to find matching pods.\n                                            Pods that match this label selector are counted to determine the number of pods\n                                            in their corresponding topology domain.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                                            spreading will be calculated. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                                            to select the group of existing pods over which spreading will be calculated\n                                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            Keys that don't exist in the incoming pod labels will\n                                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        maxSkew:\n                                          description: |-\n                                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                            between the number of matching pods in the target topology and the global minimum.\n                                            The global minimum is the minimum number of matching pods in an eligible domain\n                                            or zero if the number of eligible domains is less than MinDomains.\n                                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                            labelSelector spread as 2/2/1:\n                                            In this case, the global minimum is 1.\n                                            | zone1 | zone2 | zone3 |\n                                            |  P P  |  P P  |   P   |\n                                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                            violate MaxSkew(1).\n                                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                            to topologies that satisfy it.\n                                            It's a required field. Default value is 1 and 0 is not allowed.\n                                          format: int32\n                                          type: integer\n                                        minDomains:\n                                          description: |-\n                                            MinDomains indicates a minimum number of eligible domains.\n                                            When the number of eligible domains with matching topology keys is less than minDomains,\n                                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                            this value has no effect on scheduling.\n                                            As a result, when the number of eligible domains is less than minDomains,\n                                            scheduler won't schedule more than maxSkew Pods to those domains.\n                                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                            Valid values are integers greater than 0.\n                                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                            labelSelector spread as 2/2/2:\n                                            | zone1 | zone2 | zone3 |\n                                            |  P P  |  P P  |  P P  |\n                                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                            it will violate MaxSkew.\n\n\n                                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                          format: int32\n                                          type: integer\n                                        nodeAffinityPolicy:\n                                          description: |-\n                                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                            when calculating pod topology spread skew. Options are:\n                                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                            If this value is nil, the behavior is equivalent to the Honor policy.\n                                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                          type: string\n                                        nodeTaintsPolicy:\n                                          description: |-\n                                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                            pod topology spread skew. Options are:\n                                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                            has a toleration, are included.\n                                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                          type: string\n                                        topologyKey:\n                                          description: |-\n                                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                                            and identical values are considered to be in the same topology.\n                                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                            of pods into each bucket.\n                                            We define a domain as a particular instance of a topology.\n                                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                            nodeAffinityPolicy and nodeTaintsPolicy.\n                                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                            It's a required field.\n                                          type: string\n                                        whenUnsatisfiable:\n                                          description: |-\n                                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                            the spread constraint.\n                                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                              but giving higher precedence to topologies that would help reduce the\n                                              skew.\n                                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                            if and only if every possible node assignment for that pod would violate\n                                            \"MaxSkew\" on some topology.\n                                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                            labelSelector spread as 3/1/1:\n                                            | zone1 | zone2 | zone3 |\n                                            | P P P |   P   |   P   |\n                                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                            won't make it *more* imbalanced.\n                                            It's a required field.\n                                          type: string\n                                      required:\n                                      - maxSkew\n                                      - topologyKey\n                                      - whenUnsatisfiable\n                                      type: object\n                                    type: array\n                                type: object\n                              volumeClaimTemplates:\n                                description: Specifies an override for the storage\n                                  requirements of the instances.\n                                items:\n                                  properties:\n                                    annotations:\n                                      additionalProperties:\n                                        type: string\n                                      description: Specifies the annotations for the\n                                        PVC of the volume.\n                                      type: object\n                                    labels:\n                                      additionalProperties:\n                                        type: string\n                                      description: Specifies the labels for the PVC\n                                        of the volume.\n                                      type: object\n                                    name:\n                                      description: |-\n                                        Refers to the name of a volumeMount defined in either:\n\n\n                                        - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                                        - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                                        The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                                      type: string\n                                    spec:\n                                      description: |-\n                                        Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                                        with the mount name specified in the `name` field.\n\n\n                                        When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                                        defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                                      properties:\n                                        accessModes:\n                                          description: |-\n                                            Contains the desired access modes the volume should have.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-preserve-unknown-fields: true\n                                        resources:\n                                          description: |-\n                                            Represents the minimum resources the volume should have.\n                                            If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                            are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                          properties:\n                                            limits:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Limits describes the maximum amount of compute resources allowed.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                            requests:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Requests describes the minimum amount of compute resources required.\n                                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                          type: object\n                                          x-kubernetes-preserve-unknown-fields: true\n                                        storageClassName:\n                                          description: |-\n                                            The name of the StorageClass required by the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                          type: string\n                                        volumeAttributesClassName:\n                                          description: |-\n                                            volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n\n\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                          type: string\n                                        volumeMode:\n                                          description: Defines what type of volume\n                                            is required by the claim, either Block\n                                            or Filesystem.\n                                          type: string\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        issuer:\n                          description: |-\n                            Specifies the configuration for the TLS certificates issuer.\n                            It allows defining the issuer name and the reference to the secret containing the TLS certificates and key.\n                            The secret should contain the CA certificate, TLS certificate, and private key in the specified keys.\n                            Required when TLS is enabled.\n                          properties:\n                            name:\n                              allOf:\n                              - enum:\n                                - KubeBlocks\n                                - UserProvided\n                              - enum:\n                                - KubeBlocks\n                                - UserProvided\n                              default: KubeBlocks\n                              description: |-\n                                The issuer for TLS certificates.\n                                It only allows two enum values: `KubeBlocks` and `UserProvided`.\n\n\n                                - `KubeBlocks` indicates that the self-signed TLS certificates generated by the KubeBlocks Operator will be used.\n                                - `UserProvided` means that the user is responsible for providing their own CA, Cert, and Key.\n                                  In this case, the user-provided CA certificate, server certificate, and private key will be used\n                                  for TLS communication.\n                              type: string\n                            secretRef:\n                              description: |-\n                                SecretRef is the reference to the secret that contains user-provided certificates.\n                                It is required when the issuer is set to `UserProvided`.\n                              properties:\n                                ca:\n                                  description: Key of CA cert in Secret\n                                  type: string\n                                cert:\n                                  description: Key of Cert in Secret\n                                  type: string\n                                key:\n                                  description: Key of TLS private key in Secret\n                                  type: string\n                                name:\n                                  description: Name of the Secret that contains user-provided\n                                    certificates.\n                                  type: string\n                                namespace:\n                                  description: |-\n                                    The namespace where the secret is located.\n                                    If not provided, the secret is assumed to be in the same namespace as the Cluster object.\n                                  type: string\n                              required:\n                              - ca\n                              - cert\n                              - key\n                              - name\n                              type: object\n                          required:\n                          - name\n                          type: object\n                        labels:\n                          additionalProperties:\n                            type: string\n                          description: Specifies Labels to override or add for underlying\n                            Pods, PVCs, Account & TLS Secrets, Services Owned by Component.\n                          type: object\n                        name:\n                          description: |-\n                            Specifies the Component's name.\n                            It's part of the Service DNS name and must comply with the IANA service naming rule.\n                            The name is optional when ClusterComponentSpec is used as a template (e.g., in `clusterSharding`),\n                            but required otherwise.\n                          maxLength: 22\n                          pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        offlineInstances:\n                          description: |-\n                            Specifies the names of instances to be transitioned to offline status.\n\n\n                            Marking an instance as offline results in the following:\n\n\n                            1. The associated Pod is stopped, and its PersistentVolumeClaim (PVC) is retained for potential\n                               future reuse or data recovery, but it is no longer actively used.\n                            2. The ordinal number assigned to this instance is preserved, ensuring it remains unique\n                               and avoiding conflicts with new instances.\n\n\n                            Setting instances to offline allows for a controlled scale-in process, preserving their data and maintaining\n                            ordinal consistency within the Cluster.\n                          items:\n                            type: string\n                          type: array\n                        parallelPodManagementConcurrency:\n                          anyOf:\n                          - type: integer\n                          - type: string\n                          description: |-\n                            Controls the concurrency of pods during initial scale up, when replacing pods on nodes,\n                            or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.\n                            The default Concurrency is 100%.\n                          x-kubernetes-int-or-string: true\n                        persistentVolumeClaimRetentionPolicy:\n                          description: |-\n                            persistentVolumeClaimRetentionPolicy describes the lifecycle of persistent\n                            volume claims created from volumeClaimTemplates. By default, all persistent\n                            volume claims are created as needed and retained until manually deleted. This\n                            policy allows the lifecycle to be altered, for example by deleting persistent\n                            volume claims when their workload is deleted, or when their pod is scaled\n                            down.\n                          properties:\n                            whenDeleted:\n                              description: |-\n                                WhenDeleted specifies what happens to PVCs created from VolumeClaimTemplates when the workload is deleted.\n                                The `Retain` policy causes PVCs to not be affected by workload deletion.\n                                The default policy of `Delete` causes those PVCs to be deleted.\n                              enum:\n                              - Retain\n                              - Delete\n                              type: string\n                            whenScaled:\n                              description: |-\n                                WhenScaled specifies what happens to PVCs created from VolumeClaimTemplates when the workload is scaled down.\n                                The `Retain` policy causes PVCs to not be affected by a scale down.\n                                The default policy of `Delete` causes the associated PVCs for pods scaled down to be deleted.\n                              enum:\n                              - Retain\n                              - Delete\n                              type: string\n                          type: object\n                        podUpdatePolicy:\n                          description: |-\n                            PodUpdatePolicy indicates how pods should be updated\n\n\n                            - `StrictInPlace` indicates that only allows in-place upgrades.\n                            Any attempt to modify other fields will be rejected.\n                            - `PreferInPlace` indicates that we will first attempt an in-place upgrade of the Pod.\n                            If that fails, it will fall back to the ReCreate, where pod will be recreated.\n                            Default value is \"PreferInPlace\"\n                          enum:\n                          - StrictInPlace\n                          - PreferInPlace\n                          type: string\n                        replicas:\n                          default: 1\n                          description: Specifies the desired number of replicas in\n                            the Component for enhancing availability and durability,\n                            or load balancing.\n                          format: int32\n                          minimum: 0\n                          type: integer\n                        resources:\n                          description: |-\n                            Specifies the resources required by the Component.\n                            It allows defining the CPU, memory requirements and limits for the Component's containers.\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                          x-kubernetes-preserve-unknown-fields: true\n                        schedulingPolicy:\n                          description: |-\n                            Specifies the scheduling policy for the Component.\n                            If defined, it will overwrite the scheduling policy defined in ClusterSpec.\n                          properties:\n                            affinity:\n                              description: Specifies a group of affinity scheduling\n                                rules of the Cluster, including NodeAffinity, PodAffinity,\n                                and PodAntiAffinity.\n                              properties:\n                                nodeAffinity:\n                                  description: Describes node affinity scheduling\n                                    rules for the pod.\n                                  properties:\n                                    preferredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        The scheduler will prefer to schedule pods to nodes that satisfy\n                                        the affinity expressions specified by this field, but it may choose\n                                        a node that violates one or more of the expressions. The node that is\n                                        most preferred is the one with the greatest sum of weights, i.e.\n                                        for each node that meets all of the scheduling requirements (resource\n                                        request, requiredDuringScheduling affinity expressions, etc.),\n                                        compute a sum by iterating through the elements of this field and adding\n                                        \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                        node(s) with the highest sum are the most preferred.\n                                      items:\n                                        description: |-\n                                          An empty preferred scheduling term matches all objects with implicit weight 0\n                                          (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                        properties:\n                                          preference:\n                                            description: A node selector term, associated\n                                              with the corresponding weight.\n                                            properties:\n                                              matchExpressions:\n                                                description: A list of node selector\n                                                  requirements by node's labels.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchFields:\n                                                description: A list of node selector\n                                                  requirements by node's fields.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          weight:\n                                            description: Weight associated with matching\n                                              the corresponding nodeSelectorTerm,\n                                              in the range 1-100.\n                                            format: int32\n                                            type: integer\n                                        required:\n                                        - preference\n                                        - weight\n                                        type: object\n                                      type: array\n                                    requiredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        If the affinity requirements specified by this field are not met at\n                                        scheduling time, the pod will not be scheduled onto the node.\n                                        If the affinity requirements specified by this field cease to be met\n                                        at some point during pod execution (e.g. due to an update), the system\n                                        may or may not try to eventually evict the pod from its node.\n                                      properties:\n                                        nodeSelectorTerms:\n                                          description: Required. A list of node selector\n                                            terms. The terms are ORed.\n                                          items:\n                                            description: |-\n                                              A null or empty node selector term matches no objects. The requirements of\n                                              them are ANDed.\n                                              The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                            properties:\n                                              matchExpressions:\n                                                description: A list of node selector\n                                                  requirements by node's labels.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchFields:\n                                                description: A list of node selector\n                                                  requirements by node's fields.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          type: array\n                                      required:\n                                      - nodeSelectorTerms\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                                podAffinity:\n                                  description: Describes pod affinity scheduling rules\n                                    (e.g. co-locate this pod in the same node, zone,\n                                    etc. as some other pod(s)).\n                                  properties:\n                                    preferredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        The scheduler will prefer to schedule pods to nodes that satisfy\n                                        the affinity expressions specified by this field, but it may choose\n                                        a node that violates one or more of the expressions. The node that is\n                                        most preferred is the one with the greatest sum of weights, i.e.\n                                        for each node that meets all of the scheduling requirements (resource\n                                        request, requiredDuringScheduling affinity expressions, etc.),\n                                        compute a sum by iterating through the elements of this field and adding\n                                        \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                        node(s) with the highest sum are the most preferred.\n                                      items:\n                                        description: The weights of all of the matched\n                                          WeightedPodAffinityTerm fields are added\n                                          per-node to find the most preferred node(s)\n                                        properties:\n                                          podAffinityTerm:\n                                            description: Required. A pod affinity\n                                              term, associated with the corresponding\n                                              weight.\n                                            properties:\n                                              labelSelector:\n                                                description: |-\n                                                  A label query over a set of resources, in this case pods.\n                                                  If it's null, this PodAffinityTerm matches with no Pods.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              matchLabelKeys:\n                                                description: |-\n                                                  MatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                  Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              mismatchLabelKeys:\n                                                description: |-\n                                                  MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                  Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              namespaceSelector:\n                                                description: |-\n                                                  A label query over the set of namespaces that the term applies to.\n                                                  The term is applied to the union of the namespaces selected by this field\n                                                  and the ones listed in the namespaces field.\n                                                  null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                  An empty selector ({}) matches all namespaces.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              namespaces:\n                                                description: |-\n                                                  namespaces specifies a static list of namespace names that the term applies to.\n                                                  The term is applied to the union of the namespaces listed in this field\n                                                  and the ones selected by namespaceSelector.\n                                                  null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                items:\n                                                  type: string\n                                                type: array\n                                              topologyKey:\n                                                description: |-\n                                                  This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                  the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                  whose value of the label with key topologyKey matches that of any node on which any of the\n                                                  selected pods is running.\n                                                  Empty topologyKey is not allowed.\n                                                type: string\n                                            required:\n                                            - topologyKey\n                                            type: object\n                                          weight:\n                                            description: |-\n                                              weight associated with matching the corresponding podAffinityTerm,\n                                              in the range 1-100.\n                                            format: int32\n                                            type: integer\n                                        required:\n                                        - podAffinityTerm\n                                        - weight\n                                        type: object\n                                      type: array\n                                    requiredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        If the affinity requirements specified by this field are not met at\n                                        scheduling time, the pod will not be scheduled onto the node.\n                                        If the affinity requirements specified by this field cease to be met\n                                        at some point during pod execution (e.g. due to a pod label update), the\n                                        system may or may not try to eventually evict the pod from its node.\n                                        When there are multiple elements, the lists of nodes corresponding to each\n                                        podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                      items:\n                                        description: |-\n                                          Defines a set of pods (namely those matching the labelSelector\n                                          relative to the given namespace(s)) that this pod should be\n                                          co-located (affinity) or not co-located (anti-affinity) with,\n                                          where co-located is defined as running on a node whose value of\n                                          the label with key <topologyKey> matches that of any node on which\n                                          a pod of the set of pods is running\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      type: array\n                                  type: object\n                                podAntiAffinity:\n                                  description: Describes pod anti-affinity scheduling\n                                    rules (e.g. avoid putting this pod in the same\n                                    node, zone, etc. as some other pod(s)).\n                                  properties:\n                                    preferredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        The scheduler will prefer to schedule pods to nodes that satisfy\n                                        the anti-affinity expressions specified by this field, but it may choose\n                                        a node that violates one or more of the expressions. The node that is\n                                        most preferred is the one with the greatest sum of weights, i.e.\n                                        for each node that meets all of the scheduling requirements (resource\n                                        request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                        compute a sum by iterating through the elements of this field and adding\n                                        \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                        node(s) with the highest sum are the most preferred.\n                                      items:\n                                        description: The weights of all of the matched\n                                          WeightedPodAffinityTerm fields are added\n                                          per-node to find the most preferred node(s)\n                                        properties:\n                                          podAffinityTerm:\n                                            description: Required. A pod affinity\n                                              term, associated with the corresponding\n                                              weight.\n                                            properties:\n                                              labelSelector:\n                                                description: |-\n                                                  A label query over a set of resources, in this case pods.\n                                                  If it's null, this PodAffinityTerm matches with no Pods.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              matchLabelKeys:\n                                                description: |-\n                                                  MatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                  Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              mismatchLabelKeys:\n                                                description: |-\n                                                  MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                  Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              namespaceSelector:\n                                                description: |-\n                                                  A label query over the set of namespaces that the term applies to.\n                                                  The term is applied to the union of the namespaces selected by this field\n                                                  and the ones listed in the namespaces field.\n                                                  null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                  An empty selector ({}) matches all namespaces.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              namespaces:\n                                                description: |-\n                                                  namespaces specifies a static list of namespace names that the term applies to.\n                                                  The term is applied to the union of the namespaces listed in this field\n                                                  and the ones selected by namespaceSelector.\n                                                  null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                items:\n                                                  type: string\n                                                type: array\n                                              topologyKey:\n                                                description: |-\n                                                  This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                  the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                  whose value of the label with key topologyKey matches that of any node on which any of the\n                                                  selected pods is running.\n                                                  Empty topologyKey is not allowed.\n                                                type: string\n                                            required:\n                                            - topologyKey\n                                            type: object\n                                          weight:\n                                            description: |-\n                                              weight associated with matching the corresponding podAffinityTerm,\n                                              in the range 1-100.\n                                            format: int32\n                                            type: integer\n                                        required:\n                                        - podAffinityTerm\n                                        - weight\n                                        type: object\n                                      type: array\n                                    requiredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        If the anti-affinity requirements specified by this field are not met at\n                                        scheduling time, the pod will not be scheduled onto the node.\n                                        If the anti-affinity requirements specified by this field cease to be met\n                                        at some point during pod execution (e.g. due to a pod label update), the\n                                        system may or may not try to eventually evict the pod from its node.\n                                        When there are multiple elements, the lists of nodes corresponding to each\n                                        podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                      items:\n                                        description: |-\n                                          Defines a set of pods (namely those matching the labelSelector\n                                          relative to the given namespace(s)) that this pod should be\n                                          co-located (affinity) or not co-located (anti-affinity) with,\n                                          where co-located is defined as running on a node whose value of\n                                          the label with key <topologyKey> matches that of any node on which\n                                          a pod of the set of pods is running\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      type: array\n                                  type: object\n                              type: object\n                            nodeName:\n                              description: |-\n                                NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                                the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                                requirements.\n                              type: string\n                            nodeSelector:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                NodeSelector is a selector which must be true for the Pod to fit on a node.\n                                Selector which must match a node's labels for the Pod to be scheduled on that node.\n                                More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            schedulerName:\n                              description: |-\n                                If specified, the Pod will be dispatched by specified scheduler.\n                                If not specified, the Pod will be dispatched by default scheduler.\n                              type: string\n                            tolerations:\n                              description: |-\n                                Allows Pods to be scheduled onto nodes with matching taints.\n                                Each toleration in the array allows the Pod to tolerate node taints based on\n                                specified `key`, `value`, `effect`, and `operator`.\n\n\n                                - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                                - The `operator` determines how the toleration matches the taint.\n\n\n                                Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                              items:\n                                description: |-\n                                  The pod this Toleration is attached to tolerates any taint that matches\n                                  the triple <key,value,effect> using the matching operator <operator>.\n                                properties:\n                                  effect:\n                                    description: |-\n                                      Effect indicates the taint effect to match. Empty means match all taint effects.\n                                      When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                    type: string\n                                  key:\n                                    description: |-\n                                      Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                      If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      Operator represents a key's relationship to the value.\n                                      Valid operators are Exists and Equal. Defaults to Equal.\n                                      Exists is equivalent to wildcard for value, so that a pod can\n                                      tolerate all taints of a particular category.\n                                    type: string\n                                  tolerationSeconds:\n                                    description: |-\n                                      TolerationSeconds represents the period of time the toleration (which must be\n                                      of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                      it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                      negative values will be treated as 0 (evict immediately) by the system.\n                                    format: int64\n                                    type: integer\n                                  value:\n                                    description: |-\n                                      Value is the taint value the toleration matches to.\n                                      If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                    type: string\n                                type: object\n                              type: array\n                            topologySpreadConstraints:\n                              description: |-\n                                TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                                domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                                All topologySpreadConstraints are ANDed.\n                              items:\n                                description: TopologySpreadConstraint specifies how\n                                  to spread matching pods among the given topology.\n                                properties:\n                                  labelSelector:\n                                    description: |-\n                                      LabelSelector is used to find matching pods.\n                                      Pods that match this label selector are counted to determine the number of pods\n                                      in their corresponding topology domain.\n                                    properties:\n                                      matchExpressions:\n                                        description: matchExpressions is a list of\n                                          label selector requirements. The requirements\n                                          are ANDed.\n                                        items:\n                                          description: |-\n                                            A label selector requirement is a selector that contains values, a key, and an operator that\n                                            relates the key and values.\n                                          properties:\n                                            key:\n                                              description: key is the label key that\n                                                the selector applies to.\n                                              type: string\n                                            operator:\n                                              description: |-\n                                                operator represents a key's relationship to a set of values.\n                                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                                              type: string\n                                            values:\n                                              description: |-\n                                                values is an array of string values. If the operator is In or NotIn,\n                                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                the values array must be empty. This array is replaced during a strategic\n                                                merge patch.\n                                              items:\n                                                type: string\n                                              type: array\n                                          required:\n                                          - key\n                                          - operator\n                                          type: object\n                                        type: array\n                                      matchLabels:\n                                        additionalProperties:\n                                          type: string\n                                        description: |-\n                                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                        type: object\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  matchLabelKeys:\n                                    description: |-\n                                      MatchLabelKeys is a set of pod label keys to select the pods over which\n                                      spreading will be calculated. The keys are used to lookup values from the\n                                      incoming pod labels, those key-value labels are ANDed with labelSelector\n                                      to select the group of existing pods over which spreading will be calculated\n                                      for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                      MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                      Keys that don't exist in the incoming pod labels will\n                                      be ignored. A null or empty list means only match against labelSelector.\n\n\n                                      This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                    items:\n                                      type: string\n                                    type: array\n                                    x-kubernetes-list-type: atomic\n                                  maxSkew:\n                                    description: |-\n                                      MaxSkew describes the degree to which pods may be unevenly distributed.\n                                      When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                      between the number of matching pods in the target topology and the global minimum.\n                                      The global minimum is the minimum number of matching pods in an eligible domain\n                                      or zero if the number of eligible domains is less than MinDomains.\n                                      For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                      labelSelector spread as 2/2/1:\n                                      In this case, the global minimum is 1.\n                                      | zone1 | zone2 | zone3 |\n                                      |  P P  |  P P  |   P   |\n                                      - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                      scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                      violate MaxSkew(1).\n                                      - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                      When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                      to topologies that satisfy it.\n                                      It's a required field. Default value is 1 and 0 is not allowed.\n                                    format: int32\n                                    type: integer\n                                  minDomains:\n                                    description: |-\n                                      MinDomains indicates a minimum number of eligible domains.\n                                      When the number of eligible domains with matching topology keys is less than minDomains,\n                                      Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                      And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                      this value has no effect on scheduling.\n                                      As a result, when the number of eligible domains is less than minDomains,\n                                      scheduler won't schedule more than maxSkew Pods to those domains.\n                                      If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                      Valid values are integers greater than 0.\n                                      When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                      For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                      labelSelector spread as 2/2/2:\n                                      | zone1 | zone2 | zone3 |\n                                      |  P P  |  P P  |  P P  |\n                                      The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                      In this situation, new pod with the same labelSelector cannot be scheduled,\n                                      because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                      it will violate MaxSkew.\n\n\n                                      This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                    format: int32\n                                    type: integer\n                                  nodeAffinityPolicy:\n                                    description: |-\n                                      NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                      when calculating pod topology spread skew. Options are:\n                                      - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                      - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                      If this value is nil, the behavior is equivalent to the Honor policy.\n                                      This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                    type: string\n                                  nodeTaintsPolicy:\n                                    description: |-\n                                      NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                      pod topology spread skew. Options are:\n                                      - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                      has a toleration, are included.\n                                      - Ignore: node taints are ignored. All nodes are included.\n\n\n                                      If this value is nil, the behavior is equivalent to the Ignore policy.\n                                      This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                    type: string\n                                  topologyKey:\n                                    description: |-\n                                      TopologyKey is the key of node labels. Nodes that have a label with this key\n                                      and identical values are considered to be in the same topology.\n                                      We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                      of pods into each bucket.\n                                      We define a domain as a particular instance of a topology.\n                                      Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                      nodeAffinityPolicy and nodeTaintsPolicy.\n                                      e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                      And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                      It's a required field.\n                                    type: string\n                                  whenUnsatisfiable:\n                                    description: |-\n                                      WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                      the spread constraint.\n                                      - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                      - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                        but giving higher precedence to topologies that would help reduce the\n                                        skew.\n                                      A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                      if and only if every possible node assignment for that pod would violate\n                                      \"MaxSkew\" on some topology.\n                                      For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                      labelSelector spread as 3/1/1:\n                                      | zone1 | zone2 | zone3 |\n                                      | P P P |   P   |   P   |\n                                      If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                      to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                      MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                      won't make it *more* imbalanced.\n                                      It's a required field.\n                                    type: string\n                                required:\n                                - maxSkew\n                                - topologyKey\n                                - whenUnsatisfiable\n                                type: object\n                              type: array\n                          type: object\n                        serviceAccountName:\n                          description: |-\n                            Specifies the name of the ServiceAccount required by the running Component.\n                            This ServiceAccount is used to grant necessary permissions for the Component's Pods to interact\n                            with other Kubernetes resources, such as modifying Pod labels or sending events.\n\n\n                            If not specified, KubeBlocks automatically creates a default ServiceAccount named\n                            \"kb-{componentdefinition.name}\", bound to a role with rules defined in ComponentDefinition's\n                            `policyRules` field. If needed (currently this means if any lifecycleAction is enabled),\n                            it will also be bound to a default role named\n                            \"kubeblocks-cluster-pod-role\", which is installed together with KubeBlocks.\n                            If multiple components use the same ComponentDefinition, they will share one ServiceAccount.\n\n\n                            If the field is not empty, the specified ServiceAccount will be used, and KubeBlocks will not\n                            create a ServiceAccount. But KubeBlocks does create RoleBindings for the specified ServiceAccount.\n                          type: string\n                        serviceRefs:\n                          description: |-\n                            Defines a list of ServiceRef for a Component, enabling access to both external services and\n                            Services provided by other Clusters.\n\n\n                            Types of services:\n\n\n                            - External services: Not managed by KubeBlocks or managed by a different KubeBlocks operator;\n                              Require a ServiceDescriptor for connection details.\n                            - Services provided by a Cluster: Managed by the same KubeBlocks operator;\n                              identified using Cluster, Component and Service names.\n\n\n                            ServiceRefs with identical `serviceRef.name` in the same Cluster are considered the same.\n\n\n                            Example:\n                            ```yaml\n                            serviceRefs:\n                              - name: \"redis-sentinel\"\n                                serviceDescriptor:\n                                  name: \"external-redis-sentinel\"\n                              - name: \"postgres-cluster\"\n                                clusterServiceSelector:\n                                  cluster: \"my-postgres-cluster\"\n                                  service:\n                                    component: \"postgresql\"\n                            ```\n                            The example above includes ServiceRefs to an external Redis Sentinel service and a PostgreSQL Cluster.\n                          items:\n                            properties:\n                              cluster:\n                                description: |-\n                                  Specifies the name of the KubeBlocks Cluster being referenced.\n                                  This is used when services from another KubeBlocks Cluster are consumed.\n\n\n                                  By default, the referenced KubeBlocks Cluster's `clusterDefinition.spec.connectionCredential`\n                                  will be utilized to bind to the current Component. This credential should include:\n                                  `endpoint`, `port`, `username`, and `password`.\n\n\n                                  Note:\n\n\n                                  - The `ServiceKind` and `ServiceVersion` specified in the service reference within the\n                                    ClusterDefinition are not validated when using this approach.\n                                  - If both `cluster` and `serviceDescriptor` are present, `cluster` will take precedence.\n\n\n                                  Deprecated since v0.9 since `clusterDefinition.spec.connectionCredential` is deprecated,\n                                  use `clusterServiceSelector` instead.\n                                  This field is maintained for backward compatibility and its use is discouraged.\n                                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                                type: string\n                              clusterServiceSelector:\n                                description: |-\n                                  References a service provided by another KubeBlocks Cluster.\n                                  It specifies the ClusterService and the account credentials needed for access.\n                                properties:\n                                  cluster:\n                                    description: The name of the Cluster being referenced.\n                                    type: string\n                                  credential:\n                                    description: |-\n                                      Specifies the SystemAccount to authenticate and establish a connection with the referenced Cluster.\n                                      The SystemAccount should be defined in `componentDefinition.spec.systemAccounts`\n                                      of the Component providing the service in the referenced Cluster.\n                                    properties:\n                                      component:\n                                        description: The name of the Component where\n                                          the credential resides in.\n                                        type: string\n                                      name:\n                                        description: The name of the credential (SystemAccount)\n                                          to reference.\n                                        type: string\n                                    required:\n                                    - component\n                                    - name\n                                    type: object\n                                  podFQDNs:\n                                    properties:\n                                      component:\n                                        description: The name of the Component where\n                                          the pods reside in.\n                                        type: string\n                                      role:\n                                        description: The role of the pods to reference.\n                                        type: string\n                                    required:\n                                    - component\n                                    type: object\n                                  service:\n                                    description: Identifies a ClusterService from\n                                      the list of Services defined in `cluster.spec.services`\n                                      of the referenced Cluster.\n                                    properties:\n                                      component:\n                                        description: |-\n                                          The name of the Component where the Service resides in.\n\n\n                                          It is required when referencing a Component's Service.\n                                        type: string\n                                      port:\n                                        description: |-\n                                          The port name of the Service to be referenced.\n\n\n                                          If there is a non-zero node-port exist for the matched Service port, the node-port will be selected first.\n\n\n                                          If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                          and the resolved value will be presented in the following format: service1.name:port1,service2.name:port2...\n                                        type: string\n                                      service:\n                                        description: |-\n                                          The name of the Service to be referenced.\n\n\n                                          Leave it empty to reference the default Service. Set it to \"headless\" to reference the default headless Service.\n\n\n                                          If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                          and the resolved value will be presented in the following format: service1.name,service2.name...\n                                        type: string\n                                    required:\n                                    - service\n                                    type: object\n                                required:\n                                - cluster\n                                type: object\n                              name:\n                                description: |-\n                                  Specifies the identifier of the service reference declaration.\n                                  It corresponds to the serviceRefDeclaration name defined in either:\n\n\n                                  - `componentDefinition.spec.serviceRefDeclarations[*].name`\n                                  - `clusterDefinition.spec.componentDefs[*].serviceRefDeclarations[*].name` (deprecated)\n                                type: string\n                              namespace:\n                                description: |-\n                                  Specifies the namespace of the referenced Cluster or the namespace of the referenced ServiceDescriptor object.\n                                  If not provided, the referenced Cluster and ServiceDescriptor will be searched in the namespace of the current\n                                  Cluster by default.\n                                type: string\n                              serviceDescriptor:\n                                description: |-\n                                  Specifies the name of the ServiceDescriptor object that describes a service provided by external sources.\n\n\n                                  When referencing a service provided by external sources, a ServiceDescriptor object is required to establish\n                                  the service binding.\n                                  The `serviceDescriptor.spec.serviceKind` and `serviceDescriptor.spec.serviceVersion` should match the serviceKind\n                                  and serviceVersion declared in the definition.\n\n\n                                  If both `cluster` and `serviceDescriptor` are specified, the `cluster` takes precedence.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        serviceVersion:\n                          description: |-\n                            ServiceVersion specifies the version of the Service expected to be provisioned by this Component.\n                            The version should follow the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n                            If no version is specified, the latest available version will be used.\n                          maxLength: 32\n                          type: string\n                        services:\n                          description: Overrides services defined in referenced ComponentDefinition.\n                          items:\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  If ServiceType is LoadBalancer, cloud provider related parameters can be put here.\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                                type: object\n                              name:\n                                description: References the ComponentService name\n                                  defined in the `componentDefinition.spec.services[*].name`.\n                                maxLength: 25\n                                type: string\n                              podService:\n                                default: false\n                                description: |-\n                                  Indicates whether to generate individual Services for each Pod.\n                                  If set to true, a separate Service will be created for each Pod in the Cluster.\n                                type: boolean\n                              serviceType:\n                                default: ClusterIP\n                                description: |-\n                                  Determines how the Service is exposed. Valid options are `ClusterIP`, `NodePort`, and `LoadBalancer`.\n\n\n                                  - `ClusterIP` allocates a Cluster-internal IP address for load-balancing to endpoints.\n                                     Endpoints are determined by the selector or if that is not specified,\n                                     they are determined by manual construction of an Endpoints object or EndpointSlice objects.\n                                  - `NodePort` builds on ClusterIP and allocates a port on every node which routes to the same endpoints as the ClusterIP.\n                                  - `LoadBalancer` builds on NodePort and creates an external load-balancer (if supported in the current cloud)\n                                     which routes to the same endpoints as the ClusterIP.\n\n\n                                  Note: although K8s Service type allows the 'ExternalName' type, it is not a valid option for ClusterComponentService.\n\n\n                                  For more info, see:\n                                  https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types.\n                                enum:\n                                - ClusterIP\n                                - NodePort\n                                - LoadBalancer\n                                type: string\n                                x-kubernetes-preserve-unknown-fields: true\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        stop:\n                          description: |-\n                            Stop the Component.\n                            If set, all the computing resources will be released.\n                          type: boolean\n                        systemAccounts:\n                          description: Overrides system accounts defined in referenced\n                            ComponentDefinition.\n                          items:\n                            properties:\n                              disabled:\n                                default: false\n                                description: Specifies whether the system account\n                                  is disabled.\n                                type: boolean\n                              name:\n                                description: The name of the system account.\n                                type: string\n                              passwordConfig:\n                                description: |-\n                                  Specifies the policy for generating the account's password.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  length:\n                                    default: 16\n                                    description: The length of the password.\n                                    format: int32\n                                    maximum: 32\n                                    minimum: 8\n                                    type: integer\n                                  letterCase:\n                                    default: MixedCases\n                                    description: The case of the letters in the password.\n                                    enum:\n                                    - LowerCases\n                                    - UpperCases\n                                    - MixedCases\n                                    type: string\n                                  numDigits:\n                                    default: 4\n                                    description: The number of digits in the password.\n                                    format: int32\n                                    maximum: 8\n                                    minimum: 0\n                                    type: integer\n                                  numSymbols:\n                                    default: 0\n                                    description: The number of symbols in the password.\n                                    format: int32\n                                    maximum: 8\n                                    minimum: 0\n                                    type: integer\n                                  seed:\n                                    description: |-\n                                      Seed to generate the account's password.\n                                      Cannot be updated.\n                                    type: string\n                                  symbolCharacters:\n                                    description: |-\n                                      The set of symbols allowed when generating password. If empty, kubeblocks will\n                                      use a default symbol set, which is \"!@#&*\".\n                                    type: string\n                                type: object\n                              secretRef:\n                                description: |-\n                                  Refers to the secret from which data will be copied to create the new account.\n\n\n                                  For user-specified passwords, the maximum length is limited to 64 bytes.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  name:\n                                    description: The unique identifier of the secret.\n                                    type: string\n                                  namespace:\n                                    description: The namespace where the secret is\n                                      located.\n                                    type: string\n                                  password:\n                                    default: password\n                                    description: The key in the secret data that contains\n                                      the password.\n                                    type: string\n                                required:\n                                - name\n                                - namespace\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        tls:\n                          description: |-\n                            A boolean flag that indicates whether the Component should use Transport Layer Security (TLS)\n                            for secure communication.\n                            When set to true, the Component will be configured to use TLS encryption for its network connections.\n                            This ensures that the data transmitted between the Component and its clients or other Components is encrypted\n                            and protected from unauthorized access.\n                            If TLS is enabled, the Component may require additional configuration, such as specifying TLS certificates and keys,\n                            to properly set up the secure communication channel.\n                          type: boolean\n                        volumeClaimTemplates:\n                          description: |-\n                            Specifies a list of PersistentVolumeClaim templates that represent the storage requirements for the Component.\n                            Each template specifies the desired characteristics of a persistent volume, such as storage class,\n                            size, and access modes.\n                            These templates are used to dynamically provision persistent volumes for the Component.\n                          items:\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                description: Specifies the annotations for the PVC\n                                  of the volume.\n                                type: object\n                              labels:\n                                additionalProperties:\n                                  type: string\n                                description: Specifies the labels for the PVC of the\n                                  volume.\n                                type: object\n                              name:\n                                description: |-\n                                  Refers to the name of a volumeMount defined in either:\n\n\n                                  - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                                  - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                                  The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                                type: string\n                              spec:\n                                description: |-\n                                  Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                                  with the mount name specified in the `name` field.\n\n\n                                  When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                                  defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                                properties:\n                                  accessModes:\n                                    description: |-\n                                      Contains the desired access modes the volume should have.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                    items:\n                                      type: string\n                                    type: array\n                                    x-kubernetes-preserve-unknown-fields: true\n                                  resources:\n                                    description: |-\n                                      Represents the minimum resources the volume should have.\n                                      If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                      are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                    properties:\n                                      limits:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Limits describes the maximum amount of compute resources allowed.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                      requests:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Requests describes the minimum amount of compute resources required.\n                                          If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                          otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                    type: object\n                                    x-kubernetes-preserve-unknown-fields: true\n                                  storageClassName:\n                                    description: |-\n                                      The name of the StorageClass required by the claim.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                    type: string\n                                  volumeAttributesClassName:\n                                    description: |-\n                                      volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n\n\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                    type: string\n                                  volumeMode:\n                                    description: Defines what type of volume is required\n                                      by the claim, either Block or Filesystem.\n                                    type: string\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        volumes:\n                          description: List of volumes to override.\n                          items:\n                            description: Volume represents a named volume in a pod\n                              that may be accessed by any container in the pod.\n                            properties:\n                              awsElasticBlockStore:\n                                description: |-\n                                  awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                                  kubelet's host machine and then exposed to the pod.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  partition:\n                                    description: |-\n                                      partition is the partition in the volume that you want to mount.\n                                      If omitted, the default is to mount by volume name.\n                                      Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                      Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                    format: int32\n                                    type: integer\n                                  readOnly:\n                                    description: |-\n                                      readOnly value true will force the readOnly setting in VolumeMounts.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                    type: boolean\n                                  volumeID:\n                                    description: |-\n                                      volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                    type: string\n                                required:\n                                - volumeID\n                                type: object\n                              azureDisk:\n                                description: azureDisk represents an Azure Data Disk\n                                  mount on the host and bind mount to the pod.\n                                properties:\n                                  cachingMode:\n                                    description: 'cachingMode is the Host Caching\n                                      mode: None, Read Only, Read Write.'\n                                    type: string\n                                  diskName:\n                                    description: diskName is the Name of the data\n                                      disk in the blob storage\n                                    type: string\n                                  diskURI:\n                                    description: diskURI is the URI of data disk in\n                                      the blob storage\n                                    type: string\n                                  fsType:\n                                    description: |-\n                                      fsType is Filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  kind:\n                                    description: 'kind expected values are Shared:\n                                      multiple blob disks per storage account  Dedicated:\n                                      single blob disk per storage account  Managed:\n                                      azure managed data disk (only in managed availability\n                                      set). defaults to shared'\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                required:\n                                - diskName\n                                - diskURI\n                                type: object\n                              azureFile:\n                                description: azureFile represents an Azure File Service\n                                  mount on the host and bind mount to the pod.\n                                properties:\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretName:\n                                    description: secretName is the  name of secret\n                                      that contains Azure Storage Account Name and\n                                      Key\n                                    type: string\n                                  shareName:\n                                    description: shareName is the azure share Name\n                                    type: string\n                                required:\n                                - secretName\n                                - shareName\n                                type: object\n                              cephfs:\n                                description: cephFS represents a Ceph FS mount on\n                                  the host that shares a pod's lifetime\n                                properties:\n                                  monitors:\n                                    description: |-\n                                      monitors is Required: Monitors is a collection of Ceph monitors\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    items:\n                                      type: string\n                                    type: array\n                                  path:\n                                    description: 'path is Optional: Used as the mounted\n                                      root, rather than the full Ceph tree, default\n                                      is /'\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    type: boolean\n                                  secretFile:\n                                    description: |-\n                                      secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    type: string\n                                  secretRef:\n                                    description: |-\n                                      secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  user:\n                                    description: |-\n                                      user is optional: User is the rados user name, default is admin\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    type: string\n                                required:\n                                - monitors\n                                type: object\n                              cinder:\n                                description: |-\n                                  cinder represents a cinder volume attached and mounted on kubelets host machine.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef is optional: points to a secret object containing parameters used to connect\n                                      to OpenStack.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  volumeID:\n                                    description: |-\n                                      volumeID used to identify the volume in cinder.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    type: string\n                                required:\n                                - volumeID\n                                type: object\n                              configMap:\n                                description: configMap represents a configMap that\n                                  should populate this volume\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      ConfigMap will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the ConfigMap,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional specify whether the ConfigMap\n                                      or its keys must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              csi:\n                                description: csi (Container Storage Interface) represents\n                                  ephemeral storage that is handled by certain external\n                                  CSI drivers (Beta feature).\n                                properties:\n                                  driver:\n                                    description: |-\n                                      driver is the name of the CSI driver that handles this volume.\n                                      Consult with your admin for the correct name as registered in the cluster.\n                                    type: string\n                                  fsType:\n                                    description: |-\n                                      fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                      If not provided, the empty value is passed to the associated CSI driver\n                                      which will determine the default filesystem to apply.\n                                    type: string\n                                  nodePublishSecretRef:\n                                    description: |-\n                                      nodePublishSecretRef is a reference to the secret object containing\n                                      sensitive information to pass to the CSI driver to complete the CSI\n                                      NodePublishVolume and NodeUnpublishVolume calls.\n                                      This field is optional, and  may be empty if no secret is required. If the\n                                      secret object contains more than one secret, all secret references are passed.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  readOnly:\n                                    description: |-\n                                      readOnly specifies a read-only configuration for the volume.\n                                      Defaults to false (read/write).\n                                    type: boolean\n                                  volumeAttributes:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      volumeAttributes stores driver-specific properties that are passed to the CSI\n                                      driver. Consult your driver's documentation for supported values.\n                                    type: object\n                                required:\n                                - driver\n                                type: object\n                              downwardAPI:\n                                description: downwardAPI represents downward API about\n                                  the pod that should populate this volume\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      Optional: mode bits to use on created files by default. Must be a\n                                      Optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: Items is a list of downward API volume\n                                      file\n                                    items:\n                                      description: DownwardAPIVolumeFile represents\n                                        information to create the file containing\n                                        the pod field\n                                      properties:\n                                        fieldRef:\n                                          description: 'Required: Selects a field\n                                            of the pod: only annotations, labels,\n                                            name and namespace are supported.'\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        mode:\n                                          description: |-\n                                            Optional: mode bits used to set permissions on this file, must be an octal value\n                                            between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: 'Required: Path is  the relative\n                                            path name of the file to be created. Must\n                                            not be absolute or contain the ''..''\n                                            path. Must be utf-8 encoded. The first\n                                            item of the relative path must not start\n                                            with ''..'''\n                                          type: string\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      required:\n                                      - path\n                                      type: object\n                                    type: array\n                                type: object\n                              emptyDir:\n                                description: |-\n                                  emptyDir represents a temporary directory that shares a pod's lifetime.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                properties:\n                                  medium:\n                                    description: |-\n                                      medium represents what type of storage medium should back this directory.\n                                      The default is \"\" which means to use the node's default medium.\n                                      Must be an empty string (default) or Memory.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                    type: string\n                                  sizeLimit:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: |-\n                                      sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                      The size limit is also applicable for memory medium.\n                                      The maximum usage on memory medium EmptyDir would be the minimum value between\n                                      the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                      The default is nil which means that the limit is undefined.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                type: object\n                              ephemeral:\n                                description: |-\n                                  ephemeral represents a volume that is handled by a cluster storage driver.\n                                  The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                                  and deleted when the pod is removed.\n\n\n                                  Use this if:\n                                  a) the volume is only needed while the pod runs,\n                                  b) features of normal volumes like restoring from snapshot or capacity\n                                     tracking are needed,\n                                  c) the storage driver is specified through a storage class, and\n                                  d) the storage driver supports dynamic volume provisioning through\n                                     a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                     information on the connection between this volume type\n                                     and PersistentVolumeClaim).\n\n\n                                  Use PersistentVolumeClaim or one of the vendor-specific\n                                  APIs for volumes that persist for longer than the lifecycle\n                                  of an individual pod.\n\n\n                                  Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                                  be used that way - see the documentation of the driver for\n                                  more information.\n\n\n                                  A pod can use both types of ephemeral volumes and\n                                  persistent volumes at the same time.\n                                properties:\n                                  volumeClaimTemplate:\n                                    description: |-\n                                      Will be used to create a stand-alone PVC to provision the volume.\n                                      The pod in which this EphemeralVolumeSource is embedded will be the\n                                      owner of the PVC, i.e. the PVC will be deleted together with the\n                                      pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                      `<volume name>` is the name from the `PodSpec.Volumes` array\n                                      entry. Pod validation will reject the pod if the concatenated name\n                                      is not valid for a PVC (for example, too long).\n\n\n                                      An existing PVC with that name that is not owned by the pod\n                                      will *not* be used for the pod to avoid using an unrelated\n                                      volume by mistake. Starting the pod is then blocked until\n                                      the unrelated PVC is removed. If such a pre-created PVC is\n                                      meant to be used by the pod, the PVC has to updated with an\n                                      owner reference to the pod once the pod exists. Normally\n                                      this should not be necessary, but it may be useful when\n                                      manually reconstructing a broken cluster.\n\n\n                                      This field is read-only and no changes will be made by Kubernetes\n                                      to the PVC after it has been created.\n\n\n                                      Required, must not be nil.\n                                    properties:\n                                      metadata:\n                                        description: |-\n                                          May contain labels and annotations that will be copied into the PVC\n                                          when creating it. No other fields are allowed and will be rejected during\n                                          validation.\n                                        properties:\n                                          annotations:\n                                            additionalProperties:\n                                              type: string\n                                            type: object\n                                          finalizers:\n                                            items:\n                                              type: string\n                                            type: array\n                                          labels:\n                                            additionalProperties:\n                                              type: string\n                                            type: object\n                                          name:\n                                            type: string\n                                          namespace:\n                                            type: string\n                                        type: object\n                                      spec:\n                                        description: |-\n                                          The specification for the PersistentVolumeClaim. The entire content is\n                                          copied unchanged into the PVC that gets created from this\n                                          template. The same fields as in a PersistentVolumeClaim\n                                          are also valid here.\n                                        properties:\n                                          accessModes:\n                                            description: |-\n                                              accessModes contains the desired access modes the volume should have.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                            items:\n                                              type: string\n                                            type: array\n                                          dataSource:\n                                            description: |-\n                                              dataSource field can be used to specify either:\n                                              * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                              * An existing PVC (PersistentVolumeClaim)\n                                              If the provisioner or an external controller can support the specified data source,\n                                              it will create a new volume based on the contents of the specified data source.\n                                              When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                              and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                              If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                            properties:\n                                              apiGroup:\n                                                description: |-\n                                                  APIGroup is the group for the resource being referenced.\n                                                  If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                  For any other third-party types, APIGroup is required.\n                                                type: string\n                                              kind:\n                                                description: Kind is the type of resource\n                                                  being referenced\n                                                type: string\n                                              name:\n                                                description: Name is the name of resource\n                                                  being referenced\n                                                type: string\n                                            required:\n                                            - kind\n                                            - name\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          dataSourceRef:\n                                            description: |-\n                                              dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                              volume is desired. This may be any object from a non-empty API group (non\n                                              core object) or a PersistentVolumeClaim object.\n                                              When this field is specified, volume binding will only succeed if the type of\n                                              the specified object matches some installed volume populator or dynamic\n                                              provisioner.\n                                              This field will replace the functionality of the dataSource field and as such\n                                              if both fields are non-empty, they must have the same value. For backwards\n                                              compatibility, when namespace isn't specified in dataSourceRef,\n                                              both fields (dataSource and dataSourceRef) will be set to the same\n                                              value automatically if one of them is empty and the other is non-empty.\n                                              When namespace is specified in dataSourceRef,\n                                              dataSource isn't set to the same value and must be empty.\n                                              There are three important differences between dataSource and dataSourceRef:\n                                              * While dataSource only allows two specific types of objects, dataSourceRef\n                                                allows any non-core object, as well as PersistentVolumeClaim objects.\n                                              * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                                preserves all values, and generates an error if a disallowed value is\n                                                specified.\n                                              * While dataSource only allows local objects, dataSourceRef allows objects\n                                                in any namespaces.\n                                              (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                              (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                            properties:\n                                              apiGroup:\n                                                description: |-\n                                                  APIGroup is the group for the resource being referenced.\n                                                  If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                  For any other third-party types, APIGroup is required.\n                                                type: string\n                                              kind:\n                                                description: Kind is the type of resource\n                                                  being referenced\n                                                type: string\n                                              name:\n                                                description: Name is the name of resource\n                                                  being referenced\n                                                type: string\n                                              namespace:\n                                                description: |-\n                                                  Namespace is the namespace of resource being referenced\n                                                  Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                                  (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                                type: string\n                                            required:\n                                            - kind\n                                            - name\n                                            type: object\n                                          resources:\n                                            description: |-\n                                              resources represents the minimum resources the volume should have.\n                                              If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                              that are lower than previous value but must still be higher than capacity recorded in the\n                                              status field of the claim.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                            properties:\n                                              limits:\n                                                additionalProperties:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                description: |-\n                                                  Limits describes the maximum amount of compute resources allowed.\n                                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                type: object\n                                              requests:\n                                                additionalProperties:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                description: |-\n                                                  Requests describes the minimum amount of compute resources required.\n                                                  If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                  otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                type: object\n                                            type: object\n                                          selector:\n                                            description: selector is a label query\n                                              over volumes to consider for binding.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          storageClassName:\n                                            description: |-\n                                              storageClassName is the name of the StorageClass required by the claim.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                            type: string\n                                          volumeAttributesClassName:\n                                            description: |-\n                                              volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                              If specified, the CSI driver will create or update the volume with the attributes defined\n                                              in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                              it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                              will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                              If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                              will be set by the persistentvolume controller if it exists.\n                                              If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                              set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                              exists.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                              (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                            type: string\n                                          volumeMode:\n                                            description: |-\n                                              volumeMode defines what type of volume is required by the claim.\n                                              Value of Filesystem is implied when not included in claim spec.\n                                            type: string\n                                          volumeName:\n                                            description: volumeName is the binding\n                                              reference to the PersistentVolume backing\n                                              this claim.\n                                            type: string\n                                        type: object\n                                    required:\n                                    - spec\n                                    type: object\n                                type: object\n                              fc:\n                                description: fc represents a Fibre Channel resource\n                                  that is attached to a kubelet's host machine and\n                                  then exposed to the pod.\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  lun:\n                                    description: 'lun is Optional: FC target lun number'\n                                    format: int32\n                                    type: integer\n                                  readOnly:\n                                    description: |-\n                                      readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  targetWWNs:\n                                    description: 'targetWWNs is Optional: FC target\n                                      worldwide names (WWNs)'\n                                    items:\n                                      type: string\n                                    type: array\n                                  wwids:\n                                    description: |-\n                                      wwids Optional: FC volume world wide identifiers (wwids)\n                                      Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                    items:\n                                      type: string\n                                    type: array\n                                type: object\n                              flexVolume:\n                                description: |-\n                                  flexVolume represents a generic volume resource that is\n                                  provisioned/attached using an exec based plugin.\n                                properties:\n                                  driver:\n                                    description: driver is the name of the driver\n                                      to use for this volume.\n                                    type: string\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                    type: string\n                                  options:\n                                    additionalProperties:\n                                      type: string\n                                    description: 'options is Optional: this field\n                                      holds extra command options if any.'\n                                    type: object\n                                  readOnly:\n                                    description: |-\n                                      readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef is Optional: secretRef is reference to the secret object containing\n                                      sensitive information to pass to the plugin scripts. This may be\n                                      empty if no secret object is specified. If the secret object\n                                      contains more than one secret, all secrets are passed to the plugin\n                                      scripts.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                required:\n                                - driver\n                                type: object\n                              flocker:\n                                description: flocker represents a Flocker volume attached\n                                  to a kubelet's host machine. This depends on the\n                                  Flocker control service being running\n                                properties:\n                                  datasetName:\n                                    description: |-\n                                      datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                      should be considered as deprecated\n                                    type: string\n                                  datasetUUID:\n                                    description: datasetUUID is the UUID of the dataset.\n                                      This is unique identifier of a Flocker dataset\n                                    type: string\n                                type: object\n                              gcePersistentDisk:\n                                description: |-\n                                  gcePersistentDisk represents a GCE Disk resource that is attached to a\n                                  kubelet's host machine and then exposed to the pod.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  partition:\n                                    description: |-\n                                      partition is the partition in the volume that you want to mount.\n                                      If omitted, the default is to mount by volume name.\n                                      Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                      Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    format: int32\n                                    type: integer\n                                  pdName:\n                                    description: |-\n                                      pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the ReadOnly setting in VolumeMounts.\n                                      Defaults to false.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    type: boolean\n                                required:\n                                - pdName\n                                type: object\n                              gitRepo:\n                                description: |-\n                                  gitRepo represents a git repository at a particular revision.\n                                  DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                                  EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                                  into the Pod's container.\n                                properties:\n                                  directory:\n                                    description: |-\n                                      directory is the target directory name.\n                                      Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                      git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                      the subdirectory with the given name.\n                                    type: string\n                                  repository:\n                                    description: repository is the URL\n                                    type: string\n                                  revision:\n                                    description: revision is the commit hash for the\n                                      specified revision.\n                                    type: string\n                                required:\n                                - repository\n                                type: object\n                              glusterfs:\n                                description: |-\n                                  glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                                properties:\n                                  endpoints:\n                                    description: |-\n                                      endpoints is the endpoint name that details Glusterfs topology.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                    type: string\n                                  path:\n                                    description: |-\n                                      path is the Glusterfs volume path.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                      Defaults to false.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                    type: boolean\n                                required:\n                                - endpoints\n                                - path\n                                type: object\n                              hostPath:\n                                description: |-\n                                  hostPath represents a pre-existing file or directory on the host\n                                  machine that is directly exposed to the container. This is generally\n                                  used for system agents or other privileged things that are allowed\n                                  to see the host machine. Most containers will NOT need this.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                  ---\n                                  TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                                  mount host directories as read/write.\n                                properties:\n                                  path:\n                                    description: |-\n                                      path of the directory on the host.\n                                      If the path is a symlink, it will follow the link to the real path.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                    type: string\n                                  type:\n                                    description: |-\n                                      type for HostPath Volume\n                                      Defaults to \"\"\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                    type: string\n                                required:\n                                - path\n                                type: object\n                              iscsi:\n                                description: |-\n                                  iscsi represents an ISCSI Disk resource that is attached to a\n                                  kubelet's host machine and then exposed to the pod.\n                                  More info: https://examples.k8s.io/volumes/iscsi/README.md\n                                properties:\n                                  chapAuthDiscovery:\n                                    description: chapAuthDiscovery defines whether\n                                      support iSCSI Discovery CHAP authentication\n                                    type: boolean\n                                  chapAuthSession:\n                                    description: chapAuthSession defines whether support\n                                      iSCSI Session CHAP authentication\n                                    type: boolean\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  initiatorName:\n                                    description: |-\n                                      initiatorName is the custom iSCSI Initiator Name.\n                                      If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                      <target portal>:<volume name> will be created for the connection.\n                                    type: string\n                                  iqn:\n                                    description: iqn is the target iSCSI Qualified\n                                      Name.\n                                    type: string\n                                  iscsiInterface:\n                                    description: |-\n                                      iscsiInterface is the interface Name that uses an iSCSI transport.\n                                      Defaults to 'default' (tcp).\n                                    type: string\n                                  lun:\n                                    description: lun represents iSCSI Target Lun number.\n                                    format: int32\n                                    type: integer\n                                  portals:\n                                    description: |-\n                                      portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                      is other than default (typically TCP ports 860 and 3260).\n                                    items:\n                                      type: string\n                                    type: array\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the ReadOnly setting in VolumeMounts.\n                                      Defaults to false.\n                                    type: boolean\n                                  secretRef:\n                                    description: secretRef is the CHAP Secret for\n                                      iSCSI target and initiator authentication\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  targetPortal:\n                                    description: |-\n                                      targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                      is other than default (typically TCP ports 860 and 3260).\n                                    type: string\n                                required:\n                                - iqn\n                                - lun\n                                - targetPortal\n                                type: object\n                              name:\n                                description: |-\n                                  name of the volume.\n                                  Must be a DNS_LABEL and unique within the pod.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                type: string\n                              nfs:\n                                description: |-\n                                  nfs represents an NFS mount on the host that shares a pod's lifetime\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                properties:\n                                  path:\n                                    description: |-\n                                      path that is exported by the NFS server.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the NFS export to be mounted with read-only permissions.\n                                      Defaults to false.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    type: boolean\n                                  server:\n                                    description: |-\n                                      server is the hostname or IP address of the NFS server.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    type: string\n                                required:\n                                - path\n                                - server\n                                type: object\n                              persistentVolumeClaim:\n                                description: |-\n                                  persistentVolumeClaimVolumeSource represents a reference to a\n                                  PersistentVolumeClaim in the same namespace.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                properties:\n                                  claimName:\n                                    description: |-\n                                      claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly Will force the ReadOnly setting in VolumeMounts.\n                                      Default false.\n                                    type: boolean\n                                required:\n                                - claimName\n                                type: object\n                              photonPersistentDisk:\n                                description: photonPersistentDisk represents a PhotonController\n                                  persistent disk attached and mounted on kubelets\n                                  host machine\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  pdID:\n                                    description: pdID is the ID that identifies Photon\n                                      Controller persistent disk\n                                    type: string\n                                required:\n                                - pdID\n                                type: object\n                              portworxVolume:\n                                description: portworxVolume represents a portworx\n                                  volume attached and mounted on kubelets host machine\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fSType represents the filesystem type to mount\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  volumeID:\n                                    description: volumeID uniquely identifies a Portworx\n                                      volume\n                                    type: string\n                                required:\n                                - volumeID\n                                type: object\n                              projected:\n                                description: projected items for all in one resources\n                                  secrets, configmaps, and downward API\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode are the mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  sources:\n                                    description: sources is the list of volume projections\n                                    items:\n                                      description: Projection that may be projected\n                                        along with other supported volume types\n                                      properties:\n                                        clusterTrustBundle:\n                                          description: |-\n                                            ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                            of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                            Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                            ClusterTrustBundle objects can either be selected by name, or by the\n                                            combination of signer name and a label selector.\n\n\n                                            Kubelet performs aggressive normalization of the PEM contents written\n                                            into the pod filesystem.  Esoteric PEM features such as inter-block\n                                            comments and block headers are stripped.  Certificates are deduplicated.\n                                            The ordering of certificates within the file is arbitrary, and Kubelet\n                                            may change the order over time.\n                                          properties:\n                                            labelSelector:\n                                              description: |-\n                                                Select all ClusterTrustBundles that match this label selector.  Only has\n                                                effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                                interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                                everything\".\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            name:\n                                              description: |-\n                                                Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                                with signerName and labelSelector.\n                                              type: string\n                                            optional:\n                                              description: |-\n                                                If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                                aren't available.  If using name, then the named ClusterTrustBundle is\n                                                allowed not to exist.  If using signerName, then the combination of\n                                                signerName and labelSelector is allowed to match zero\n                                                ClusterTrustBundles.\n                                              type: boolean\n                                            path:\n                                              description: Relative path from the\n                                                volume root to write the bundle.\n                                              type: string\n                                            signerName:\n                                              description: |-\n                                                Select all ClusterTrustBundles that match this signer name.\n                                                Mutually-exclusive with name.  The contents of all selected\n                                                ClusterTrustBundles will be unified and deduplicated.\n                                              type: string\n                                          required:\n                                          - path\n                                          type: object\n                                        configMap:\n                                          description: configMap information about\n                                            the configMap data to project\n                                          properties:\n                                            items:\n                                              description: |-\n                                                items if unspecified, each key-value pair in the Data field of the referenced\n                                                ConfigMap will be projected into the volume as a file whose name is the\n                                                key and content is the value. If specified, the listed keys will be\n                                                projected into the specified paths, and unlisted keys will not be\n                                                present. If a key is specified which is not present in the ConfigMap,\n                                                the volume setup will error unless it is marked optional. Paths must be\n                                                relative and may not contain the '..' path or start with '..'.\n                                              items:\n                                                description: Maps a string key to\n                                                  a path within a volume.\n                                                properties:\n                                                  key:\n                                                    description: key is the key to\n                                                      project.\n                                                    type: string\n                                                  mode:\n                                                    description: |-\n                                                      mode is Optional: mode bits used to set permissions on this file.\n                                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                      If not specified, the volume defaultMode will be used.\n                                                      This might be in conflict with other options that affect the file\n                                                      mode, like fsGroup, and the result can be other mode bits set.\n                                                    format: int32\n                                                    type: integer\n                                                  path:\n                                                    description: |-\n                                                      path is the relative path of the file to map the key to.\n                                                      May not be an absolute path.\n                                                      May not contain the path element '..'.\n                                                      May not start with the string '..'.\n                                                    type: string\n                                                required:\n                                                - key\n                                                - path\n                                                type: object\n                                              type: array\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: optional specify whether\n                                                the ConfigMap or its keys must be\n                                                defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        downwardAPI:\n                                          description: downwardAPI information about\n                                            the downwardAPI data to project\n                                          properties:\n                                            items:\n                                              description: Items is a list of DownwardAPIVolume\n                                                file\n                                              items:\n                                                description: DownwardAPIVolumeFile\n                                                  represents information to create\n                                                  the file containing the pod field\n                                                properties:\n                                                  fieldRef:\n                                                    description: 'Required: Selects\n                                                      a field of the pod: only annotations,\n                                                      labels, name and namespace are\n                                                      supported.'\n                                                    properties:\n                                                      apiVersion:\n                                                        description: Version of the\n                                                          schema the FieldPath is\n                                                          written in terms of, defaults\n                                                          to \"v1\".\n                                                        type: string\n                                                      fieldPath:\n                                                        description: Path of the field\n                                                          to select in the specified\n                                                          API version.\n                                                        type: string\n                                                    required:\n                                                    - fieldPath\n                                                    type: object\n                                                    x-kubernetes-map-type: atomic\n                                                  mode:\n                                                    description: |-\n                                                      Optional: mode bits used to set permissions on this file, must be an octal value\n                                                      between 0000 and 0777 or a decimal value between 0 and 511.\n                                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                      If not specified, the volume defaultMode will be used.\n                                                      This might be in conflict with other options that affect the file\n                                                      mode, like fsGroup, and the result can be other mode bits set.\n                                                    format: int32\n                                                    type: integer\n                                                  path:\n                                                    description: 'Required: Path is  the\n                                                      relative path name of the file\n                                                      to be created. Must not be absolute\n                                                      or contain the ''..'' path.\n                                                      Must be utf-8 encoded. The first\n                                                      item of the relative path must\n                                                      not start with ''..'''\n                                                    type: string\n                                                  resourceFieldRef:\n                                                    description: |-\n                                                      Selects a resource of the container: only resources limits and requests\n                                                      (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                    properties:\n                                                      containerName:\n                                                        description: 'Container name:\n                                                          required for volumes, optional\n                                                          for env vars'\n                                                        type: string\n                                                      divisor:\n                                                        anyOf:\n                                                        - type: integer\n                                                        - type: string\n                                                        description: Specifies the\n                                                          output format of the exposed\n                                                          resources, defaults to \"1\"\n                                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                        x-kubernetes-int-or-string: true\n                                                      resource:\n                                                        description: 'Required: resource\n                                                          to select'\n                                                        type: string\n                                                    required:\n                                                    - resource\n                                                    type: object\n                                                    x-kubernetes-map-type: atomic\n                                                required:\n                                                - path\n                                                type: object\n                                              type: array\n                                          type: object\n                                        secret:\n                                          description: secret information about the\n                                            secret data to project\n                                          properties:\n                                            items:\n                                              description: |-\n                                                items if unspecified, each key-value pair in the Data field of the referenced\n                                                Secret will be projected into the volume as a file whose name is the\n                                                key and content is the value. If specified, the listed keys will be\n                                                projected into the specified paths, and unlisted keys will not be\n                                                present. If a key is specified which is not present in the Secret,\n                                                the volume setup will error unless it is marked optional. Paths must be\n                                                relative and may not contain the '..' path or start with '..'.\n                                              items:\n                                                description: Maps a string key to\n                                                  a path within a volume.\n                                                properties:\n                                                  key:\n                                                    description: key is the key to\n                                                      project.\n                                                    type: string\n                                                  mode:\n                                                    description: |-\n                                                      mode is Optional: mode bits used to set permissions on this file.\n                                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                      If not specified, the volume defaultMode will be used.\n                                                      This might be in conflict with other options that affect the file\n                                                      mode, like fsGroup, and the result can be other mode bits set.\n                                                    format: int32\n                                                    type: integer\n                                                  path:\n                                                    description: |-\n                                                      path is the relative path of the file to map the key to.\n                                                      May not be an absolute path.\n                                                      May not contain the path element '..'.\n                                                      May not start with the string '..'.\n                                                    type: string\n                                                required:\n                                                - key\n                                                - path\n                                                type: object\n                                              type: array\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: optional field specify\n                                                whether the Secret or its key must\n                                                be defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        serviceAccountToken:\n                                          description: serviceAccountToken is information\n                                            about the serviceAccountToken data to\n                                            project\n                                          properties:\n                                            audience:\n                                              description: |-\n                                                audience is the intended audience of the token. A recipient of a token\n                                                must identify itself with an identifier specified in the audience of the\n                                                token, and otherwise should reject the token. The audience defaults to the\n                                                identifier of the apiserver.\n                                              type: string\n                                            expirationSeconds:\n                                              description: |-\n                                                expirationSeconds is the requested duration of validity of the service\n                                                account token. As the token approaches expiration, the kubelet volume\n                                                plugin will proactively rotate the service account token. The kubelet will\n                                                start trying to rotate the token if the token is older than 80 percent of\n                                                its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                                and must be at least 10 minutes.\n                                              format: int64\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the path relative to the mount point of the file to project the\n                                                token into.\n                                              type: string\n                                          required:\n                                          - path\n                                          type: object\n                                      type: object\n                                    type: array\n                                type: object\n                              quobyte:\n                                description: quobyte represents a Quobyte mount on\n                                  the host that shares a pod's lifetime\n                                properties:\n                                  group:\n                                    description: |-\n                                      group to map volume access to\n                                      Default is no group\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                      Defaults to false.\n                                    type: boolean\n                                  registry:\n                                    description: |-\n                                      registry represents a single or multiple Quobyte Registry services\n                                      specified as a string as host:port pair (multiple entries are separated with commas)\n                                      which acts as the central registry for volumes\n                                    type: string\n                                  tenant:\n                                    description: |-\n                                      tenant owning the given Quobyte volume in the Backend\n                                      Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                    type: string\n                                  user:\n                                    description: |-\n                                      user to map volume access to\n                                      Defaults to serivceaccount user\n                                    type: string\n                                  volume:\n                                    description: volume is a string that references\n                                      an already created Quobyte volume by name.\n                                    type: string\n                                required:\n                                - registry\n                                - volume\n                                type: object\n                              rbd:\n                                description: |-\n                                  rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  image:\n                                    description: |-\n                                      image is the rados image name.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                  keyring:\n                                    description: |-\n                                      keyring is the path to key ring for RBDUser.\n                                      Default is /etc/ceph/keyring.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                  monitors:\n                                    description: |-\n                                      monitors is a collection of Ceph monitors.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    items:\n                                      type: string\n                                    type: array\n                                  pool:\n                                    description: |-\n                                      pool is the rados pool name.\n                                      Default is rbd.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the ReadOnly setting in VolumeMounts.\n                                      Defaults to false.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef is name of the authentication secret for RBDUser. If provided\n                                      overrides keyring.\n                                      Default is nil.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  user:\n                                    description: |-\n                                      user is the rados user name.\n                                      Default is admin.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                required:\n                                - image\n                                - monitors\n                                type: object\n                              scaleIO:\n                                description: scaleIO represents a ScaleIO persistent\n                                  volume attached and mounted on Kubernetes nodes.\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                      Default is \"xfs\".\n                                    type: string\n                                  gateway:\n                                    description: gateway is the host address of the\n                                      ScaleIO API Gateway.\n                                    type: string\n                                  protectionDomain:\n                                    description: protectionDomain is the name of the\n                                      ScaleIO Protection Domain for the configured\n                                      storage.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef references to the secret for ScaleIO user and other\n                                      sensitive information. If this is not provided, Login operation will fail.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  sslEnabled:\n                                    description: sslEnabled Flag enable/disable SSL\n                                      communication with Gateway, default false\n                                    type: boolean\n                                  storageMode:\n                                    description: |-\n                                      storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                      Default is ThinProvisioned.\n                                    type: string\n                                  storagePool:\n                                    description: storagePool is the ScaleIO Storage\n                                      Pool associated with the protection domain.\n                                    type: string\n                                  system:\n                                    description: system is the name of the storage\n                                      system as configured in ScaleIO.\n                                    type: string\n                                  volumeName:\n                                    description: |-\n                                      volumeName is the name of a volume already created in the ScaleIO system\n                                      that is associated with this volume source.\n                                    type: string\n                                required:\n                                - gateway\n                                - secretRef\n                                - system\n                                type: object\n                              secret:\n                                description: |-\n                                  secret represents a secret that should populate this volume.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values\n                                      for mode bits. Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items If unspecified, each key-value pair in the Data field of the referenced\n                                      Secret will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the Secret,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  optional:\n                                    description: optional field specify whether the\n                                      Secret or its keys must be defined\n                                    type: boolean\n                                  secretName:\n                                    description: |-\n                                      secretName is the name of the secret in the pod's namespace to use.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                    type: string\n                                type: object\n                              storageos:\n                                description: storageOS represents a StorageOS volume\n                                  attached and mounted on Kubernetes nodes.\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef specifies the secret to use for obtaining the StorageOS API\n                                      credentials.  If not specified, default values will be attempted.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  volumeName:\n                                    description: |-\n                                      volumeName is the human-readable name of the StorageOS volume.  Volume\n                                      names are only unique within a namespace.\n                                    type: string\n                                  volumeNamespace:\n                                    description: |-\n                                      volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                      namespace is specified then the Pod's namespace will be used.  This allows the\n                                      Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                      Set VolumeName to any name to override the default behaviour.\n                                      Set to \"default\" if you are not using namespaces within StorageOS.\n                                      Namespaces that do not pre-exist within StorageOS will be created.\n                                    type: string\n                                type: object\n                              vsphereVolume:\n                                description: vsphereVolume represents a vSphere volume\n                                  attached and mounted on kubelets host machine\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  storagePolicyID:\n                                    description: storagePolicyID is the storage Policy\n                                      Based Management (SPBM) profile ID associated\n                                      with the StoragePolicyName.\n                                    type: string\n                                  storagePolicyName:\n                                    description: storagePolicyName is the storage\n                                      Policy Based Management (SPBM) profile name.\n                                    type: string\n                                  volumePath:\n                                    description: volumePath is the path that identifies\n                                      vSphere volume vmdk\n                                    type: string\n                                required:\n                                - volumePath\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                      required:\n                      - replicas\n                      type: object\n                  required:\n                  - name\n                  - template\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              terminationPolicy:\n                description: |-\n                  Specifies the behavior when a Cluster is deleted.\n                  It defines how resources, data, and backups associated with a Cluster are managed during termination.\n                  Choose a policy based on the desired level of resource cleanup and data preservation:\n\n\n                  - `DoNotTerminate`: Prevents deletion of the Cluster. This policy ensures that all resources remain intact.\n                  - `Delete`: Deletes all runtime resources belong to the Cluster.\n                  - `WipeOut`: An aggressive policy that deletes all Cluster resources, including volume snapshots and\n                    backups in external storage.\n                    This results in complete data removal and should be used cautiously, primarily in non-production environments\n                    to avoid irreversible data loss.\n\n\n                  Warning: Choosing an inappropriate termination policy can result in data loss.\n                  The `WipeOut` policy is particularly risky in production environments due to its irreversible nature.\n                enum:\n                - DoNotTerminate\n                - Delete\n                - WipeOut\n                type: string\n              topology:\n                description: |-\n                  Specifies the name of the ClusterTopology to be used when creating the Cluster.\n\n\n                  This field defines which set of Components, as outlined in the ClusterDefinition, will be used to\n                  construct the Cluster based on the named topology.\n                  The ClusterDefinition may list multiple topologies under `clusterdefinition.spec.topologies[*]`,\n                  each tailored to different use cases or environments.\n\n\n                  If `topology` is not specified, the Cluster will use the default topology defined in the ClusterDefinition.\n\n\n                  Note: Once set during the Cluster creation, the `topology` field cannot be modified.\n                  It establishes the initial composition and structure of the Cluster and is intended for one-time configuration.\n                maxLength: 32\n                type: string\n                x-kubernetes-validations:\n                - message: topology is immutable\n                  rule: self == oldSelf\n            required:\n            - terminationPolicy\n            type: object\n            x-kubernetes-validations:\n            - message: topology is required once set\n              rule: '!has(oldSelf.topology) || has(self.topology)'\n          status:\n            description: ClusterStatus defines the observed state of the Cluster.\n            properties:\n              components:\n                additionalProperties:\n                  description: ClusterComponentStatus records Component status.\n                  properties:\n                    message:\n                      additionalProperties:\n                        type: string\n                      description: Records detailed information about the Component\n                        in its current phase.\n                      type: object\n                    observedGeneration:\n                      description: Indicates the most recent generation of the component\n                        state observed.\n                      format: int64\n                      type: integer\n                    phase:\n                      description: Specifies the current state of the Component.\n                      enum:\n                      - Creating\n                      - Deleting\n                      - Updating\n                      - Stopping\n                      - Starting\n                      - Running\n                      - Stopped\n                      - Failed\n                      type: string\n                    upToDate:\n                      description: Indicates whether the component state observed\n                        is up-to-date with the desired state.\n                      type: boolean\n                  type: object\n                description: Records the current status information of all Components\n                  within the Cluster.\n                type: object\n              conditions:\n                description: |-\n                  Represents a list of detailed status of the Cluster object.\n                  Each condition in the list provides real-time information about certain aspect of the Cluster object.\n\n\n                  This field is crucial for administrators and developers to monitor and respond to changes within the Cluster.\n                  It provides a history of state transitions and a snapshot of the current state that can be used for\n                  automated logic or direct inspection.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: The most recent generation number of the Cluster object\n                  that has been observed by the controller.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  The current phase of the Cluster includes:\n                  `Creating`, `Running`, `Updating`, `Stopping`, `Stopped`, `Deleting`, `Failed`, `Abnormal`.\n                enum:\n                - Creating\n                - Running\n                - Updating\n                - Stopping\n                - Stopped\n                - Deleting\n                - Failed\n                - Abnormal\n                type: string\n              shardings:\n                additionalProperties:\n                  description: ClusterComponentStatus records Component status.\n                  properties:\n                    message:\n                      additionalProperties:\n                        type: string\n                      description: Records detailed information about the Component\n                        in its current phase.\n                      type: object\n                    observedGeneration:\n                      description: Indicates the most recent generation of the component\n                        state observed.\n                      format: int64\n                      type: integer\n                    phase:\n                      description: Specifies the current state of the Component.\n                      enum:\n                      - Creating\n                      - Deleting\n                      - Updating\n                      - Stopping\n                      - Starting\n                      - Running\n                      - Stopped\n                      - Failed\n                      type: string\n                    upToDate:\n                      description: Indicates whether the component state observed\n                        is up-to-date with the desired state.\n                      type: boolean\n                  type: object\n                description: Records the current status information of all shardings\n                  within the Cluster.\n                type: object\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n  - additionalPrinterColumns:\n    - description: ClusterDefinition referenced by cluster.\n      jsonPath: .spec.clusterDefinitionRef\n      name: CLUSTER-DEFINITION\n      type: string\n    - description: Cluster Application Version.\n      jsonPath: .spec.clusterVersionRef\n      name: VERSION\n      type: string\n    - description: Cluster termination policy.\n      jsonPath: .spec.terminationPolicy\n      name: TERMINATION-POLICY\n      type: string\n    - description: Cluster Status.\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          Cluster offers a unified management interface for a wide variety of database and storage systems:\n\n\n          - Relational databases: MySQL, PostgreSQL, MariaDB\n          - NoSQL databases: Redis, MongoDB\n          - KV stores: ZooKeeper, etcd\n          - Analytics systems: ElasticSearch, OpenSearch, ClickHouse, Doris, StarRocks, Solr\n          - Message queues: Kafka, Pulsar\n          - Distributed SQL: TiDB, OceanBase\n          - Vector databases: Qdrant, Milvus, Weaviate\n          - Object storage: Minio\n\n\n          KubeBlocks utilizes an abstraction layer to encapsulate the characteristics of these diverse systems.\n          A Cluster is composed of multiple Components, each defined by vendors or KubeBlocks Addon developers via ComponentDefinition,\n          arranged in Directed Acyclic Graph (DAG) topologies.\n          The topologies, defined in a ClusterDefinition, coordinate reconciliation across Cluster's lifecycle phases:\n          Creating, Running, Updating, Stopping, Stopped, Deleting.\n          Lifecycle management ensures that each Component operates in harmony, executing appropriate actions at each lifecycle stage.\n\n\n          For sharded-nothing architecture, the Cluster supports managing multiple shards,\n          each shard managed by a separate Component, supporting dynamic resharding.\n\n\n          The Cluster object is aimed to maintain the overall integrity and availability of a database cluster,\n          serves as the central control point, abstracting the complexity of multiple-component management,\n          and providing a unified interface for cluster-wide operations.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ClusterSpec defines the desired state of Cluster.\n            properties:\n              affinity:\n                description: |-\n                  Defines a set of node affinity scheduling rules for the Cluster's Pods.\n                  This field helps control the placement of Pods on nodes within the Cluster.\n\n\n                  Deprecated since v0.10. Use the `schedulingPolicy` field instead.\n                properties:\n                  nodeLabels:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      Indicates the node labels that must be present on nodes for pods to be scheduled on them.\n                      It is a map where the keys are the label keys and the values are the corresponding label values.\n                      Pods will only be scheduled on nodes that have all the specified labels with the corresponding values.\n\n\n                      For example, if NodeLabels is set to {\"nodeType\": \"ssd\", \"environment\": \"production\"},\n                      pods will only be scheduled on nodes that have both the \"nodeType\" label with value \"ssd\"\n                      and the \"environment\" label with value \"production\".\n\n\n                      This field allows users to control Pod placement based on specific node labels.\n                      It can be used to ensure that Pods are scheduled on nodes with certain characteristics,\n                      such as specific hardware (e.g., SSD), environment (e.g., production, staging),\n                      or any other custom labels assigned to nodes.\n                    type: object\n                  podAntiAffinity:\n                    default: Preferred\n                    description: |-\n                      Specifies the anti-affinity level of Pods within a Component.\n                      It determines how pods should be spread across nodes to improve availability and performance.\n                      It can have the following values: `Preferred` and `Required`.\n                      The default value is `Preferred`.\n                    enum:\n                    - Preferred\n                    - Required\n                    type: string\n                  tenancy:\n                    default: SharedNode\n                    description: |-\n                      Determines the level of resource isolation between Pods.\n                      It can have the following values: `SharedNode` and `DedicatedNode`.\n\n\n                      - SharedNode: Allow that multiple Pods may share the same node, which is the default behavior of K8s.\n                      - DedicatedNode: Each Pod runs on a dedicated node, ensuring that no two Pods share the same node.\n                        In other words, if a Pod is already running on a node, no other Pods will be scheduled on that node.\n                        Which provides a higher level of isolation and resource guarantee for Pods.\n\n\n                       The default value is `SharedNode`.\n                    enum:\n                    - SharedNode\n                    - DedicatedNode\n                    type: string\n                  topologyKeys:\n                    description: |-\n                      Represents the key of node labels used to define the topology domain for Pod anti-affinity\n                      and Pod spread constraints.\n\n\n                      In K8s, a topology domain is a set of nodes that have the same value for a specific label key.\n                      Nodes with labels containing any of the specified TopologyKeys and identical values are considered\n                      to be in the same topology domain.\n\n\n                      Note: The concept of topology in the context of K8s TopologyKeys is different from the concept of\n                      topology in the ClusterDefinition.\n\n\n                      When a Pod has anti-affinity or spread constraints specified, Kubernetes will attempt to schedule the\n                      Pod on nodes with different values for the specified TopologyKeys.\n                      This ensures that Pods are spread across different topology domains, promoting high availability and\n                      reducing the impact of node failures.\n\n\n                      Some well-known label keys, such as `kubernetes.io/hostname` and `topology.kubernetes.io/zone`,\n                      are often used as TopologyKey.\n                      These keys represent the hostname and zone of a node, respectively.\n                      By including these keys in the TopologyKeys list, Pods will be spread across nodes with\n                      different hostnames or zones.\n\n\n                      In addition to the well-known keys, users can also specify custom label keys as TopologyKeys.\n                      This allows for more flexible and custom topology definitions based on the specific needs\n                      of the application or environment.\n\n\n                      The TopologyKeys field is a slice of strings, where each string represents a label key.\n                      The order of the keys in the slice does not matter.\n                    items:\n                      type: string\n                    type: array\n                    x-kubernetes-list-type: set\n                type: object\n              availabilityPolicy:\n                description: |-\n                  Describes the availability policy, including zone, node, and none.\n\n\n                  Deprecated since v0.9.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                enum:\n                - zone\n                - node\n                - none\n                type: string\n              backup:\n                description: Specifies the backup configuration of the Cluster.\n                properties:\n                  continuousMethod:\n                    description: Specifies the backup method to use, if not set, use\n                      the first continuous method.\n                    type: string\n                  cronExpression:\n                    description: The cron expression for the schedule. The timezone\n                      is in UTC. See https://en.wikipedia.org/wiki/Cron.\n                    type: string\n                  enabled:\n                    default: false\n                    description: Specifies whether automated backup is enabled for\n                      the Cluster.\n                    type: boolean\n                  incrementalBackupEnabled:\n                    default: false\n                    description: Specifies whether to enable incremental backup.\n                    type: boolean\n                  incrementalCronExpression:\n                    description: The cron expression for the incremental backup schedule.\n                      The timezone is in UTC. See https://en.wikipedia.org/wiki/Cron.\n                    type: string\n                  method:\n                    description: Specifies the backup method to use, as defined in\n                      backupPolicy.\n                    type: string\n                  pitrEnabled:\n                    default: false\n                    description: Specifies whether to enable point-in-time recovery.\n                    type: boolean\n                  repoName:\n                    description: Specifies the name of the backupRepo. If not set,\n                      the default backupRepo will be used.\n                    type: string\n                  retentionPeriod:\n                    default: 7d\n                    description: \"Determines the duration to retain backups. Backups\n                      older than this period are automatically removed.\\n\\n\\nFor example,\n                      RetentionPeriod of `30d` will keep only the backups of last\n                      30 days.\\nSample duration format:\\n\\n\\n- years: \\t2y\\n- months:\n                      \\t6mo\\n- days: \\t\\t30d\\n- hours: \\t12h\\n- minutes: \\t30m\\n\\n\\nYou\n                      can also combine the above durations. For example: 30d12h30m.\\nDefault\n                      value is 7d.\"\n                    type: string\n                  startingDeadlineMinutes:\n                    description: |-\n                      Specifies the maximum time in minutes that the system will wait to start a missed backup job.\n                      If the scheduled backup time is missed for any reason, the backup job must start within this deadline.\n                      Values must be between 0 (immediate execution) and 1440 (one day).\n                    format: int64\n                    maximum: 1440\n                    minimum: 0\n                    type: integer\n                required:\n                - method\n                type: object\n              clusterDefinitionRef:\n                description: |-\n                  Specifies the name of the ClusterDefinition to use when creating a Cluster.\n\n\n                  This field enables users to create a Cluster based on a specific ClusterDefinition.\n                  Which, in conjunction with the `topology` field, determine:\n\n\n                  - The Components to be included in the Cluster.\n                  - The sequences in which the Components are created, updated, and terminate.\n\n\n                  This facilitates multiple-components management with predefined ClusterDefinition.\n\n\n                  Users with advanced requirements can bypass this general setting and specify more precise control over\n                  the composition of the Cluster by directly referencing specific ComponentDefinitions for each component\n                  within `componentSpecs[*].componentDef`.\n\n\n                  If this field is not provided, each component must be explicitly defined in `componentSpecs[*].componentDef`.\n\n\n                  Note: Once set, this field cannot be modified; it is immutable.\n                maxLength: 63\n                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                type: string\n                x-kubernetes-validations:\n                - message: clusterDefinitionRef is immutable\n                  rule: self == oldSelf\n              clusterVersionRef:\n                description: |-\n                  Refers to the ClusterVersion name.\n\n\n                  Deprecated since v0.9, use ComponentVersion instead.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                maxLength: 63\n                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                type: string\n              componentSpecs:\n                description: |-\n                  Specifies a list of ClusterComponentSpec objects used to define the individual Components that make up a Cluster.\n                  This field allows for detailed configuration of each Component within the Cluster.\n\n\n                  Note: `shardingSpecs` and `componentSpecs` cannot both be empty; at least one must be defined to configure a Cluster.\n                items:\n                  description: |-\n                    ClusterComponentSpec defines the specification of a Component within a Cluster.\n                    TODO +kubebuilder:validation:XValidation:rule=\"!has(oldSelf.componentDefRef) || has(self.componentDefRef)\", message=\"componentDefRef is required once set\"\n                    TODO +kubebuilder:validation:XValidation:rule=\"!has(oldSelf.componentDef) || has(self.componentDef)\", message=\"componentDef is required once set\"\n                  properties:\n                    affinity:\n                      description: |-\n                        Specifies a group of affinity scheduling rules for the Component.\n                        It allows users to control how the Component's Pods are scheduled onto nodes in the K8s cluster.\n\n\n                        Deprecated since v0.10, replaced by the `schedulingPolicy` field.\n                      properties:\n                        nodeLabels:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            Indicates the node labels that must be present on nodes for pods to be scheduled on them.\n                            It is a map where the keys are the label keys and the values are the corresponding label values.\n                            Pods will only be scheduled on nodes that have all the specified labels with the corresponding values.\n\n\n                            For example, if NodeLabels is set to {\"nodeType\": \"ssd\", \"environment\": \"production\"},\n                            pods will only be scheduled on nodes that have both the \"nodeType\" label with value \"ssd\"\n                            and the \"environment\" label with value \"production\".\n\n\n                            This field allows users to control Pod placement based on specific node labels.\n                            It can be used to ensure that Pods are scheduled on nodes with certain characteristics,\n                            such as specific hardware (e.g., SSD), environment (e.g., production, staging),\n                            or any other custom labels assigned to nodes.\n                          type: object\n                        podAntiAffinity:\n                          default: Preferred\n                          description: |-\n                            Specifies the anti-affinity level of Pods within a Component.\n                            It determines how pods should be spread across nodes to improve availability and performance.\n                            It can have the following values: `Preferred` and `Required`.\n                            The default value is `Preferred`.\n                          enum:\n                          - Preferred\n                          - Required\n                          type: string\n                        tenancy:\n                          default: SharedNode\n                          description: |-\n                            Determines the level of resource isolation between Pods.\n                            It can have the following values: `SharedNode` and `DedicatedNode`.\n\n\n                            - SharedNode: Allow that multiple Pods may share the same node, which is the default behavior of K8s.\n                            - DedicatedNode: Each Pod runs on a dedicated node, ensuring that no two Pods share the same node.\n                              In other words, if a Pod is already running on a node, no other Pods will be scheduled on that node.\n                              Which provides a higher level of isolation and resource guarantee for Pods.\n\n\n                             The default value is `SharedNode`.\n                          enum:\n                          - SharedNode\n                          - DedicatedNode\n                          type: string\n                        topologyKeys:\n                          description: |-\n                            Represents the key of node labels used to define the topology domain for Pod anti-affinity\n                            and Pod spread constraints.\n\n\n                            In K8s, a topology domain is a set of nodes that have the same value for a specific label key.\n                            Nodes with labels containing any of the specified TopologyKeys and identical values are considered\n                            to be in the same topology domain.\n\n\n                            Note: The concept of topology in the context of K8s TopologyKeys is different from the concept of\n                            topology in the ClusterDefinition.\n\n\n                            When a Pod has anti-affinity or spread constraints specified, Kubernetes will attempt to schedule the\n                            Pod on nodes with different values for the specified TopologyKeys.\n                            This ensures that Pods are spread across different topology domains, promoting high availability and\n                            reducing the impact of node failures.\n\n\n                            Some well-known label keys, such as `kubernetes.io/hostname` and `topology.kubernetes.io/zone`,\n                            are often used as TopologyKey.\n                            These keys represent the hostname and zone of a node, respectively.\n                            By including these keys in the TopologyKeys list, Pods will be spread across nodes with\n                            different hostnames or zones.\n\n\n                            In addition to the well-known keys, users can also specify custom label keys as TopologyKeys.\n                            This allows for more flexible and custom topology definitions based on the specific needs\n                            of the application or environment.\n\n\n                            The TopologyKeys field is a slice of strings, where each string represents a label key.\n                            The order of the keys in the slice does not matter.\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: set\n                      type: object\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: Specifies Annotations to override or add for underlying\n                        Pods, PVCs, Account & TLS Secrets, Services Owned by Component.\n                      type: object\n                    classDefRef:\n                      description: |-\n                        References the class defined in ComponentClassDefinition.\n\n\n                        Deprecated since v0.9.\n                        This field is maintained for backward compatibility and its use is discouraged.\n                        Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                      properties:\n                        class:\n                          description: Defines the name of the class that is defined\n                            in the ComponentClassDefinition.\n                          type: string\n                        name:\n                          description: Specifies the name of the ComponentClassDefinition.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                      required:\n                      - class\n                      type: object\n                    componentDef:\n                      description: |-\n                        Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                        custom resource (CR) that defines the Component's characteristics and behavior.\n\n\n                        If both `componentDefRef` and `componentDef` are provided,\n                        the `componentDef` will take precedence over `componentDefRef`.\n                      maxLength: 64\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    componentDefRef:\n                      description: |-\n                        References a ClusterComponentDefinition defined in the `clusterDefinition.spec.componentDef` field.\n                        Must comply with the IANA service naming rule.\n\n\n                        Deprecated since v0.9,\n                        because defining Components in `clusterDefinition.spec.componentDef` field has been deprecated.\n                        This field is replaced by the `componentDef` field, use `componentDef` instead.\n                        This field is maintained for backward compatibility and its use is discouraged.\n                        Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n\n\n                        TODO +kubebuilder:validation:XValidation:rule=\"self == oldSelf\",message=\"componentDefRef is immutable\"\n                      maxLength: 22\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    configs:\n                      description: Specifies the configuration content of a config\n                        template.\n                      items:\n                        description: ClusterComponentConfig represents a config with\n                          its source bound.\n                        properties:\n                          configMap:\n                            description: ConfigMap source for the config.\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items if unspecified, each key-value pair in the Data field of the referenced\n                                  ConfigMap will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the ConfigMap,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: optional specify whether the ConfigMap\n                                  or its keys must be defined\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          name:\n                            description: The name of the config.\n                            type: string\n                        type: object\n                      type: array\n                    disableExporter:\n                      description: |-\n                        Determines whether metrics exporter information is annotated on the Component's headless Service.\n\n\n                        If set to true, the following annotations will not be patched into the Service:\n\n\n                        - \"monitor.kubeblocks.io/path\"\n                        - \"monitor.kubeblocks.io/port\"\n                        - \"monitor.kubeblocks.io/scheme\"\n\n\n                        These annotations allow the Prometheus installed by KubeBlocks to discover and scrape metrics from the exporter.\n                      type: boolean\n                    enabledLogs:\n                      description: |-\n                        Specifies which types of logs should be collected for the Component.\n                        The log types are defined in the `componentDefinition.spec.logConfigs` field with the LogConfig entries.\n\n\n                        The elements in the `enabledLogs` array correspond to the names of the LogConfig entries.\n                        For example, if the `componentDefinition.spec.logConfigs` defines LogConfig entries with\n                        names \"slow_query_log\" and \"error_log\",\n                        you can enable the collection of these logs by including their names in the `enabledLogs` array:\n                        ```yaml\n                        enabledLogs:\n                        - slow_query_log\n                        - error_log\n                        ```\n                      items:\n                        type: string\n                      type: array\n                      x-kubernetes-list-type: set\n                    env:\n                      description: |-\n                        List of environment variables to add.\n                        These environment variables will be placed after the environment variables declared in the Pod.\n                      items:\n                        description: EnvVar represents an environment variable present\n                          in a Container.\n                        properties:\n                          name:\n                            description: Name of the environment variable. Must be\n                              a C_IDENTIFIER.\n                            type: string\n                          value:\n                            description: |-\n                              Variable references $(VAR_NAME) are expanded\n                              using the previously defined environment variables in the container and\n                              any service environment variables. If a variable cannot be resolved,\n                              the reference in the input string will be unchanged. Double $$ are reduced\n                              to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                              \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                              Escaped references will never be expanded, regardless of whether the variable\n                              exists or not.\n                              Defaults to \"\".\n                            type: string\n                          valueFrom:\n                            description: Source for the environment variable's value.\n                              Cannot be used if value is not empty.\n                            properties:\n                              configMapKeyRef:\n                                description: Selects a key of a ConfigMap.\n                                properties:\n                                  key:\n                                    description: The key to select.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap or\n                                      its key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              fieldRef:\n                                description: |-\n                                  Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                  spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              secretKeyRef:\n                                description: Selects a key of a secret in the pod's\n                                  namespace\n                                properties:\n                                  key:\n                                    description: The key of the secret to select from.  Must\n                                      be a valid secret key.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret or its\n                                      key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    instanceUpdateStrategy:\n                      description: |-\n                        Indicates the InstanceUpdateStrategy that will be\n                        employed to update Pods in the InstanceSet when a revision is made to\n                        Template.\n                      properties:\n                        maxUnavailable:\n                          anyOf:\n                          - type: integer\n                          - type: string\n                          description: |-\n                            The maximum number of pods that can be unavailable during the update.\n                            Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).\n                            Absolute number is calculated from percentage by rounding up. This can not be 0.\n                            Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,\n                            it will be counted towards MaxUnavailable.\n                          x-kubernetes-int-or-string: true\n                        partition:\n                          description: |-\n                            Partition indicates the number of pods that should be updated during a rolling update.\n                            The remaining pods will remain untouched. This is helpful in defining how many pods\n                            should participate in the update process. The update process will follow the order\n                            of pod names in descending lexicographical (dictionary) order. The default value is\n                            ComponentSpec.Replicas (i.e., update all pods).\n                          format: int32\n                          type: integer\n                      type: object\n                    instances:\n                      description: |-\n                        Allows for the customization of configuration values for each instance within a Component.\n                        An instance represent a single replica (Pod and associated K8s resources like PVCs, Services, and ConfigMaps).\n                        While instances typically share a common configuration as defined in the ClusterComponentSpec,\n                        they can require unique settings in various scenarios:\n\n\n                        For example:\n                        - A database Component might require different resource allocations for primary and secondary instances,\n                          with primaries needing more resources.\n                        - During a rolling upgrade, a Component may first update the image for one or a few instances,\n                          and then update the remaining instances after verifying that the updated instances are functioning correctly.\n\n\n                        InstanceTemplate allows for specifying these unique configurations per instance.\n                        Each instance's name is constructed using the pattern: $(component.name)-$(template.name)-$(ordinal),\n                        starting with an ordinal of 0.\n                        It is crucial to maintain unique names for each InstanceTemplate to avoid conflicts.\n\n\n                        The sum of replicas across all InstanceTemplates should not exceed the total number of replicas specified for the Component.\n                        Any remaining replicas will be generated using the default template and will follow the default naming rules.\n                      items:\n                        description: InstanceTemplate allows customization of individual\n                          replica configurations in a Component.\n                        properties:\n                          annotations:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                              Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                            type: object\n                          env:\n                            description: |-\n                              Defines Env to override.\n                              Add new or override existing envs.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: Specifies an override for the first container's\n                              image in the Pod.\n                            type: string\n                          labels:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                              Values for existing keys will be overwritten, and new keys will be added.\n                            type: object\n                          name:\n                            description: |-\n                              Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                              This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal\n                              using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                              The specified name overrides any default naming conventions or patterns.\n                            maxLength: 54\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          replicas:\n                            default: 1\n                            description: |-\n                              Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                              This field allows setting how many replicated instances of the Component,\n                              with the specific overrides in the InstanceTemplate, are created.\n                              The default value is 1. A value of 0 disables instance creation.\n                            format: int32\n                            minimum: 0\n                            type: integer\n                          resources:\n                            description: |-\n                              Specifies an override for the resource requirements of the first container in the Pod.\n                              This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                            properties:\n                              claims:\n                                description: |-\n                                  Claims lists the names of resources, defined in spec.resourceClaims,\n                                  that are used by this container.\n\n\n                                  This is an alpha field and requires enabling the\n                                  DynamicResourceAllocation feature gate.\n\n\n                                  This field is immutable. It can only be set for containers.\n                                items:\n                                  description: ResourceClaim references one entry\n                                    in PodSpec.ResourceClaims.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name must match the name of one entry in pod.spec.resourceClaims of\n                                        the Pod where this field is used. It makes that resource available\n                                        inside a container.\n                                      type: string\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                                x-kubernetes-list-map-keys:\n                                - name\n                                x-kubernetes-list-type: map\n                              limits:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: |-\n                                  Limits describes the maximum amount of compute resources allowed.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                type: object\n                              requests:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: |-\n                                  Requests describes the minimum amount of compute resources required.\n                                  If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                  otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                type: object\n                            type: object\n                          schedulingPolicy:\n                            description: Specifies the scheduling policy for the Component.\n                            properties:\n                              affinity:\n                                description: Specifies a group of affinity scheduling\n                                  rules of the Cluster, including NodeAffinity, PodAffinity,\n                                  and PodAntiAffinity.\n                                properties:\n                                  nodeAffinity:\n                                    description: Describes node affinity scheduling\n                                      rules for the pod.\n                                    properties:\n                                      preferredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          The scheduler will prefer to schedule pods to nodes that satisfy\n                                          the affinity expressions specified by this field, but it may choose\n                                          a node that violates one or more of the expressions. The node that is\n                                          most preferred is the one with the greatest sum of weights, i.e.\n                                          for each node that meets all of the scheduling requirements (resource\n                                          request, requiredDuringScheduling affinity expressions, etc.),\n                                          compute a sum by iterating through the elements of this field and adding\n                                          \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                          node(s) with the highest sum are the most preferred.\n                                        items:\n                                          description: |-\n                                            An empty preferred scheduling term matches all objects with implicit weight 0\n                                            (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                          properties:\n                                            preference:\n                                              description: A node selector term, associated\n                                                with the corresponding weight.\n                                              properties:\n                                                matchExpressions:\n                                                  description: A list of node selector\n                                                    requirements by node's labels.\n                                                  items:\n                                                    description: |-\n                                                      A node selector requirement is a selector that contains values, a key, and an operator\n                                                      that relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: The label key\n                                                          that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          Represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          An array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. If the operator is Gt or Lt, the values\n                                                          array must have a single element, which will be interpreted as an integer.\n                                                          This array is replaced during a strategic merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchFields:\n                                                  description: A list of node selector\n                                                    requirements by node's fields.\n                                                  items:\n                                                    description: |-\n                                                      A node selector requirement is a selector that contains values, a key, and an operator\n                                                      that relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: The label key\n                                                          that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          Represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          An array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. If the operator is Gt or Lt, the values\n                                                          array must have a single element, which will be interpreted as an integer.\n                                                          This array is replaced during a strategic merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            weight:\n                                              description: Weight associated with\n                                                matching the corresponding nodeSelectorTerm,\n                                                in the range 1-100.\n                                              format: int32\n                                              type: integer\n                                          required:\n                                          - preference\n                                          - weight\n                                          type: object\n                                        type: array\n                                      requiredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          If the affinity requirements specified by this field are not met at\n                                          scheduling time, the pod will not be scheduled onto the node.\n                                          If the affinity requirements specified by this field cease to be met\n                                          at some point during pod execution (e.g. due to an update), the system\n                                          may or may not try to eventually evict the pod from its node.\n                                        properties:\n                                          nodeSelectorTerms:\n                                            description: Required. A list of node\n                                              selector terms. The terms are ORed.\n                                            items:\n                                              description: |-\n                                                A null or empty node selector term matches no objects. The requirements of\n                                                them are ANDed.\n                                                The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                              properties:\n                                                matchExpressions:\n                                                  description: A list of node selector\n                                                    requirements by node's labels.\n                                                  items:\n                                                    description: |-\n                                                      A node selector requirement is a selector that contains values, a key, and an operator\n                                                      that relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: The label key\n                                                          that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          Represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          An array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. If the operator is Gt or Lt, the values\n                                                          array must have a single element, which will be interpreted as an integer.\n                                                          This array is replaced during a strategic merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchFields:\n                                                  description: A list of node selector\n                                                    requirements by node's fields.\n                                                  items:\n                                                    description: |-\n                                                      A node selector requirement is a selector that contains values, a key, and an operator\n                                                      that relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: The label key\n                                                          that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          Represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          An array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. If the operator is Gt or Lt, the values\n                                                          array must have a single element, which will be interpreted as an integer.\n                                                          This array is replaced during a strategic merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            type: array\n                                        required:\n                                        - nodeSelectorTerms\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                  podAffinity:\n                                    description: Describes pod affinity scheduling\n                                      rules (e.g. co-locate this pod in the same node,\n                                      zone, etc. as some other pod(s)).\n                                    properties:\n                                      preferredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          The scheduler will prefer to schedule pods to nodes that satisfy\n                                          the affinity expressions specified by this field, but it may choose\n                                          a node that violates one or more of the expressions. The node that is\n                                          most preferred is the one with the greatest sum of weights, i.e.\n                                          for each node that meets all of the scheduling requirements (resource\n                                          request, requiredDuringScheduling affinity expressions, etc.),\n                                          compute a sum by iterating through the elements of this field and adding\n                                          \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                          node(s) with the highest sum are the most preferred.\n                                        items:\n                                          description: The weights of all of the matched\n                                            WeightedPodAffinityTerm fields are added\n                                            per-node to find the most preferred node(s)\n                                          properties:\n                                            podAffinityTerm:\n                                              description: Required. A pod affinity\n                                                term, associated with the corresponding\n                                                weight.\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            weight:\n                                              description: |-\n                                                weight associated with matching the corresponding podAffinityTerm,\n                                                in the range 1-100.\n                                              format: int32\n                                              type: integer\n                                          required:\n                                          - podAffinityTerm\n                                          - weight\n                                          type: object\n                                        type: array\n                                      requiredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          If the affinity requirements specified by this field are not met at\n                                          scheduling time, the pod will not be scheduled onto the node.\n                                          If the affinity requirements specified by this field cease to be met\n                                          at some point during pod execution (e.g. due to a pod label update), the\n                                          system may or may not try to eventually evict the pod from its node.\n                                          When there are multiple elements, the lists of nodes corresponding to each\n                                          podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                        items:\n                                          description: |-\n                                            Defines a set of pods (namely those matching the labelSelector\n                                            relative to the given namespace(s)) that this pod should be\n                                            co-located (affinity) or not co-located (anti-affinity) with,\n                                            where co-located is defined as running on a node whose value of\n                                            the label with key <topologyKey> matches that of any node on which\n                                            a pod of the set of pods is running\n                                          properties:\n                                            labelSelector:\n                                              description: |-\n                                                A label query over a set of resources, in this case pods.\n                                                If it's null, this PodAffinityTerm matches with no Pods.\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            matchLabelKeys:\n                                              description: |-\n                                                MatchLabelKeys is a set of pod label keys to select which pods will\n                                                be taken into consideration. The keys are used to lookup values from the\n                                                incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                to select the group of existing pods which pods will be taken into consideration\n                                                for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                pod labels will be ignored. The default value is empty.\n                                                The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                              items:\n                                                type: string\n                                              type: array\n                                              x-kubernetes-list-type: atomic\n                                            mismatchLabelKeys:\n                                              description: |-\n                                                MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                be taken into consideration. The keys are used to lookup values from the\n                                                incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                to select the group of existing pods which pods will be taken into consideration\n                                                for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                pod labels will be ignored. The default value is empty.\n                                                The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                              items:\n                                                type: string\n                                              type: array\n                                              x-kubernetes-list-type: atomic\n                                            namespaceSelector:\n                                              description: |-\n                                                A label query over the set of namespaces that the term applies to.\n                                                The term is applied to the union of the namespaces selected by this field\n                                                and the ones listed in the namespaces field.\n                                                null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                An empty selector ({}) matches all namespaces.\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            namespaces:\n                                              description: |-\n                                                namespaces specifies a static list of namespace names that the term applies to.\n                                                The term is applied to the union of the namespaces listed in this field\n                                                and the ones selected by namespaceSelector.\n                                                null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                              items:\n                                                type: string\n                                              type: array\n                                            topologyKey:\n                                              description: |-\n                                                This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                whose value of the label with key topologyKey matches that of any node on which any of the\n                                                selected pods is running.\n                                                Empty topologyKey is not allowed.\n                                              type: string\n                                          required:\n                                          - topologyKey\n                                          type: object\n                                        type: array\n                                    type: object\n                                  podAntiAffinity:\n                                    description: Describes pod anti-affinity scheduling\n                                      rules (e.g. avoid putting this pod in the same\n                                      node, zone, etc. as some other pod(s)).\n                                    properties:\n                                      preferredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          The scheduler will prefer to schedule pods to nodes that satisfy\n                                          the anti-affinity expressions specified by this field, but it may choose\n                                          a node that violates one or more of the expressions. The node that is\n                                          most preferred is the one with the greatest sum of weights, i.e.\n                                          for each node that meets all of the scheduling requirements (resource\n                                          request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                          compute a sum by iterating through the elements of this field and adding\n                                          \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                          node(s) with the highest sum are the most preferred.\n                                        items:\n                                          description: The weights of all of the matched\n                                            WeightedPodAffinityTerm fields are added\n                                            per-node to find the most preferred node(s)\n                                          properties:\n                                            podAffinityTerm:\n                                              description: Required. A pod affinity\n                                                term, associated with the corresponding\n                                                weight.\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            weight:\n                                              description: |-\n                                                weight associated with matching the corresponding podAffinityTerm,\n                                                in the range 1-100.\n                                              format: int32\n                                              type: integer\n                                          required:\n                                          - podAffinityTerm\n                                          - weight\n                                          type: object\n                                        type: array\n                                      requiredDuringSchedulingIgnoredDuringExecution:\n                                        description: |-\n                                          If the anti-affinity requirements specified by this field are not met at\n                                          scheduling time, the pod will not be scheduled onto the node.\n                                          If the anti-affinity requirements specified by this field cease to be met\n                                          at some point during pod execution (e.g. due to a pod label update), the\n                                          system may or may not try to eventually evict the pod from its node.\n                                          When there are multiple elements, the lists of nodes corresponding to each\n                                          podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                        items:\n                                          description: |-\n                                            Defines a set of pods (namely those matching the labelSelector\n                                            relative to the given namespace(s)) that this pod should be\n                                            co-located (affinity) or not co-located (anti-affinity) with,\n                                            where co-located is defined as running on a node whose value of\n                                            the label with key <topologyKey> matches that of any node on which\n                                            a pod of the set of pods is running\n                                          properties:\n                                            labelSelector:\n                                              description: |-\n                                                A label query over a set of resources, in this case pods.\n                                                If it's null, this PodAffinityTerm matches with no Pods.\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            matchLabelKeys:\n                                              description: |-\n                                                MatchLabelKeys is a set of pod label keys to select which pods will\n                                                be taken into consideration. The keys are used to lookup values from the\n                                                incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                to select the group of existing pods which pods will be taken into consideration\n                                                for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                pod labels will be ignored. The default value is empty.\n                                                The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                              items:\n                                                type: string\n                                              type: array\n                                              x-kubernetes-list-type: atomic\n                                            mismatchLabelKeys:\n                                              description: |-\n                                                MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                be taken into consideration. The keys are used to lookup values from the\n                                                incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                to select the group of existing pods which pods will be taken into consideration\n                                                for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                pod labels will be ignored. The default value is empty.\n                                                The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                              items:\n                                                type: string\n                                              type: array\n                                              x-kubernetes-list-type: atomic\n                                            namespaceSelector:\n                                              description: |-\n                                                A label query over the set of namespaces that the term applies to.\n                                                The term is applied to the union of the namespaces selected by this field\n                                                and the ones listed in the namespaces field.\n                                                null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                An empty selector ({}) matches all namespaces.\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            namespaces:\n                                              description: |-\n                                                namespaces specifies a static list of namespace names that the term applies to.\n                                                The term is applied to the union of the namespaces listed in this field\n                                                and the ones selected by namespaceSelector.\n                                                null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                              items:\n                                                type: string\n                                              type: array\n                                            topologyKey:\n                                              description: |-\n                                                This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                whose value of the label with key topologyKey matches that of any node on which any of the\n                                                selected pods is running.\n                                                Empty topologyKey is not allowed.\n                                              type: string\n                                          required:\n                                          - topologyKey\n                                          type: object\n                                        type: array\n                                    type: object\n                                type: object\n                              nodeName:\n                                description: |-\n                                  NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                                  the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                                  requirements.\n                                type: string\n                              nodeSelector:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  NodeSelector is a selector which must be true for the Pod to fit on a node.\n                                  Selector which must match a node's labels for the Pod to be scheduled on that node.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              schedulerName:\n                                description: |-\n                                  If specified, the Pod will be dispatched by specified scheduler.\n                                  If not specified, the Pod will be dispatched by default scheduler.\n                                type: string\n                              tolerations:\n                                description: |-\n                                  Allows Pods to be scheduled onto nodes with matching taints.\n                                  Each toleration in the array allows the Pod to tolerate node taints based on\n                                  specified `key`, `value`, `effect`, and `operator`.\n\n\n                                  - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                                  - The `operator` determines how the toleration matches the taint.\n\n\n                                  Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                                items:\n                                  description: |-\n                                    The pod this Toleration is attached to tolerates any taint that matches\n                                    the triple <key,value,effect> using the matching operator <operator>.\n                                  properties:\n                                    effect:\n                                      description: |-\n                                        Effect indicates the taint effect to match. Empty means match all taint effects.\n                                        When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                      type: string\n                                    key:\n                                      description: |-\n                                        Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                        If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                      type: string\n                                    operator:\n                                      description: |-\n                                        Operator represents a key's relationship to the value.\n                                        Valid operators are Exists and Equal. Defaults to Equal.\n                                        Exists is equivalent to wildcard for value, so that a pod can\n                                        tolerate all taints of a particular category.\n                                      type: string\n                                    tolerationSeconds:\n                                      description: |-\n                                        TolerationSeconds represents the period of time the toleration (which must be\n                                        of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                        it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                        negative values will be treated as 0 (evict immediately) by the system.\n                                      format: int64\n                                      type: integer\n                                    value:\n                                      description: |-\n                                        Value is the taint value the toleration matches to.\n                                        If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                      type: string\n                                  type: object\n                                type: array\n                              topologySpreadConstraints:\n                                description: |-\n                                  TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                                  domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                                  All topologySpreadConstraints are ANDed.\n                                items:\n                                  description: TopologySpreadConstraint specifies\n                                    how to spread matching pods among the given topology.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        LabelSelector is used to find matching pods.\n                                        Pods that match this label selector are counted to determine the number of pods\n                                        in their corresponding topology domain.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select the pods over which\n                                        spreading will be calculated. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are ANDed with labelSelector\n                                        to select the group of existing pods over which spreading will be calculated\n                                        for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        Keys that don't exist in the incoming pod labels will\n                                        be ignored. A null or empty list means only match against labelSelector.\n\n\n                                        This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    maxSkew:\n                                      description: |-\n                                        MaxSkew describes the degree to which pods may be unevenly distributed.\n                                        When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                        between the number of matching pods in the target topology and the global minimum.\n                                        The global minimum is the minimum number of matching pods in an eligible domain\n                                        or zero if the number of eligible domains is less than MinDomains.\n                                        For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                        labelSelector spread as 2/2/1:\n                                        In this case, the global minimum is 1.\n                                        | zone1 | zone2 | zone3 |\n                                        |  P P  |  P P  |   P   |\n                                        - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                        scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                        violate MaxSkew(1).\n                                        - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                        When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                        to topologies that satisfy it.\n                                        It's a required field. Default value is 1 and 0 is not allowed.\n                                      format: int32\n                                      type: integer\n                                    minDomains:\n                                      description: |-\n                                        MinDomains indicates a minimum number of eligible domains.\n                                        When the number of eligible domains with matching topology keys is less than minDomains,\n                                        Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                        And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                        this value has no effect on scheduling.\n                                        As a result, when the number of eligible domains is less than minDomains,\n                                        scheduler won't schedule more than maxSkew Pods to those domains.\n                                        If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                        Valid values are integers greater than 0.\n                                        When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                        For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                        labelSelector spread as 2/2/2:\n                                        | zone1 | zone2 | zone3 |\n                                        |  P P  |  P P  |  P P  |\n                                        The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                        In this situation, new pod with the same labelSelector cannot be scheduled,\n                                        because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                        it will violate MaxSkew.\n\n\n                                        This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                      format: int32\n                                      type: integer\n                                    nodeAffinityPolicy:\n                                      description: |-\n                                        NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                        when calculating pod topology spread skew. Options are:\n                                        - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                        - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                        If this value is nil, the behavior is equivalent to the Honor policy.\n                                        This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                      type: string\n                                    nodeTaintsPolicy:\n                                      description: |-\n                                        NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                        pod topology spread skew. Options are:\n                                        - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                        has a toleration, are included.\n                                        - Ignore: node taints are ignored. All nodes are included.\n\n\n                                        If this value is nil, the behavior is equivalent to the Ignore policy.\n                                        This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                      type: string\n                                    topologyKey:\n                                      description: |-\n                                        TopologyKey is the key of node labels. Nodes that have a label with this key\n                                        and identical values are considered to be in the same topology.\n                                        We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                        of pods into each bucket.\n                                        We define a domain as a particular instance of a topology.\n                                        Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                        nodeAffinityPolicy and nodeTaintsPolicy.\n                                        e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                        And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                        It's a required field.\n                                      type: string\n                                    whenUnsatisfiable:\n                                      description: |-\n                                        WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                        the spread constraint.\n                                        - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                        - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                          but giving higher precedence to topologies that would help reduce the\n                                          skew.\n                                        A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                        if and only if every possible node assignment for that pod would violate\n                                        \"MaxSkew\" on some topology.\n                                        For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                        labelSelector spread as 3/1/1:\n                                        | zone1 | zone2 | zone3 |\n                                        | P P P |   P   |   P   |\n                                        If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                        to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                        MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                        won't make it *more* imbalanced.\n                                        It's a required field.\n                                      type: string\n                                  required:\n                                  - maxSkew\n                                  - topologyKey\n                                  - whenUnsatisfiable\n                                  type: object\n                                type: array\n                            type: object\n                          volumeClaimTemplates:\n                            description: |-\n                              Defines VolumeClaimTemplates to override.\n                              Add new or override existing volume claim templates.\n                            items:\n                              properties:\n                                annotations:\n                                  additionalProperties:\n                                    type: string\n                                  description: Specifies the annotations for the PVC\n                                    of the volume.\n                                  type: object\n                                labels:\n                                  additionalProperties:\n                                    type: string\n                                  description: Specifies the labels for the PVC of\n                                    the volume.\n                                  type: object\n                                name:\n                                  description: |-\n                                    Refers to the name of a volumeMount defined in either:\n\n\n                                    - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                                    - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                                    The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                                  type: string\n                                spec:\n                                  description: |-\n                                    Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                                    with the mount name specified in the `name` field.\n\n\n                                    When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                                    defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                                  properties:\n                                    accessModes:\n                                      description: |-\n                                        Contains the desired access modes the volume should have.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-preserve-unknown-fields: true\n                                    resources:\n                                      description: |-\n                                        Represents the minimum resources the volume should have.\n                                        If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                        are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                      properties:\n                                        limits:\n                                          additionalProperties:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          description: |-\n                                            Limits describes the maximum amount of compute resources allowed.\n                                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                          type: object\n                                        requests:\n                                          additionalProperties:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          description: |-\n                                            Requests describes the minimum amount of compute resources required.\n                                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                          type: object\n                                      type: object\n                                      x-kubernetes-preserve-unknown-fields: true\n                                    storageClassName:\n                                      description: |-\n                                        The name of the StorageClass required by the claim.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                      type: string\n                                    volumeMode:\n                                      description: Defines what type of volume is\n                                        required by the claim, either Block or Filesystem.\n                                      type: string\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          volumeMounts:\n                            description: |-\n                              Defines VolumeMounts to override.\n                              Add new or override existing volume mounts of the first container in the Pod.\n                            items:\n                              description: VolumeMount describes a mounting of a Volume\n                                within a container.\n                              properties:\n                                mountPath:\n                                  description: |-\n                                    Path within the container at which the volume should be mounted.  Must\n                                    not contain ':'.\n                                  type: string\n                                mountPropagation:\n                                  description: |-\n                                    mountPropagation determines how mounts are propagated from the host\n                                    to container and the other way around.\n                                    When not set, MountPropagationNone is used.\n                                    This field is beta in 1.10.\n                                  type: string\n                                name:\n                                  description: This must match the Name of a Volume.\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    Mounted read-only if true, read-write otherwise (false or unspecified).\n                                    Defaults to false.\n                                  type: boolean\n                                subPath:\n                                  description: |-\n                                    Path within the volume from which the container's volume should be mounted.\n                                    Defaults to \"\" (volume's root).\n                                  type: string\n                                subPathExpr:\n                                  description: |-\n                                    Expanded path within the volume from which the container's volume should be mounted.\n                                    Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                    Defaults to \"\" (volume's root).\n                                    SubPathExpr and SubPath are mutually exclusive.\n                                  type: string\n                              required:\n                              - mountPath\n                              - name\n                              type: object\n                            type: array\n                          volumes:\n                            description: |-\n                              Defines Volumes to override.\n                              Add new or override existing volumes.\n                            items:\n                              description: Volume represents a named volume in a pod\n                                that may be accessed by any container in the pod.\n                              properties:\n                                awsElasticBlockStore:\n                                  description: |-\n                                    awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                                    kubelet's host machine and then exposed to the pod.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fsType is the filesystem type of the volume that you want to mount.\n                                        Tip: Ensure that the filesystem type is supported by the host operating system.\n                                        Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                        TODO: how do we prevent errors in the filesystem from compromising the machine\n                                      type: string\n                                    partition:\n                                      description: |-\n                                        partition is the partition in the volume that you want to mount.\n                                        If omitted, the default is to mount by volume name.\n                                        Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                        Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                      format: int32\n                                      type: integer\n                                    readOnly:\n                                      description: |-\n                                        readOnly value true will force the readOnly setting in VolumeMounts.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                      type: boolean\n                                    volumeID:\n                                      description: |-\n                                        volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                      type: string\n                                  required:\n                                  - volumeID\n                                  type: object\n                                azureDisk:\n                                  description: azureDisk represents an Azure Data\n                                    Disk mount on the host and bind mount to the pod.\n                                  properties:\n                                    cachingMode:\n                                      description: 'cachingMode is the Host Caching\n                                        mode: None, Read Only, Read Write.'\n                                      type: string\n                                    diskName:\n                                      description: diskName is the Name of the data\n                                        disk in the blob storage\n                                      type: string\n                                    diskURI:\n                                      description: diskURI is the URI of data disk\n                                        in the blob storage\n                                      type: string\n                                    fsType:\n                                      description: |-\n                                        fsType is Filesystem type to mount.\n                                        Must be a filesystem type supported by the host operating system.\n                                        Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      type: string\n                                    kind:\n                                      description: 'kind expected values are Shared:\n                                        multiple blob disks per storage account  Dedicated:\n                                        single blob disk per storage account  Managed:\n                                        azure managed data disk (only in managed availability\n                                        set). defaults to shared'\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly Defaults to false (read/write). ReadOnly here will force\n                                        the ReadOnly setting in VolumeMounts.\n                                      type: boolean\n                                  required:\n                                  - diskName\n                                  - diskURI\n                                  type: object\n                                azureFile:\n                                  description: azureFile represents an Azure File\n                                    Service mount on the host and bind mount to the\n                                    pod.\n                                  properties:\n                                    readOnly:\n                                      description: |-\n                                        readOnly defaults to false (read/write). ReadOnly here will force\n                                        the ReadOnly setting in VolumeMounts.\n                                      type: boolean\n                                    secretName:\n                                      description: secretName is the  name of secret\n                                        that contains Azure Storage Account Name and\n                                        Key\n                                      type: string\n                                    shareName:\n                                      description: shareName is the azure share Name\n                                      type: string\n                                  required:\n                                  - secretName\n                                  - shareName\n                                  type: object\n                                cephfs:\n                                  description: cephFS represents a Ceph FS mount on\n                                    the host that shares a pod's lifetime\n                                  properties:\n                                    monitors:\n                                      description: |-\n                                        monitors is Required: Monitors is a collection of Ceph monitors\n                                        More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                      items:\n                                        type: string\n                                      type: array\n                                    path:\n                                      description: 'path is Optional: Used as the\n                                        mounted root, rather than the full Ceph tree,\n                                        default is /'\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                        the ReadOnly setting in VolumeMounts.\n                                        More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                      type: boolean\n                                    secretFile:\n                                      description: |-\n                                        secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                        More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                      type: string\n                                    secretRef:\n                                      description: |-\n                                        secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                        More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    user:\n                                      description: |-\n                                        user is optional: User is the rados user name, default is admin\n                                        More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                      type: string\n                                  required:\n                                  - monitors\n                                  type: object\n                                cinder:\n                                  description: |-\n                                    cinder represents a cinder volume attached and mounted on kubelets host machine.\n                                    More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fsType is the filesystem type to mount.\n                                        Must be a filesystem type supported by the host operating system.\n                                        Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly defaults to false (read/write). ReadOnly here will force\n                                        the ReadOnly setting in VolumeMounts.\n                                        More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                      type: boolean\n                                    secretRef:\n                                      description: |-\n                                        secretRef is optional: points to a secret object containing parameters used to connect\n                                        to OpenStack.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    volumeID:\n                                      description: |-\n                                        volumeID used to identify the volume in cinder.\n                                        More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                      type: string\n                                  required:\n                                  - volumeID\n                                  type: object\n                                configMap:\n                                  description: configMap represents a configMap that\n                                    should populate this volume\n                                  properties:\n                                    defaultMode:\n                                      description: |-\n                                        defaultMode is optional: mode bits used to set permissions on created files by default.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        Defaults to 0644.\n                                        Directories within the path are not affected by this setting.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    items:\n                                      description: |-\n                                        items if unspecified, each key-value pair in the Data field of the referenced\n                                        ConfigMap will be projected into the volume as a file whose name is the\n                                        key and content is the value. If specified, the listed keys will be\n                                        projected into the specified paths, and unlisted keys will not be\n                                        present. If a key is specified which is not present in the ConfigMap,\n                                        the volume setup will error unless it is marked optional. Paths must be\n                                        relative and may not contain the '..' path or start with '..'.\n                                      items:\n                                        description: Maps a string key to a path within\n                                          a volume.\n                                        properties:\n                                          key:\n                                            description: key is the key to project.\n                                            type: string\n                                          mode:\n                                            description: |-\n                                              mode is Optional: mode bits used to set permissions on this file.\n                                              Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                              YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                              If not specified, the volume defaultMode will be used.\n                                              This might be in conflict with other options that affect the file\n                                              mode, like fsGroup, and the result can be other mode bits set.\n                                            format: int32\n                                            type: integer\n                                          path:\n                                            description: |-\n                                              path is the relative path of the file to map the key to.\n                                              May not be an absolute path.\n                                              May not contain the path element '..'.\n                                              May not start with the string '..'.\n                                            type: string\n                                        required:\n                                        - key\n                                        - path\n                                        type: object\n                                      type: array\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                    optional:\n                                      description: optional specify whether the ConfigMap\n                                        or its keys must be defined\n                                      type: boolean\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                csi:\n                                  description: csi (Container Storage Interface) represents\n                                    ephemeral storage that is handled by certain external\n                                    CSI drivers (Beta feature).\n                                  properties:\n                                    driver:\n                                      description: |-\n                                        driver is the name of the CSI driver that handles this volume.\n                                        Consult with your admin for the correct name as registered in the cluster.\n                                      type: string\n                                    fsType:\n                                      description: |-\n                                        fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                        If not provided, the empty value is passed to the associated CSI driver\n                                        which will determine the default filesystem to apply.\n                                      type: string\n                                    nodePublishSecretRef:\n                                      description: |-\n                                        nodePublishSecretRef is a reference to the secret object containing\n                                        sensitive information to pass to the CSI driver to complete the CSI\n                                        NodePublishVolume and NodeUnpublishVolume calls.\n                                        This field is optional, and  may be empty if no secret is required. If the\n                                        secret object contains more than one secret, all secret references are passed.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    readOnly:\n                                      description: |-\n                                        readOnly specifies a read-only configuration for the volume.\n                                        Defaults to false (read/write).\n                                      type: boolean\n                                    volumeAttributes:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        volumeAttributes stores driver-specific properties that are passed to the CSI\n                                        driver. Consult your driver's documentation for supported values.\n                                      type: object\n                                  required:\n                                  - driver\n                                  type: object\n                                downwardAPI:\n                                  description: downwardAPI represents downward API\n                                    about the pod that should populate this volume\n                                  properties:\n                                    defaultMode:\n                                      description: |-\n                                        Optional: mode bits to use on created files by default. Must be a\n                                        Optional: mode bits used to set permissions on created files by default.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        Defaults to 0644.\n                                        Directories within the path are not affected by this setting.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    items:\n                                      description: Items is a list of downward API\n                                        volume file\n                                      items:\n                                        description: DownwardAPIVolumeFile represents\n                                          information to create the file containing\n                                          the pod field\n                                        properties:\n                                          fieldRef:\n                                            description: 'Required: Selects a field\n                                              of the pod: only annotations, labels,\n                                              name and namespace are supported.'\n                                            properties:\n                                              apiVersion:\n                                                description: Version of the schema\n                                                  the FieldPath is written in terms\n                                                  of, defaults to \"v1\".\n                                                type: string\n                                              fieldPath:\n                                                description: Path of the field to\n                                                  select in the specified API version.\n                                                type: string\n                                            required:\n                                            - fieldPath\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          mode:\n                                            description: |-\n                                              Optional: mode bits used to set permissions on this file, must be an octal value\n                                              between 0000 and 0777 or a decimal value between 0 and 511.\n                                              YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                              If not specified, the volume defaultMode will be used.\n                                              This might be in conflict with other options that affect the file\n                                              mode, like fsGroup, and the result can be other mode bits set.\n                                            format: int32\n                                            type: integer\n                                          path:\n                                            description: 'Required: Path is  the relative\n                                              path name of the file to be created.\n                                              Must not be absolute or contain the\n                                              ''..'' path. Must be utf-8 encoded.\n                                              The first item of the relative path\n                                              must not start with ''..'''\n                                            type: string\n                                          resourceFieldRef:\n                                            description: |-\n                                              Selects a resource of the container: only resources limits and requests\n                                              (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                            properties:\n                                              containerName:\n                                                description: 'Container name: required\n                                                  for volumes, optional for env vars'\n                                                type: string\n                                              divisor:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: Specifies the output\n                                                  format of the exposed resources,\n                                                  defaults to \"1\"\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              resource:\n                                                description: 'Required: resource to\n                                                  select'\n                                                type: string\n                                            required:\n                                            - resource\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                        required:\n                                        - path\n                                        type: object\n                                      type: array\n                                  type: object\n                                emptyDir:\n                                  description: |-\n                                    emptyDir represents a temporary directory that shares a pod's lifetime.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                  properties:\n                                    medium:\n                                      description: |-\n                                        medium represents what type of storage medium should back this directory.\n                                        The default is \"\" which means to use the node's default medium.\n                                        Must be an empty string (default) or Memory.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                      type: string\n                                    sizeLimit:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                        The size limit is also applicable for memory medium.\n                                        The maximum usage on memory medium EmptyDir would be the minimum value between\n                                        the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                        The default is nil which means that the limit is undefined.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                  type: object\n                                ephemeral:\n                                  description: |-\n                                    ephemeral represents a volume that is handled by a cluster storage driver.\n                                    The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                                    and deleted when the pod is removed.\n\n\n                                    Use this if:\n                                    a) the volume is only needed while the pod runs,\n                                    b) features of normal volumes like restoring from snapshot or capacity\n                                       tracking are needed,\n                                    c) the storage driver is specified through a storage class, and\n                                    d) the storage driver supports dynamic volume provisioning through\n                                       a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                       information on the connection between this volume type\n                                       and PersistentVolumeClaim).\n\n\n                                    Use PersistentVolumeClaim or one of the vendor-specific\n                                    APIs for volumes that persist for longer than the lifecycle\n                                    of an individual pod.\n\n\n                                    Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                                    be used that way - see the documentation of the driver for\n                                    more information.\n\n\n                                    A pod can use both types of ephemeral volumes and\n                                    persistent volumes at the same time.\n                                  properties:\n                                    volumeClaimTemplate:\n                                      description: |-\n                                        Will be used to create a stand-alone PVC to provision the volume.\n                                        The pod in which this EphemeralVolumeSource is embedded will be the\n                                        owner of the PVC, i.e. the PVC will be deleted together with the\n                                        pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                        `<volume name>` is the name from the `PodSpec.Volumes` array\n                                        entry. Pod validation will reject the pod if the concatenated name\n                                        is not valid for a PVC (for example, too long).\n\n\n                                        An existing PVC with that name that is not owned by the pod\n                                        will *not* be used for the pod to avoid using an unrelated\n                                        volume by mistake. Starting the pod is then blocked until\n                                        the unrelated PVC is removed. If such a pre-created PVC is\n                                        meant to be used by the pod, the PVC has to updated with an\n                                        owner reference to the pod once the pod exists. Normally\n                                        this should not be necessary, but it may be useful when\n                                        manually reconstructing a broken cluster.\n\n\n                                        This field is read-only and no changes will be made by Kubernetes\n                                        to the PVC after it has been created.\n\n\n                                        Required, must not be nil.\n                                      properties:\n                                        metadata:\n                                          description: |-\n                                            May contain labels and annotations that will be copied into the PVC\n                                            when creating it. No other fields are allowed and will be rejected during\n                                            validation.\n                                          properties:\n                                            annotations:\n                                              additionalProperties:\n                                                type: string\n                                              type: object\n                                            finalizers:\n                                              items:\n                                                type: string\n                                              type: array\n                                            labels:\n                                              additionalProperties:\n                                                type: string\n                                              type: object\n                                            name:\n                                              type: string\n                                            namespace:\n                                              type: string\n                                          type: object\n                                        spec:\n                                          description: |-\n                                            The specification for the PersistentVolumeClaim. The entire content is\n                                            copied unchanged into the PVC that gets created from this\n                                            template. The same fields as in a PersistentVolumeClaim\n                                            are also valid here.\n                                          properties:\n                                            accessModes:\n                                              description: |-\n                                                accessModes contains the desired access modes the volume should have.\n                                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                              items:\n                                                type: string\n                                              type: array\n                                            dataSource:\n                                              description: |-\n                                                dataSource field can be used to specify either:\n                                                * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                                * An existing PVC (PersistentVolumeClaim)\n                                                If the provisioner or an external controller can support the specified data source,\n                                                it will create a new volume based on the contents of the specified data source.\n                                                When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                                and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                                If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                              properties:\n                                                apiGroup:\n                                                  description: |-\n                                                    APIGroup is the group for the resource being referenced.\n                                                    If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                    For any other third-party types, APIGroup is required.\n                                                  type: string\n                                                kind:\n                                                  description: Kind is the type of\n                                                    resource being referenced\n                                                  type: string\n                                                name:\n                                                  description: Name is the name of\n                                                    resource being referenced\n                                                  type: string\n                                              required:\n                                              - kind\n                                              - name\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            dataSourceRef:\n                                              description: |-\n                                                dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                                volume is desired. This may be any object from a non-empty API group (non\n                                                core object) or a PersistentVolumeClaim object.\n                                                When this field is specified, volume binding will only succeed if the type of\n                                                the specified object matches some installed volume populator or dynamic\n                                                provisioner.\n                                                This field will replace the functionality of the dataSource field and as such\n                                                if both fields are non-empty, they must have the same value. For backwards\n                                                compatibility, when namespace isn't specified in dataSourceRef,\n                                                both fields (dataSource and dataSourceRef) will be set to the same\n                                                value automatically if one of them is empty and the other is non-empty.\n                                                When namespace is specified in dataSourceRef,\n                                                dataSource isn't set to the same value and must be empty.\n                                                There are three important differences between dataSource and dataSourceRef:\n                                                * While dataSource only allows two specific types of objects, dataSourceRef\n                                                  allows any non-core object, as well as PersistentVolumeClaim objects.\n                                                * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                                  preserves all values, and generates an error if a disallowed value is\n                                                  specified.\n                                                * While dataSource only allows local objects, dataSourceRef allows objects\n                                                  in any namespaces.\n                                                (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                                (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                              properties:\n                                                apiGroup:\n                                                  description: |-\n                                                    APIGroup is the group for the resource being referenced.\n                                                    If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                    For any other third-party types, APIGroup is required.\n                                                  type: string\n                                                kind:\n                                                  description: Kind is the type of\n                                                    resource being referenced\n                                                  type: string\n                                                name:\n                                                  description: Name is the name of\n                                                    resource being referenced\n                                                  type: string\n                                                namespace:\n                                                  description: |-\n                                                    Namespace is the namespace of resource being referenced\n                                                    Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                                    (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                                  type: string\n                                              required:\n                                              - kind\n                                              - name\n                                              type: object\n                                            resources:\n                                              description: |-\n                                                resources represents the minimum resources the volume should have.\n                                                If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                                that are lower than previous value but must still be higher than capacity recorded in the\n                                                status field of the claim.\n                                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                              properties:\n                                                limits:\n                                                  additionalProperties:\n                                                    anyOf:\n                                                    - type: integer\n                                                    - type: string\n                                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                    x-kubernetes-int-or-string: true\n                                                  description: |-\n                                                    Limits describes the maximum amount of compute resources allowed.\n                                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                  type: object\n                                                requests:\n                                                  additionalProperties:\n                                                    anyOf:\n                                                    - type: integer\n                                                    - type: string\n                                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                    x-kubernetes-int-or-string: true\n                                                  description: |-\n                                                    Requests describes the minimum amount of compute resources required.\n                                                    If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                    otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                  type: object\n                                              type: object\n                                            selector:\n                                              description: selector is a label query\n                                                over volumes to consider for binding.\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            storageClassName:\n                                              description: |-\n                                                storageClassName is the name of the StorageClass required by the claim.\n                                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                              type: string\n                                            volumeAttributesClassName:\n                                              description: |-\n                                                volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                                If specified, the CSI driver will create or update the volume with the attributes defined\n                                                in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                                it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                                will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                                If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                                will be set by the persistentvolume controller if it exists.\n                                                If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                                set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                                exists.\n                                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                                (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                              type: string\n                                            volumeMode:\n                                              description: |-\n                                                volumeMode defines what type of volume is required by the claim.\n                                                Value of Filesystem is implied when not included in claim spec.\n                                              type: string\n                                            volumeName:\n                                              description: volumeName is the binding\n                                                reference to the PersistentVolume\n                                                backing this claim.\n                                              type: string\n                                          type: object\n                                      required:\n                                      - spec\n                                      type: object\n                                  type: object\n                                fc:\n                                  description: fc represents a Fibre Channel resource\n                                    that is attached to a kubelet's host machine and\n                                    then exposed to the pod.\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fsType is the filesystem type to mount.\n                                        Must be a filesystem type supported by the host operating system.\n                                        Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        TODO: how do we prevent errors in the filesystem from compromising the machine\n                                      type: string\n                                    lun:\n                                      description: 'lun is Optional: FC target lun\n                                        number'\n                                      format: int32\n                                      type: integer\n                                    readOnly:\n                                      description: |-\n                                        readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                        the ReadOnly setting in VolumeMounts.\n                                      type: boolean\n                                    targetWWNs:\n                                      description: 'targetWWNs is Optional: FC target\n                                        worldwide names (WWNs)'\n                                      items:\n                                        type: string\n                                      type: array\n                                    wwids:\n                                      description: |-\n                                        wwids Optional: FC volume world wide identifiers (wwids)\n                                        Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                flexVolume:\n                                  description: |-\n                                    flexVolume represents a generic volume resource that is\n                                    provisioned/attached using an exec based plugin.\n                                  properties:\n                                    driver:\n                                      description: driver is the name of the driver\n                                        to use for this volume.\n                                      type: string\n                                    fsType:\n                                      description: |-\n                                        fsType is the filesystem type to mount.\n                                        Must be a filesystem type supported by the host operating system.\n                                        Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                      type: string\n                                    options:\n                                      additionalProperties:\n                                        type: string\n                                      description: 'options is Optional: this field\n                                        holds extra command options if any.'\n                                      type: object\n                                    readOnly:\n                                      description: |-\n                                        readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                        the ReadOnly setting in VolumeMounts.\n                                      type: boolean\n                                    secretRef:\n                                      description: |-\n                                        secretRef is Optional: secretRef is reference to the secret object containing\n                                        sensitive information to pass to the plugin scripts. This may be\n                                        empty if no secret object is specified. If the secret object\n                                        contains more than one secret, all secrets are passed to the plugin\n                                        scripts.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  required:\n                                  - driver\n                                  type: object\n                                flocker:\n                                  description: flocker represents a Flocker volume\n                                    attached to a kubelet's host machine. This depends\n                                    on the Flocker control service being running\n                                  properties:\n                                    datasetName:\n                                      description: |-\n                                        datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                        should be considered as deprecated\n                                      type: string\n                                    datasetUUID:\n                                      description: datasetUUID is the UUID of the\n                                        dataset. This is unique identifier of a Flocker\n                                        dataset\n                                      type: string\n                                  type: object\n                                gcePersistentDisk:\n                                  description: |-\n                                    gcePersistentDisk represents a GCE Disk resource that is attached to a\n                                    kubelet's host machine and then exposed to the pod.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fsType is filesystem type of the volume that you want to mount.\n                                        Tip: Ensure that the filesystem type is supported by the host operating system.\n                                        Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                        TODO: how do we prevent errors in the filesystem from compromising the machine\n                                      type: string\n                                    partition:\n                                      description: |-\n                                        partition is the partition in the volume that you want to mount.\n                                        If omitted, the default is to mount by volume name.\n                                        Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                        Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                      format: int32\n                                      type: integer\n                                    pdName:\n                                      description: |-\n                                        pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly here will force the ReadOnly setting in VolumeMounts.\n                                        Defaults to false.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                      type: boolean\n                                  required:\n                                  - pdName\n                                  type: object\n                                gitRepo:\n                                  description: |-\n                                    gitRepo represents a git repository at a particular revision.\n                                    DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                                    EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                                    into the Pod's container.\n                                  properties:\n                                    directory:\n                                      description: |-\n                                        directory is the target directory name.\n                                        Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                        git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                        the subdirectory with the given name.\n                                      type: string\n                                    repository:\n                                      description: repository is the URL\n                                      type: string\n                                    revision:\n                                      description: revision is the commit hash for\n                                        the specified revision.\n                                      type: string\n                                  required:\n                                  - repository\n                                  type: object\n                                glusterfs:\n                                  description: |-\n                                    glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                                    More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                                  properties:\n                                    endpoints:\n                                      description: |-\n                                        endpoints is the endpoint name that details Glusterfs topology.\n                                        More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                      type: string\n                                    path:\n                                      description: |-\n                                        path is the Glusterfs volume path.\n                                        More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                        Defaults to false.\n                                        More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                      type: boolean\n                                  required:\n                                  - endpoints\n                                  - path\n                                  type: object\n                                hostPath:\n                                  description: |-\n                                    hostPath represents a pre-existing file or directory on the host\n                                    machine that is directly exposed to the container. This is generally\n                                    used for system agents or other privileged things that are allowed\n                                    to see the host machine. Most containers will NOT need this.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                    ---\n                                    TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                                    mount host directories as read/write.\n                                  properties:\n                                    path:\n                                      description: |-\n                                        path of the directory on the host.\n                                        If the path is a symlink, it will follow the link to the real path.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                      type: string\n                                    type:\n                                      description: |-\n                                        type for HostPath Volume\n                                        Defaults to \"\"\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                      type: string\n                                  required:\n                                  - path\n                                  type: object\n                                iscsi:\n                                  description: |-\n                                    iscsi represents an ISCSI Disk resource that is attached to a\n                                    kubelet's host machine and then exposed to the pod.\n                                    More info: https://examples.k8s.io/volumes/iscsi/README.md\n                                  properties:\n                                    chapAuthDiscovery:\n                                      description: chapAuthDiscovery defines whether\n                                        support iSCSI Discovery CHAP authentication\n                                      type: boolean\n                                    chapAuthSession:\n                                      description: chapAuthSession defines whether\n                                        support iSCSI Session CHAP authentication\n                                      type: boolean\n                                    fsType:\n                                      description: |-\n                                        fsType is the filesystem type of the volume that you want to mount.\n                                        Tip: Ensure that the filesystem type is supported by the host operating system.\n                                        Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                        TODO: how do we prevent errors in the filesystem from compromising the machine\n                                      type: string\n                                    initiatorName:\n                                      description: |-\n                                        initiatorName is the custom iSCSI Initiator Name.\n                                        If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                        <target portal>:<volume name> will be created for the connection.\n                                      type: string\n                                    iqn:\n                                      description: iqn is the target iSCSI Qualified\n                                        Name.\n                                      type: string\n                                    iscsiInterface:\n                                      description: |-\n                                        iscsiInterface is the interface Name that uses an iSCSI transport.\n                                        Defaults to 'default' (tcp).\n                                      type: string\n                                    lun:\n                                      description: lun represents iSCSI Target Lun\n                                        number.\n                                      format: int32\n                                      type: integer\n                                    portals:\n                                      description: |-\n                                        portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                        is other than default (typically TCP ports 860 and 3260).\n                                      items:\n                                        type: string\n                                      type: array\n                                    readOnly:\n                                      description: |-\n                                        readOnly here will force the ReadOnly setting in VolumeMounts.\n                                        Defaults to false.\n                                      type: boolean\n                                    secretRef:\n                                      description: secretRef is the CHAP Secret for\n                                        iSCSI target and initiator authentication\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    targetPortal:\n                                      description: |-\n                                        targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                        is other than default (typically TCP ports 860 and 3260).\n                                      type: string\n                                  required:\n                                  - iqn\n                                  - lun\n                                  - targetPortal\n                                  type: object\n                                name:\n                                  description: |-\n                                    name of the volume.\n                                    Must be a DNS_LABEL and unique within the pod.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  type: string\n                                nfs:\n                                  description: |-\n                                    nfs represents an NFS mount on the host that shares a pod's lifetime\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                  properties:\n                                    path:\n                                      description: |-\n                                        path that is exported by the NFS server.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly here will force the NFS export to be mounted with read-only permissions.\n                                        Defaults to false.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                      type: boolean\n                                    server:\n                                      description: |-\n                                        server is the hostname or IP address of the NFS server.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                      type: string\n                                  required:\n                                  - path\n                                  - server\n                                  type: object\n                                persistentVolumeClaim:\n                                  description: |-\n                                    persistentVolumeClaimVolumeSource represents a reference to a\n                                    PersistentVolumeClaim in the same namespace.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                  properties:\n                                    claimName:\n                                      description: |-\n                                        claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly Will force the ReadOnly setting in VolumeMounts.\n                                        Default false.\n                                      type: boolean\n                                  required:\n                                  - claimName\n                                  type: object\n                                photonPersistentDisk:\n                                  description: photonPersistentDisk represents a PhotonController\n                                    persistent disk attached and mounted on kubelets\n                                    host machine\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fsType is the filesystem type to mount.\n                                        Must be a filesystem type supported by the host operating system.\n                                        Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      type: string\n                                    pdID:\n                                      description: pdID is the ID that identifies\n                                        Photon Controller persistent disk\n                                      type: string\n                                  required:\n                                  - pdID\n                                  type: object\n                                portworxVolume:\n                                  description: portworxVolume represents a portworx\n                                    volume attached and mounted on kubelets host machine\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fSType represents the filesystem type to mount\n                                        Must be a filesystem type supported by the host operating system.\n                                        Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly defaults to false (read/write). ReadOnly here will force\n                                        the ReadOnly setting in VolumeMounts.\n                                      type: boolean\n                                    volumeID:\n                                      description: volumeID uniquely identifies a\n                                        Portworx volume\n                                      type: string\n                                  required:\n                                  - volumeID\n                                  type: object\n                                projected:\n                                  description: projected items for all in one resources\n                                    secrets, configmaps, and downward API\n                                  properties:\n                                    defaultMode:\n                                      description: |-\n                                        defaultMode are the mode bits used to set permissions on created files by default.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        Directories within the path are not affected by this setting.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    sources:\n                                      description: sources is the list of volume projections\n                                      items:\n                                        description: Projection that may be projected\n                                          along with other supported volume types\n                                        properties:\n                                          clusterTrustBundle:\n                                            description: |-\n                                              ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                              of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                              Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                              ClusterTrustBundle objects can either be selected by name, or by the\n                                              combination of signer name and a label selector.\n\n\n                                              Kubelet performs aggressive normalization of the PEM contents written\n                                              into the pod filesystem.  Esoteric PEM features such as inter-block\n                                              comments and block headers are stripped.  Certificates are deduplicated.\n                                              The ordering of certificates within the file is arbitrary, and Kubelet\n                                              may change the order over time.\n                                            properties:\n                                              labelSelector:\n                                                description: |-\n                                                  Select all ClusterTrustBundles that match this label selector.  Only has\n                                                  effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                                  interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                                  everything\".\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              name:\n                                                description: |-\n                                                  Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                                  with signerName and labelSelector.\n                                                type: string\n                                              optional:\n                                                description: |-\n                                                  If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                                  aren't available.  If using name, then the named ClusterTrustBundle is\n                                                  allowed not to exist.  If using signerName, then the combination of\n                                                  signerName and labelSelector is allowed to match zero\n                                                  ClusterTrustBundles.\n                                                type: boolean\n                                              path:\n                                                description: Relative path from the\n                                                  volume root to write the bundle.\n                                                type: string\n                                              signerName:\n                                                description: |-\n                                                  Select all ClusterTrustBundles that match this signer name.\n                                                  Mutually-exclusive with name.  The contents of all selected\n                                                  ClusterTrustBundles will be unified and deduplicated.\n                                                type: string\n                                            required:\n                                            - path\n                                            type: object\n                                          configMap:\n                                            description: configMap information about\n                                              the configMap data to project\n                                            properties:\n                                              items:\n                                                description: |-\n                                                  items if unspecified, each key-value pair in the Data field of the referenced\n                                                  ConfigMap will be projected into the volume as a file whose name is the\n                                                  key and content is the value. If specified, the listed keys will be\n                                                  projected into the specified paths, and unlisted keys will not be\n                                                  present. If a key is specified which is not present in the ConfigMap,\n                                                  the volume setup will error unless it is marked optional. Paths must be\n                                                  relative and may not contain the '..' path or start with '..'.\n                                                items:\n                                                  description: Maps a string key to\n                                                    a path within a volume.\n                                                  properties:\n                                                    key:\n                                                      description: key is the key\n                                                        to project.\n                                                      type: string\n                                                    mode:\n                                                      description: |-\n                                                        mode is Optional: mode bits used to set permissions on this file.\n                                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                        If not specified, the volume defaultMode will be used.\n                                                        This might be in conflict with other options that affect the file\n                                                        mode, like fsGroup, and the result can be other mode bits set.\n                                                      format: int32\n                                                      type: integer\n                                                    path:\n                                                      description: |-\n                                                        path is the relative path of the file to map the key to.\n                                                        May not be an absolute path.\n                                                        May not contain the path element '..'.\n                                                        May not start with the string '..'.\n                                                      type: string\n                                                  required:\n                                                  - key\n                                                  - path\n                                                  type: object\n                                                type: array\n                                              name:\n                                                description: |-\n                                                  Name of the referent.\n                                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                                type: string\n                                              optional:\n                                                description: optional specify whether\n                                                  the ConfigMap or its keys must be\n                                                  defined\n                                                type: boolean\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          downwardAPI:\n                                            description: downwardAPI information about\n                                              the downwardAPI data to project\n                                            properties:\n                                              items:\n                                                description: Items is a list of DownwardAPIVolume\n                                                  file\n                                                items:\n                                                  description: DownwardAPIVolumeFile\n                                                    represents information to create\n                                                    the file containing the pod field\n                                                  properties:\n                                                    fieldRef:\n                                                      description: 'Required: Selects\n                                                        a field of the pod: only annotations,\n                                                        labels, name and namespace\n                                                        are supported.'\n                                                      properties:\n                                                        apiVersion:\n                                                          description: Version of\n                                                            the schema the FieldPath\n                                                            is written in terms of,\n                                                            defaults to \"v1\".\n                                                          type: string\n                                                        fieldPath:\n                                                          description: Path of the\n                                                            field to select in the\n                                                            specified API version.\n                                                          type: string\n                                                      required:\n                                                      - fieldPath\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    mode:\n                                                      description: |-\n                                                        Optional: mode bits used to set permissions on this file, must be an octal value\n                                                        between 0000 and 0777 or a decimal value between 0 and 511.\n                                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                        If not specified, the volume defaultMode will be used.\n                                                        This might be in conflict with other options that affect the file\n                                                        mode, like fsGroup, and the result can be other mode bits set.\n                                                      format: int32\n                                                      type: integer\n                                                    path:\n                                                      description: 'Required: Path\n                                                        is  the relative path name\n                                                        of the file to be created.\n                                                        Must not be absolute or contain\n                                                        the ''..'' path. Must be utf-8\n                                                        encoded. The first item of\n                                                        the relative path must not\n                                                        start with ''..'''\n                                                      type: string\n                                                    resourceFieldRef:\n                                                      description: |-\n                                                        Selects a resource of the container: only resources limits and requests\n                                                        (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                      properties:\n                                                        containerName:\n                                                          description: 'Container\n                                                            name: required for volumes,\n                                                            optional for env vars'\n                                                          type: string\n                                                        divisor:\n                                                          anyOf:\n                                                          - type: integer\n                                                          - type: string\n                                                          description: Specifies the\n                                                            output format of the exposed\n                                                            resources, defaults to\n                                                            \"1\"\n                                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                          x-kubernetes-int-or-string: true\n                                                        resource:\n                                                          description: 'Required:\n                                                            resource to select'\n                                                          type: string\n                                                      required:\n                                                      - resource\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                  required:\n                                                  - path\n                                                  type: object\n                                                type: array\n                                            type: object\n                                          secret:\n                                            description: secret information about\n                                              the secret data to project\n                                            properties:\n                                              items:\n                                                description: |-\n                                                  items if unspecified, each key-value pair in the Data field of the referenced\n                                                  Secret will be projected into the volume as a file whose name is the\n                                                  key and content is the value. If specified, the listed keys will be\n                                                  projected into the specified paths, and unlisted keys will not be\n                                                  present. If a key is specified which is not present in the Secret,\n                                                  the volume setup will error unless it is marked optional. Paths must be\n                                                  relative and may not contain the '..' path or start with '..'.\n                                                items:\n                                                  description: Maps a string key to\n                                                    a path within a volume.\n                                                  properties:\n                                                    key:\n                                                      description: key is the key\n                                                        to project.\n                                                      type: string\n                                                    mode:\n                                                      description: |-\n                                                        mode is Optional: mode bits used to set permissions on this file.\n                                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                        If not specified, the volume defaultMode will be used.\n                                                        This might be in conflict with other options that affect the file\n                                                        mode, like fsGroup, and the result can be other mode bits set.\n                                                      format: int32\n                                                      type: integer\n                                                    path:\n                                                      description: |-\n                                                        path is the relative path of the file to map the key to.\n                                                        May not be an absolute path.\n                                                        May not contain the path element '..'.\n                                                        May not start with the string '..'.\n                                                      type: string\n                                                  required:\n                                                  - key\n                                                  - path\n                                                  type: object\n                                                type: array\n                                              name:\n                                                description: |-\n                                                  Name of the referent.\n                                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                                type: string\n                                              optional:\n                                                description: optional field specify\n                                                  whether the Secret or its key must\n                                                  be defined\n                                                type: boolean\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          serviceAccountToken:\n                                            description: serviceAccountToken is information\n                                              about the serviceAccountToken data to\n                                              project\n                                            properties:\n                                              audience:\n                                                description: |-\n                                                  audience is the intended audience of the token. A recipient of a token\n                                                  must identify itself with an identifier specified in the audience of the\n                                                  token, and otherwise should reject the token. The audience defaults to the\n                                                  identifier of the apiserver.\n                                                type: string\n                                              expirationSeconds:\n                                                description: |-\n                                                  expirationSeconds is the requested duration of validity of the service\n                                                  account token. As the token approaches expiration, the kubelet volume\n                                                  plugin will proactively rotate the service account token. The kubelet will\n                                                  start trying to rotate the token if the token is older than 80 percent of\n                                                  its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                                  and must be at least 10 minutes.\n                                                format: int64\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the path relative to the mount point of the file to project the\n                                                  token into.\n                                                type: string\n                                            required:\n                                            - path\n                                            type: object\n                                        type: object\n                                      type: array\n                                  type: object\n                                quobyte:\n                                  description: quobyte represents a Quobyte mount\n                                    on the host that shares a pod's lifetime\n                                  properties:\n                                    group:\n                                      description: |-\n                                        group to map volume access to\n                                        Default is no group\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                        Defaults to false.\n                                      type: boolean\n                                    registry:\n                                      description: |-\n                                        registry represents a single or multiple Quobyte Registry services\n                                        specified as a string as host:port pair (multiple entries are separated with commas)\n                                        which acts as the central registry for volumes\n                                      type: string\n                                    tenant:\n                                      description: |-\n                                        tenant owning the given Quobyte volume in the Backend\n                                        Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                      type: string\n                                    user:\n                                      description: |-\n                                        user to map volume access to\n                                        Defaults to serivceaccount user\n                                      type: string\n                                    volume:\n                                      description: volume is a string that references\n                                        an already created Quobyte volume by name.\n                                      type: string\n                                  required:\n                                  - registry\n                                  - volume\n                                  type: object\n                                rbd:\n                                  description: |-\n                                    rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fsType is the filesystem type of the volume that you want to mount.\n                                        Tip: Ensure that the filesystem type is supported by the host operating system.\n                                        Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                        TODO: how do we prevent errors in the filesystem from compromising the machine\n                                      type: string\n                                    image:\n                                      description: |-\n                                        image is the rados image name.\n                                        More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                      type: string\n                                    keyring:\n                                      description: |-\n                                        keyring is the path to key ring for RBDUser.\n                                        Default is /etc/ceph/keyring.\n                                        More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                      type: string\n                                    monitors:\n                                      description: |-\n                                        monitors is a collection of Ceph monitors.\n                                        More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                      items:\n                                        type: string\n                                      type: array\n                                    pool:\n                                      description: |-\n                                        pool is the rados pool name.\n                                        Default is rbd.\n                                        More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly here will force the ReadOnly setting in VolumeMounts.\n                                        Defaults to false.\n                                        More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                      type: boolean\n                                    secretRef:\n                                      description: |-\n                                        secretRef is name of the authentication secret for RBDUser. If provided\n                                        overrides keyring.\n                                        Default is nil.\n                                        More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    user:\n                                      description: |-\n                                        user is the rados user name.\n                                        Default is admin.\n                                        More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                      type: string\n                                  required:\n                                  - image\n                                  - monitors\n                                  type: object\n                                scaleIO:\n                                  description: scaleIO represents a ScaleIO persistent\n                                    volume attached and mounted on Kubernetes nodes.\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fsType is the filesystem type to mount.\n                                        Must be a filesystem type supported by the host operating system.\n                                        Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                        Default is \"xfs\".\n                                      type: string\n                                    gateway:\n                                      description: gateway is the host address of\n                                        the ScaleIO API Gateway.\n                                      type: string\n                                    protectionDomain:\n                                      description: protectionDomain is the name of\n                                        the ScaleIO Protection Domain for the configured\n                                        storage.\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly Defaults to false (read/write). ReadOnly here will force\n                                        the ReadOnly setting in VolumeMounts.\n                                      type: boolean\n                                    secretRef:\n                                      description: |-\n                                        secretRef references to the secret for ScaleIO user and other\n                                        sensitive information. If this is not provided, Login operation will fail.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    sslEnabled:\n                                      description: sslEnabled Flag enable/disable\n                                        SSL communication with Gateway, default false\n                                      type: boolean\n                                    storageMode:\n                                      description: |-\n                                        storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                        Default is ThinProvisioned.\n                                      type: string\n                                    storagePool:\n                                      description: storagePool is the ScaleIO Storage\n                                        Pool associated with the protection domain.\n                                      type: string\n                                    system:\n                                      description: system is the name of the storage\n                                        system as configured in ScaleIO.\n                                      type: string\n                                    volumeName:\n                                      description: |-\n                                        volumeName is the name of a volume already created in the ScaleIO system\n                                        that is associated with this volume source.\n                                      type: string\n                                  required:\n                                  - gateway\n                                  - secretRef\n                                  - system\n                                  type: object\n                                secret:\n                                  description: |-\n                                    secret represents a secret that should populate this volume.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                  properties:\n                                    defaultMode:\n                                      description: |-\n                                        defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values\n                                        for mode bits. Defaults to 0644.\n                                        Directories within the path are not affected by this setting.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    items:\n                                      description: |-\n                                        items If unspecified, each key-value pair in the Data field of the referenced\n                                        Secret will be projected into the volume as a file whose name is the\n                                        key and content is the value. If specified, the listed keys will be\n                                        projected into the specified paths, and unlisted keys will not be\n                                        present. If a key is specified which is not present in the Secret,\n                                        the volume setup will error unless it is marked optional. Paths must be\n                                        relative and may not contain the '..' path or start with '..'.\n                                      items:\n                                        description: Maps a string key to a path within\n                                          a volume.\n                                        properties:\n                                          key:\n                                            description: key is the key to project.\n                                            type: string\n                                          mode:\n                                            description: |-\n                                              mode is Optional: mode bits used to set permissions on this file.\n                                              Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                              YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                              If not specified, the volume defaultMode will be used.\n                                              This might be in conflict with other options that affect the file\n                                              mode, like fsGroup, and the result can be other mode bits set.\n                                            format: int32\n                                            type: integer\n                                          path:\n                                            description: |-\n                                              path is the relative path of the file to map the key to.\n                                              May not be an absolute path.\n                                              May not contain the path element '..'.\n                                              May not start with the string '..'.\n                                            type: string\n                                        required:\n                                        - key\n                                        - path\n                                        type: object\n                                      type: array\n                                    optional:\n                                      description: optional field specify whether\n                                        the Secret or its keys must be defined\n                                      type: boolean\n                                    secretName:\n                                      description: |-\n                                        secretName is the name of the secret in the pod's namespace to use.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                      type: string\n                                  type: object\n                                storageos:\n                                  description: storageOS represents a StorageOS volume\n                                    attached and mounted on Kubernetes nodes.\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fsType is the filesystem type to mount.\n                                        Must be a filesystem type supported by the host operating system.\n                                        Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        readOnly defaults to false (read/write). ReadOnly here will force\n                                        the ReadOnly setting in VolumeMounts.\n                                      type: boolean\n                                    secretRef:\n                                      description: |-\n                                        secretRef specifies the secret to use for obtaining the StorageOS API\n                                        credentials.  If not specified, default values will be attempted.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    volumeName:\n                                      description: |-\n                                        volumeName is the human-readable name of the StorageOS volume.  Volume\n                                        names are only unique within a namespace.\n                                      type: string\n                                    volumeNamespace:\n                                      description: |-\n                                        volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                        namespace is specified then the Pod's namespace will be used.  This allows the\n                                        Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                        Set VolumeName to any name to override the default behaviour.\n                                        Set to \"default\" if you are not using namespaces within StorageOS.\n                                        Namespaces that do not pre-exist within StorageOS will be created.\n                                      type: string\n                                  type: object\n                                vsphereVolume:\n                                  description: vsphereVolume represents a vSphere\n                                    volume attached and mounted on kubelets host machine\n                                  properties:\n                                    fsType:\n                                      description: |-\n                                        fsType is filesystem type to mount.\n                                        Must be a filesystem type supported by the host operating system.\n                                        Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      type: string\n                                    storagePolicyID:\n                                      description: storagePolicyID is the storage\n                                        Policy Based Management (SPBM) profile ID\n                                        associated with the StoragePolicyName.\n                                      type: string\n                                    storagePolicyName:\n                                      description: storagePolicyName is the storage\n                                        Policy Based Management (SPBM) profile name.\n                                      type: string\n                                    volumePath:\n                                      description: volumePath is the path that identifies\n                                        vSphere volume vmdk\n                                      type: string\n                                  required:\n                                  - volumePath\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    issuer:\n                      description: |-\n                        Specifies the configuration for the TLS certificates issuer.\n                        It allows defining the issuer name and the reference to the secret containing the TLS certificates and key.\n                        The secret should contain the CA certificate, TLS certificate, and private key in the specified keys.\n                        Required when TLS is enabled.\n                      properties:\n                        name:\n                          allOf:\n                          - enum:\n                            - KubeBlocks\n                            - UserProvided\n                          - enum:\n                            - KubeBlocks\n                            - UserProvided\n                          default: KubeBlocks\n                          description: |-\n                            The issuer for TLS certificates.\n                            It only allows two enum values: `KubeBlocks` and `UserProvided`.\n\n\n                            - `KubeBlocks` indicates that the self-signed TLS certificates generated by the KubeBlocks Operator will be used.\n                            - `UserProvided` means that the user is responsible for providing their own CA, Cert, and Key.\n                              In this case, the user-provided CA certificate, server certificate, and private key will be used\n                              for TLS communication.\n                          type: string\n                        secretRef:\n                          description: |-\n                            SecretRef is the reference to the secret that contains user-provided certificates.\n                            It is required when the issuer is set to `UserProvided`.\n                          properties:\n                            ca:\n                              description: Key of CA cert in Secret\n                              type: string\n                            cert:\n                              description: Key of Cert in Secret\n                              type: string\n                            key:\n                              description: Key of TLS private key in Secret\n                              type: string\n                            name:\n                              description: Name of the Secret that contains user-provided\n                                certificates.\n                              type: string\n                          required:\n                          - ca\n                          - cert\n                          - key\n                          - name\n                          type: object\n                      required:\n                      - name\n                      type: object\n                    labels:\n                      additionalProperties:\n                        type: string\n                      description: Specifies Labels to override or add for underlying\n                        Pods, PVCs, Account & TLS Secrets, Services Owned by Component.\n                      type: object\n                    monitor:\n                      description: |-\n                        Deprecated since v0.9\n                        Determines whether metrics exporter information is annotated on the Component's headless Service.\n\n\n                        If set to true, the following annotations will be patched into the Service:\n\n\n                        - \"monitor.kubeblocks.io/path\"\n                        - \"monitor.kubeblocks.io/port\"\n                        - \"monitor.kubeblocks.io/scheme\"\n\n\n                        These annotations allow the Prometheus installed by KubeBlocks to discover and scrape metrics from the exporter.\n                      type: boolean\n                    name:\n                      description: |-\n                        Specifies the Component's name.\n                        It's part of the Service DNS name and must comply with the IANA service naming rule.\n                        The name is optional when ClusterComponentSpec is used as a template (e.g., in `shardingSpec`),\n                        but required otherwise.\n\n\n                        TODO +kubebuilder:validation:XValidation:rule=\"self == oldSelf\",message=\"name is immutable\"\n                      maxLength: 22\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    offlineInstances:\n                      description: |-\n                        Specifies the names of instances to be transitioned to offline status.\n\n\n                        Marking an instance as offline results in the following:\n\n\n                        1. The associated Pod is stopped, and its PersistentVolumeClaim (PVC) is retained for potential\n                           future reuse or data recovery, but it is no longer actively used.\n                        2. The ordinal number assigned to this instance is preserved, ensuring it remains unique\n                           and avoiding conflicts with new instances.\n\n\n                        Setting instances to offline allows for a controlled scale-in process, preserving their data and maintaining\n                        ordinal consistency within the Cluster.\n                        Note that offline instances and their associated resources, such as PVCs, are not automatically deleted.\n                        The administrator must manually manage the cleanup and removal of these resources when they are no longer needed.\n                      items:\n                        type: string\n                      type: array\n                    parallelPodManagementConcurrency:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      description: |-\n                        Controls the concurrency of pods during initial scale up, when replacing pods on nodes,\n                        or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.\n                        The default Concurrency is 100%.\n                      x-kubernetes-int-or-string: true\n                    podUpdatePolicy:\n                      description: |-\n                        PodUpdatePolicy indicates how pods should be updated\n\n\n                        - `StrictInPlace` indicates that only allows in-place upgrades.\n                        Any attempt to modify other fields will be rejected.\n                        - `PreferInPlace` indicates that we will first attempt an in-place upgrade of the Pod.\n                        If that fails, it will fall back to the ReCreate, where pod will be recreated.\n                        Default value is \"PreferInPlace\"\n                      enum:\n                      - StrictInPlace\n                      - PreferInPlace\n                      type: string\n                    replicas:\n                      default: 1\n                      description: Specifies the desired number of replicas in the\n                        Component for enhancing availability and durability, or load\n                        balancing.\n                      format: int32\n                      minimum: 0\n                      type: integer\n                    resources:\n                      description: |-\n                        Specifies the resources required by the Component.\n                        It allows defining the CPU, memory requirements and limits for the Component's containers.\n                      properties:\n                        claims:\n                          description: |-\n                            Claims lists the names of resources, defined in spec.resourceClaims,\n                            that are used by this container.\n\n\n                            This is an alpha field and requires enabling the\n                            DynamicResourceAllocation feature gate.\n\n\n                            This field is immutable. It can only be set for containers.\n                          items:\n                            description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                            properties:\n                              name:\n                                description: |-\n                                  Name must match the name of one entry in pod.spec.resourceClaims of\n                                  the Pod where this field is used. It makes that resource available\n                                  inside a container.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        limits:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Limits describes the maximum amount of compute resources allowed.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                        requests:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Requests describes the minimum amount of compute resources required.\n                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                      type: object\n                      x-kubernetes-preserve-unknown-fields: true\n                    schedulingPolicy:\n                      description: Specifies the scheduling policy for the Component.\n                      properties:\n                        affinity:\n                          description: Specifies a group of affinity scheduling rules\n                            of the Cluster, including NodeAffinity, PodAffinity, and\n                            PodAntiAffinity.\n                          properties:\n                            nodeAffinity:\n                              description: Describes node affinity scheduling rules\n                                for the pod.\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: |-\n                                      An empty preferred scheduling term matches all objects with implicit weight 0\n                                      (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                    properties:\n                                      preference:\n                                        description: A node selector term, associated\n                                          with the corresponding weight.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      weight:\n                                        description: Weight associated with matching\n                                          the corresponding nodeSelectorTerm, in the\n                                          range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - preference\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to an update), the system\n                                    may or may not try to eventually evict the pod from its node.\n                                  properties:\n                                    nodeSelectorTerms:\n                                      description: Required. A list of node selector\n                                        terms. The terms are ORed.\n                                      items:\n                                        description: |-\n                                          A null or empty node selector term matches no objects. The requirements of\n                                          them are ANDed.\n                                          The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      type: array\n                                  required:\n                                  - nodeSelectorTerms\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                              type: object\n                            podAffinity:\n                              description: Describes pod affinity scheduling rules\n                                (e.g. co-locate this pod in the same node, zone, etc.\n                                as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                            podAntiAffinity:\n                              description: Describes pod anti-affinity scheduling\n                                rules (e.g. avoid putting this pod in the same node,\n                                zone, etc. as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the anti-affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the anti-affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the anti-affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                          type: object\n                        nodeName:\n                          description: |-\n                            NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                            the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                            requirements.\n                          type: string\n                        nodeSelector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            NodeSelector is a selector which must be true for the Pod to fit on a node.\n                            Selector which must match a node's labels for the Pod to be scheduled on that node.\n                            More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        schedulerName:\n                          description: |-\n                            If specified, the Pod will be dispatched by specified scheduler.\n                            If not specified, the Pod will be dispatched by default scheduler.\n                          type: string\n                        tolerations:\n                          description: |-\n                            Allows Pods to be scheduled onto nodes with matching taints.\n                            Each toleration in the array allows the Pod to tolerate node taints based on\n                            specified `key`, `value`, `effect`, and `operator`.\n\n\n                            - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                            - The `operator` determines how the toleration matches the taint.\n\n\n                            Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                          items:\n                            description: |-\n                              The pod this Toleration is attached to tolerates any taint that matches\n                              the triple <key,value,effect> using the matching operator <operator>.\n                            properties:\n                              effect:\n                                description: |-\n                                  Effect indicates the taint effect to match. Empty means match all taint effects.\n                                  When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                type: string\n                              key:\n                                description: |-\n                                  Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                  If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                type: string\n                              operator:\n                                description: |-\n                                  Operator represents a key's relationship to the value.\n                                  Valid operators are Exists and Equal. Defaults to Equal.\n                                  Exists is equivalent to wildcard for value, so that a pod can\n                                  tolerate all taints of a particular category.\n                                type: string\n                              tolerationSeconds:\n                                description: |-\n                                  TolerationSeconds represents the period of time the toleration (which must be\n                                  of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                  it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                  negative values will be treated as 0 (evict immediately) by the system.\n                                format: int64\n                                type: integer\n                              value:\n                                description: |-\n                                  Value is the taint value the toleration matches to.\n                                  If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                type: string\n                            type: object\n                          type: array\n                        topologySpreadConstraints:\n                          description: |-\n                            TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                            domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                            All topologySpreadConstraints are ANDed.\n                          items:\n                            description: TopologySpreadConstraint specifies how to\n                              spread matching pods among the given topology.\n                            properties:\n                              labelSelector:\n                                description: |-\n                                  LabelSelector is used to find matching pods.\n                                  Pods that match this label selector are counted to determine the number of pods\n                                  in their corresponding topology domain.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              matchLabelKeys:\n                                description: |-\n                                  MatchLabelKeys is a set of pod label keys to select the pods over which\n                                  spreading will be calculated. The keys are used to lookup values from the\n                                  incoming pod labels, those key-value labels are ANDed with labelSelector\n                                  to select the group of existing pods over which spreading will be calculated\n                                  for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                  MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                  Keys that don't exist in the incoming pod labels will\n                                  be ignored. A null or empty list means only match against labelSelector.\n\n\n                                  This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              maxSkew:\n                                description: |-\n                                  MaxSkew describes the degree to which pods may be unevenly distributed.\n                                  When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                  between the number of matching pods in the target topology and the global minimum.\n                                  The global minimum is the minimum number of matching pods in an eligible domain\n                                  or zero if the number of eligible domains is less than MinDomains.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 2/2/1:\n                                  In this case, the global minimum is 1.\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |   P   |\n                                  - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                  scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                  violate MaxSkew(1).\n                                  - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                  When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                  to topologies that satisfy it.\n                                  It's a required field. Default value is 1 and 0 is not allowed.\n                                format: int32\n                                type: integer\n                              minDomains:\n                                description: |-\n                                  MinDomains indicates a minimum number of eligible domains.\n                                  When the number of eligible domains with matching topology keys is less than minDomains,\n                                  Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                  And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                  this value has no effect on scheduling.\n                                  As a result, when the number of eligible domains is less than minDomains,\n                                  scheduler won't schedule more than maxSkew Pods to those domains.\n                                  If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                  Valid values are integers greater than 0.\n                                  When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                  For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                  labelSelector spread as 2/2/2:\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |  P P  |\n                                  The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                  In this situation, new pod with the same labelSelector cannot be scheduled,\n                                  because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                  it will violate MaxSkew.\n\n\n                                  This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                format: int32\n                                type: integer\n                              nodeAffinityPolicy:\n                                description: |-\n                                  NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                  when calculating pod topology spread skew. Options are:\n                                  - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                  - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                  If this value is nil, the behavior is equivalent to the Honor policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              nodeTaintsPolicy:\n                                description: |-\n                                  NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                  pod topology spread skew. Options are:\n                                  - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                  has a toleration, are included.\n                                  - Ignore: node taints are ignored. All nodes are included.\n\n\n                                  If this value is nil, the behavior is equivalent to the Ignore policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              topologyKey:\n                                description: |-\n                                  TopologyKey is the key of node labels. Nodes that have a label with this key\n                                  and identical values are considered to be in the same topology.\n                                  We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                  of pods into each bucket.\n                                  We define a domain as a particular instance of a topology.\n                                  Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                  nodeAffinityPolicy and nodeTaintsPolicy.\n                                  e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                  And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                  It's a required field.\n                                type: string\n                              whenUnsatisfiable:\n                                description: |-\n                                  WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                  the spread constraint.\n                                  - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                  - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                    but giving higher precedence to topologies that would help reduce the\n                                    skew.\n                                  A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                  if and only if every possible node assignment for that pod would violate\n                                  \"MaxSkew\" on some topology.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 3/1/1:\n                                  | zone1 | zone2 | zone3 |\n                                  | P P P |   P   |   P   |\n                                  If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                  to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                  MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                  won't make it *more* imbalanced.\n                                  It's a required field.\n                                type: string\n                            required:\n                            - maxSkew\n                            - topologyKey\n                            - whenUnsatisfiable\n                            type: object\n                          type: array\n                      type: object\n                    serviceAccountName:\n                      description: |-\n                        Specifies the name of the ServiceAccount required by the running Component.\n                        This ServiceAccount is used to grant necessary permissions for the Component's Pods to interact\n                        with other Kubernetes resources, such as modifying Pod labels or sending events.\n\n\n                        Defaults:\n                        To perform certain operational tasks, agent sidecars running in Pods require specific RBAC permissions.\n                        The service account will be bound to a default role named \"kubeblocks-cluster-pod-role\" which is installed together with KubeBlocks.\n                        If not specified, KubeBlocks automatically assigns a default ServiceAccount named \"kb-{cluster.name}\"\n\n\n                        Future Changes:\n                        Future versions might change the default ServiceAccount creation strategy to one per Component,\n                        potentially revising the naming to \"kb-{cluster.name}-{component.name}\".\n\n\n                        Users can override the automatic ServiceAccount assignment by explicitly setting the name of\n                        an existed ServiceAccount in this field.\n                      type: string\n                    serviceRefs:\n                      description: |-\n                        Defines a list of ServiceRef for a Component, enabling access to both external services and\n                        Services provided by other Clusters.\n\n\n                        Types of services:\n\n\n                        - External services: Not managed by KubeBlocks or managed by a different KubeBlocks operator;\n                          Require a ServiceDescriptor for connection details.\n                        - Services provided by a Cluster: Managed by the same KubeBlocks operator;\n                          identified using Cluster, Component and Service names.\n\n\n                        ServiceRefs with identical `serviceRef.name` in the same Cluster are considered the same.\n\n\n                        Example:\n                        ```yaml\n                        serviceRefs:\n                          - name: \"redis-sentinel\"\n                            serviceDescriptor:\n                              name: \"external-redis-sentinel\"\n                          - name: \"postgres-cluster\"\n                            clusterServiceSelector:\n                              cluster: \"my-postgres-cluster\"\n                              service:\n                                component: \"postgresql\"\n                        ```\n                        The example above includes ServiceRefs to an external Redis Sentinel service and a PostgreSQL Cluster.\n                      items:\n                        properties:\n                          cluster:\n                            description: |-\n                              Specifies the name of the KubeBlocks Cluster being referenced.\n                              This is used when services from another KubeBlocks Cluster are consumed.\n\n\n                              By default, the referenced KubeBlocks Cluster's `clusterDefinition.spec.connectionCredential`\n                              will be utilized to bind to the current Component. This credential should include:\n                              `endpoint`, `port`, `username`, and `password`.\n\n\n                              Note:\n\n\n                              - The `ServiceKind` and `ServiceVersion` specified in the service reference within the\n                                ClusterDefinition are not validated when using this approach.\n                              - If both `cluster` and `serviceDescriptor` are present, `cluster` will take precedence.\n\n\n                              Deprecated since v0.9 since `clusterDefinition.spec.connectionCredential` is deprecated,\n                              use `clusterServiceSelector` instead.\n                              This field is maintained for backward compatibility and its use is discouraged.\n                              Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                            type: string\n                          clusterServiceSelector:\n                            description: |-\n                              References a service provided by another KubeBlocks Cluster.\n                              It specifies the ClusterService and the account credentials needed for access.\n                            properties:\n                              cluster:\n                                description: The name of the Cluster being referenced.\n                                type: string\n                              credential:\n                                description: |-\n                                  Specifies the SystemAccount to authenticate and establish a connection with the referenced Cluster.\n                                  The SystemAccount should be defined in `componentDefinition.spec.systemAccounts`\n                                  of the Component providing the service in the referenced Cluster.\n                                properties:\n                                  component:\n                                    description: The name of the Component where the\n                                      credential resides in.\n                                    type: string\n                                  name:\n                                    description: The name of the credential (SystemAccount)\n                                      to reference.\n                                    type: string\n                                required:\n                                - component\n                                - name\n                                type: object\n                              service:\n                                description: Identifies a ClusterService from the\n                                  list of Services defined in `cluster.spec.services`\n                                  of the referenced Cluster.\n                                properties:\n                                  component:\n                                    description: |-\n                                      The name of the Component where the Service resides in.\n\n\n                                      It is required when referencing a Component's Service.\n                                    type: string\n                                  port:\n                                    description: |-\n                                      The port name of the Service to be referenced.\n\n\n                                      If there is a non-zero node-port exist for the matched Service port, the node-port will be selected first.\n\n\n                                      If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                      and the resolved value will be presented in the following format: service1.name:port1,service2.name:port2...\n                                    type: string\n                                  service:\n                                    description: |-\n                                      The name of the Service to be referenced.\n\n\n                                      Leave it empty to reference the default Service. Set it to \"headless\" to reference the default headless Service.\n\n\n                                      If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                      and the resolved value will be presented in the following format: service1.name,service2.name...\n                                    type: string\n                                required:\n                                - service\n                                type: object\n                            required:\n                            - cluster\n                            type: object\n                          name:\n                            description: |-\n                              Specifies the identifier of the service reference declaration.\n                              It corresponds to the serviceRefDeclaration name defined in either:\n\n\n                              - `componentDefinition.spec.serviceRefDeclarations[*].name`\n                              - `clusterDefinition.spec.componentDefs[*].serviceRefDeclarations[*].name` (deprecated)\n                            type: string\n                          namespace:\n                            description: |-\n                              Specifies the namespace of the referenced Cluster or the namespace of the referenced ServiceDescriptor object.\n                              If not provided, the referenced Cluster and ServiceDescriptor will be searched in the namespace of the current\n                              Cluster by default.\n                            type: string\n                          serviceDescriptor:\n                            description: |-\n                              Specifies the name of the ServiceDescriptor object that describes a service provided by external sources.\n\n\n                              When referencing a service provided by external sources, a ServiceDescriptor object is required to establish\n                              the service binding.\n                              The `serviceDescriptor.spec.serviceKind` and `serviceDescriptor.spec.serviceVersion` should match the serviceKind\n                              and serviceVersion declared in the definition.\n\n\n                              If both `cluster` and `serviceDescriptor` are specified, the `cluster` takes precedence.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    serviceVersion:\n                      description: |-\n                        ServiceVersion specifies the version of the Service expected to be provisioned by this Component.\n                        The version should follow the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n                        If no version is specified, the latest available version will be used.\n                      maxLength: 32\n                      type: string\n                    services:\n                      description: Overrides services defined in referenced ComponentDefinition\n                        and expose endpoints that can be accessed by clients.\n                      items:\n                        properties:\n                          annotations:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              If ServiceType is LoadBalancer, cloud provider related parameters can be put here.\n                              More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                            type: object\n                          name:\n                            description: References the ComponentService name defined\n                              in the `componentDefinition.spec.services[*].name`.\n                            maxLength: 25\n                            type: string\n                          podService:\n                            default: false\n                            description: |-\n                              Indicates whether to generate individual Services for each Pod.\n                              If set to true, a separate Service will be created for each Pod in the Cluster.\n                            type: boolean\n                          serviceType:\n                            default: ClusterIP\n                            description: |-\n                              Determines how the Service is exposed. Valid options are `ClusterIP`, `NodePort`, and `LoadBalancer`.\n\n\n                              - `ClusterIP` allocates a Cluster-internal IP address for load-balancing to endpoints.\n                                 Endpoints are determined by the selector or if that is not specified,\n                                 they are determined by manual construction of an Endpoints object or EndpointSlice objects.\n                              - `NodePort` builds on ClusterIP and allocates a port on every node which routes to the same endpoints as the ClusterIP.\n                              - `LoadBalancer` builds on NodePort and creates an external load-balancer (if supported in the current cloud)\n                                 which routes to the same endpoints as the ClusterIP.\n\n\n                              Note: although K8s Service type allows the 'ExternalName' type, it is not a valid option for ClusterComponentService.\n\n\n                              For more info, see:\n                              https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types.\n                            enum:\n                            - ClusterIP\n                            - NodePort\n                            - LoadBalancer\n                            type: string\n                            x-kubernetes-preserve-unknown-fields: true\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    stop:\n                      description: |-\n                        Stop the Component.\n                        If set, all the computing resources will be released.\n                      type: boolean\n                    switchPolicy:\n                      description: |-\n                        Defines the strategy for switchover and failover.\n\n\n                        Deprecated since v0.9.\n                        This field is maintained for backward compatibility and its use is discouraged.\n                        Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                      properties:\n                        type:\n                          default: Noop\n                          description: Type specifies the type of switch policy to\n                            be applied.\n                          enum:\n                          - Noop\n                          type: string\n                      type: object\n                    systemAccounts:\n                      description: Overrides system accounts defined in referenced\n                        ComponentDefinition.\n                      items:\n                        properties:\n                          name:\n                            description: The name of the system account.\n                            type: string\n                          passwordConfig:\n                            description: |-\n                              Specifies the policy for generating the account's password.\n\n\n                              This field is immutable once set.\n                            properties:\n                              length:\n                                default: 16\n                                description: The length of the password.\n                                format: int32\n                                maximum: 32\n                                minimum: 8\n                                type: integer\n                              letterCase:\n                                default: MixedCases\n                                description: The case of the letters in the password.\n                                enum:\n                                - LowerCases\n                                - UpperCases\n                                - MixedCases\n                                type: string\n                              numDigits:\n                                default: 4\n                                description: The number of digits in the password.\n                                format: int32\n                                maximum: 8\n                                minimum: 0\n                                type: integer\n                              numSymbols:\n                                default: 0\n                                description: The number of symbols in the password.\n                                format: int32\n                                maximum: 8\n                                minimum: 0\n                                type: integer\n                              seed:\n                                description: |-\n                                  Seed to generate the account's password.\n                                  Cannot be updated.\n                                type: string\n                            type: object\n                          secretRef:\n                            description: |-\n                              Refers to the secret from which data will be copied to create the new account.\n\n\n                              This field is immutable once set.\n                            properties:\n                              name:\n                                description: The unique identifier of the secret.\n                                type: string\n                              namespace:\n                                description: The namespace where the secret is located.\n                                type: string\n                            required:\n                            - name\n                            - namespace\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    tls:\n                      description: |-\n                        A boolean flag that indicates whether the Component should use Transport Layer Security (TLS)\n                        for secure communication.\n                        When set to true, the Component will be configured to use TLS encryption for its network connections.\n                        This ensures that the data transmitted between the Component and its clients or other Components is encrypted\n                        and protected from unauthorized access.\n                        If TLS is enabled, the Component may require additional configuration, such as specifying TLS certificates and keys,\n                        to properly set up the secure communication channel.\n                      type: boolean\n                    tolerations:\n                      description: |-\n                        Allows Pods to be scheduled onto nodes with matching taints.\n                        Each toleration in the array allows the Pod to tolerate node taints based on\n                        specified `key`, `value`, `effect`, and `operator`.\n\n\n                        - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                        - The `operator` determines how the toleration matches the taint.\n\n\n                        Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n\n\n                        Deprecated since v0.10, replaced by the `schedulingPolicy` field.\n                      items:\n                        description: |-\n                          The pod this Toleration is attached to tolerates any taint that matches\n                          the triple <key,value,effect> using the matching operator <operator>.\n                        properties:\n                          effect:\n                            description: |-\n                              Effect indicates the taint effect to match. Empty means match all taint effects.\n                              When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                            type: string\n                          key:\n                            description: |-\n                              Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                              If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                            type: string\n                          operator:\n                            description: |-\n                              Operator represents a key's relationship to the value.\n                              Valid operators are Exists and Equal. Defaults to Equal.\n                              Exists is equivalent to wildcard for value, so that a pod can\n                              tolerate all taints of a particular category.\n                            type: string\n                          tolerationSeconds:\n                            description: |-\n                              TolerationSeconds represents the period of time the toleration (which must be\n                              of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                              it is not set, which means tolerate the taint forever (do not evict). Zero and\n                              negative values will be treated as 0 (evict immediately) by the system.\n                            format: int64\n                            type: integer\n                          value:\n                            description: |-\n                              Value is the taint value the toleration matches to.\n                              If the operator is Exists, the value should be empty, otherwise just a regular string.\n                            type: string\n                        type: object\n                      type: array\n                      x-kubernetes-preserve-unknown-fields: true\n                    updateStrategy:\n                      description: |-\n                        Defines the update strategy for the Component.\n\n\n                        Deprecated since v0.9.\n                        This field is maintained for backward compatibility and its use is discouraged.\n                        Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                      enum:\n                      - Serial\n                      - BestEffortParallel\n                      - Parallel\n                      type: string\n                    userResourceRefs:\n                      description: |-\n                        Allows users to specify custom ConfigMaps and Secrets to be mounted as volumes\n                        in the Cluster's Pods.\n                        This is useful in scenarios where users need to provide additional resources to the Cluster, such as:\n\n\n                        - Mounting custom scripts or configuration files during Cluster startup.\n                        - Mounting Secrets as volumes to provide sensitive information, like S3 AK/SK, to the Cluster.\n                      properties:\n                        configMapRefs:\n                          description: ConfigMapRefs defines the user-defined ConfigMaps.\n                          items:\n                            description: ConfigMapRef defines a reference to a ConfigMap.\n                            properties:\n                              asVolumeFrom:\n                                description: AsVolumeFrom lists the names of containers\n                                  in which the volume should be mounted.\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-list-type: set\n                              configMap:\n                                description: ConfigMap specifies the ConfigMap to\n                                  be mounted as a volume.\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      ConfigMap will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the ConfigMap,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional specify whether the ConfigMap\n                                      or its keys must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              mountPoint:\n                                description: MountPoint is the filesystem path where\n                                  the volume will be mounted.\n                                maxLength: 256\n                                type: string\n                              name:\n                                description: Name is the name of the referenced ConfigMap\n                                  or Secret object. It must conform to DNS label standards.\n                                maxLength: 63\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                              subPath:\n                                description: SubPath specifies a path within the volume\n                                  from which to mount.\n                                type: string\n                            required:\n                            - configMap\n                            - mountPoint\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        secretRefs:\n                          description: SecretRefs defines the user-defined Secrets.\n                          items:\n                            description: SecretRef defines a reference to a Secret.\n                            properties:\n                              asVolumeFrom:\n                                description: AsVolumeFrom lists the names of containers\n                                  in which the volume should be mounted.\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-list-type: set\n                              mountPoint:\n                                description: MountPoint is the filesystem path where\n                                  the volume will be mounted.\n                                maxLength: 256\n                                type: string\n                              name:\n                                description: Name is the name of the referenced ConfigMap\n                                  or Secret object. It must conform to DNS label standards.\n                                maxLength: 63\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                              secret:\n                                description: Secret specifies the Secret to be mounted\n                                  as a volume.\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values\n                                      for mode bits. Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items If unspecified, each key-value pair in the Data field of the referenced\n                                      Secret will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the Secret,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  optional:\n                                    description: optional field specify whether the\n                                      Secret or its keys must be defined\n                                    type: boolean\n                                  secretName:\n                                    description: |-\n                                      secretName is the name of the secret in the pod's namespace to use.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                    type: string\n                                type: object\n                              subPath:\n                                description: SubPath specifies a path within the volume\n                                  from which to mount.\n                                type: string\n                            required:\n                            - mountPoint\n                            - name\n                            - secret\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                      type: object\n                    volumeClaimTemplates:\n                      description: |-\n                        Specifies a list of PersistentVolumeClaim templates that represent the storage requirements for the Component.\n                        Each template specifies the desired characteristics of a persistent volume, such as storage class,\n                        size, and access modes.\n                        These templates are used to dynamically provision persistent volumes for the Component.\n                      items:\n                        properties:\n                          annotations:\n                            additionalProperties:\n                              type: string\n                            description: Specifies the annotations for the PVC of\n                              the volume.\n                            type: object\n                          labels:\n                            additionalProperties:\n                              type: string\n                            description: Specifies the labels for the PVC of the volume.\n                            type: object\n                          name:\n                            description: |-\n                              Refers to the name of a volumeMount defined in either:\n\n\n                              - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                              - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                              The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                            type: string\n                          spec:\n                            description: |-\n                              Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                              with the mount name specified in the `name` field.\n\n\n                              When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                              defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                            properties:\n                              accessModes:\n                                description: |-\n                                  Contains the desired access modes the volume should have.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-preserve-unknown-fields: true\n                              resources:\n                                description: |-\n                                  Represents the minimum resources the volume should have.\n                                  If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                  are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                properties:\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                                x-kubernetes-preserve-unknown-fields: true\n                              storageClassName:\n                                description: |-\n                                  The name of the StorageClass required by the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                type: string\n                              volumeMode:\n                                description: Defines what type of volume is required\n                                  by the claim, either Block or Filesystem.\n                                type: string\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    volumes:\n                      description: List of volumes to override.\n                      items:\n                        description: Volume represents a named volume in a pod that\n                          may be accessed by any container in the pod.\n                        properties:\n                          awsElasticBlockStore:\n                            description: |-\n                              awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              partition:\n                                description: |-\n                                  partition is the partition in the volume that you want to mount.\n                                  If omitted, the default is to mount by volume name.\n                                  Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                  Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                format: int32\n                                type: integer\n                              readOnly:\n                                description: |-\n                                  readOnly value true will force the readOnly setting in VolumeMounts.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                type: boolean\n                              volumeID:\n                                description: |-\n                                  volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          azureDisk:\n                            description: azureDisk represents an Azure Data Disk mount\n                              on the host and bind mount to the pod.\n                            properties:\n                              cachingMode:\n                                description: 'cachingMode is the Host Caching mode:\n                                  None, Read Only, Read Write.'\n                                type: string\n                              diskName:\n                                description: diskName is the Name of the data disk\n                                  in the blob storage\n                                type: string\n                              diskURI:\n                                description: diskURI is the URI of data disk in the\n                                  blob storage\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType is Filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              kind:\n                                description: 'kind expected values are Shared: multiple\n                                  blob disks per storage account  Dedicated: single\n                                  blob disk per storage account  Managed: azure managed\n                                  data disk (only in managed availability set). defaults\n                                  to shared'\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                            required:\n                            - diskName\n                            - diskURI\n                            type: object\n                          azureFile:\n                            description: azureFile represents an Azure File Service\n                              mount on the host and bind mount to the pod.\n                            properties:\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretName:\n                                description: secretName is the  name of secret that\n                                  contains Azure Storage Account Name and Key\n                                type: string\n                              shareName:\n                                description: shareName is the azure share Name\n                                type: string\n                            required:\n                            - secretName\n                            - shareName\n                            type: object\n                          cephfs:\n                            description: cephFS represents a Ceph FS mount on the\n                              host that shares a pod's lifetime\n                            properties:\n                              monitors:\n                                description: |-\n                                  monitors is Required: Monitors is a collection of Ceph monitors\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                items:\n                                  type: string\n                                type: array\n                              path:\n                                description: 'path is Optional: Used as the mounted\n                                  root, rather than the full Ceph tree, default is\n                                  /'\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: boolean\n                              secretFile:\n                                description: |-\n                                  secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: string\n                              secretRef:\n                                description: |-\n                                  secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              user:\n                                description: |-\n                                  user is optional: User is the rados user name, default is admin\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: string\n                            required:\n                            - monitors\n                            type: object\n                          cinder:\n                            description: |-\n                              cinder represents a cinder volume attached and mounted on kubelets host machine.\n                              More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is optional: points to a secret object containing parameters used to connect\n                                  to OpenStack.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              volumeID:\n                                description: |-\n                                  volumeID used to identify the volume in cinder.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          configMap:\n                            description: configMap represents a configMap that should\n                              populate this volume\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items if unspecified, each key-value pair in the Data field of the referenced\n                                  ConfigMap will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the ConfigMap,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: optional specify whether the ConfigMap\n                                  or its keys must be defined\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          csi:\n                            description: csi (Container Storage Interface) represents\n                              ephemeral storage that is handled by certain external\n                              CSI drivers (Beta feature).\n                            properties:\n                              driver:\n                                description: |-\n                                  driver is the name of the CSI driver that handles this volume.\n                                  Consult with your admin for the correct name as registered in the cluster.\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                  If not provided, the empty value is passed to the associated CSI driver\n                                  which will determine the default filesystem to apply.\n                                type: string\n                              nodePublishSecretRef:\n                                description: |-\n                                  nodePublishSecretRef is a reference to the secret object containing\n                                  sensitive information to pass to the CSI driver to complete the CSI\n                                  NodePublishVolume and NodeUnpublishVolume calls.\n                                  This field is optional, and  may be empty if no secret is required. If the\n                                  secret object contains more than one secret, all secret references are passed.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              readOnly:\n                                description: |-\n                                  readOnly specifies a read-only configuration for the volume.\n                                  Defaults to false (read/write).\n                                type: boolean\n                              volumeAttributes:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  volumeAttributes stores driver-specific properties that are passed to the CSI\n                                  driver. Consult your driver's documentation for supported values.\n                                type: object\n                            required:\n                            - driver\n                            type: object\n                          downwardAPI:\n                            description: downwardAPI represents downward API about\n                              the pod that should populate this volume\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  Optional: mode bits to use on created files by default. Must be a\n                                  Optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: Items is a list of downward API volume\n                                  file\n                                items:\n                                  description: DownwardAPIVolumeFile represents information\n                                    to create the file containing the pod field\n                                  properties:\n                                    fieldRef:\n                                      description: 'Required: Selects a field of the\n                                        pod: only annotations, labels, name and namespace\n                                        are supported.'\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    mode:\n                                      description: |-\n                                        Optional: mode bits used to set permissions on this file, must be an octal value\n                                        between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: 'Required: Path is  the relative\n                                        path name of the file to be created. Must\n                                        not be absolute or contain the ''..'' path.\n                                        Must be utf-8 encoded. The first item of the\n                                        relative path must not start with ''..'''\n                                      type: string\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  required:\n                                  - path\n                                  type: object\n                                type: array\n                            type: object\n                          emptyDir:\n                            description: |-\n                              emptyDir represents a temporary directory that shares a pod's lifetime.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                            properties:\n                              medium:\n                                description: |-\n                                  medium represents what type of storage medium should back this directory.\n                                  The default is \"\" which means to use the node's default medium.\n                                  Must be an empty string (default) or Memory.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                type: string\n                              sizeLimit:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                  The size limit is also applicable for memory medium.\n                                  The maximum usage on memory medium EmptyDir would be the minimum value between\n                                  the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                  The default is nil which means that the limit is undefined.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                            type: object\n                          ephemeral:\n                            description: |-\n                              ephemeral represents a volume that is handled by a cluster storage driver.\n                              The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                              and deleted when the pod is removed.\n\n\n                              Use this if:\n                              a) the volume is only needed while the pod runs,\n                              b) features of normal volumes like restoring from snapshot or capacity\n                                 tracking are needed,\n                              c) the storage driver is specified through a storage class, and\n                              d) the storage driver supports dynamic volume provisioning through\n                                 a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                 information on the connection between this volume type\n                                 and PersistentVolumeClaim).\n\n\n                              Use PersistentVolumeClaim or one of the vendor-specific\n                              APIs for volumes that persist for longer than the lifecycle\n                              of an individual pod.\n\n\n                              Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                              be used that way - see the documentation of the driver for\n                              more information.\n\n\n                              A pod can use both types of ephemeral volumes and\n                              persistent volumes at the same time.\n                            properties:\n                              volumeClaimTemplate:\n                                description: |-\n                                  Will be used to create a stand-alone PVC to provision the volume.\n                                  The pod in which this EphemeralVolumeSource is embedded will be the\n                                  owner of the PVC, i.e. the PVC will be deleted together with the\n                                  pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                  `<volume name>` is the name from the `PodSpec.Volumes` array\n                                  entry. Pod validation will reject the pod if the concatenated name\n                                  is not valid for a PVC (for example, too long).\n\n\n                                  An existing PVC with that name that is not owned by the pod\n                                  will *not* be used for the pod to avoid using an unrelated\n                                  volume by mistake. Starting the pod is then blocked until\n                                  the unrelated PVC is removed. If such a pre-created PVC is\n                                  meant to be used by the pod, the PVC has to updated with an\n                                  owner reference to the pod once the pod exists. Normally\n                                  this should not be necessary, but it may be useful when\n                                  manually reconstructing a broken cluster.\n\n\n                                  This field is read-only and no changes will be made by Kubernetes\n                                  to the PVC after it has been created.\n\n\n                                  Required, must not be nil.\n                                properties:\n                                  metadata:\n                                    description: |-\n                                      May contain labels and annotations that will be copied into the PVC\n                                      when creating it. No other fields are allowed and will be rejected during\n                                      validation.\n                                    properties:\n                                      annotations:\n                                        additionalProperties:\n                                          type: string\n                                        type: object\n                                      finalizers:\n                                        items:\n                                          type: string\n                                        type: array\n                                      labels:\n                                        additionalProperties:\n                                          type: string\n                                        type: object\n                                      name:\n                                        type: string\n                                      namespace:\n                                        type: string\n                                    type: object\n                                  spec:\n                                    description: |-\n                                      The specification for the PersistentVolumeClaim. The entire content is\n                                      copied unchanged into the PVC that gets created from this\n                                      template. The same fields as in a PersistentVolumeClaim\n                                      are also valid here.\n                                    properties:\n                                      accessModes:\n                                        description: |-\n                                          accessModes contains the desired access modes the volume should have.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                        items:\n                                          type: string\n                                        type: array\n                                      dataSource:\n                                        description: |-\n                                          dataSource field can be used to specify either:\n                                          * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                          * An existing PVC (PersistentVolumeClaim)\n                                          If the provisioner or an external controller can support the specified data source,\n                                          it will create a new volume based on the contents of the specified data source.\n                                          When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                          and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                          If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                        properties:\n                                          apiGroup:\n                                            description: |-\n                                              APIGroup is the group for the resource being referenced.\n                                              If APIGroup is not specified, the specified Kind must be in the core API group.\n                                              For any other third-party types, APIGroup is required.\n                                            type: string\n                                          kind:\n                                            description: Kind is the type of resource\n                                              being referenced\n                                            type: string\n                                          name:\n                                            description: Name is the name of resource\n                                              being referenced\n                                            type: string\n                                        required:\n                                        - kind\n                                        - name\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      dataSourceRef:\n                                        description: |-\n                                          dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                          volume is desired. This may be any object from a non-empty API group (non\n                                          core object) or a PersistentVolumeClaim object.\n                                          When this field is specified, volume binding will only succeed if the type of\n                                          the specified object matches some installed volume populator or dynamic\n                                          provisioner.\n                                          This field will replace the functionality of the dataSource field and as such\n                                          if both fields are non-empty, they must have the same value. For backwards\n                                          compatibility, when namespace isn't specified in dataSourceRef,\n                                          both fields (dataSource and dataSourceRef) will be set to the same\n                                          value automatically if one of them is empty and the other is non-empty.\n                                          When namespace is specified in dataSourceRef,\n                                          dataSource isn't set to the same value and must be empty.\n                                          There are three important differences between dataSource and dataSourceRef:\n                                          * While dataSource only allows two specific types of objects, dataSourceRef\n                                            allows any non-core object, as well as PersistentVolumeClaim objects.\n                                          * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                            preserves all values, and generates an error if a disallowed value is\n                                            specified.\n                                          * While dataSource only allows local objects, dataSourceRef allows objects\n                                            in any namespaces.\n                                          (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                          (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                        properties:\n                                          apiGroup:\n                                            description: |-\n                                              APIGroup is the group for the resource being referenced.\n                                              If APIGroup is not specified, the specified Kind must be in the core API group.\n                                              For any other third-party types, APIGroup is required.\n                                            type: string\n                                          kind:\n                                            description: Kind is the type of resource\n                                              being referenced\n                                            type: string\n                                          name:\n                                            description: Name is the name of resource\n                                              being referenced\n                                            type: string\n                                          namespace:\n                                            description: |-\n                                              Namespace is the namespace of resource being referenced\n                                              Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                              (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                            type: string\n                                        required:\n                                        - kind\n                                        - name\n                                        type: object\n                                      resources:\n                                        description: |-\n                                          resources represents the minimum resources the volume should have.\n                                          If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                          that are lower than previous value but must still be higher than capacity recorded in the\n                                          status field of the claim.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                        properties:\n                                          limits:\n                                            additionalProperties:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            description: |-\n                                              Limits describes the maximum amount of compute resources allowed.\n                                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                            type: object\n                                          requests:\n                                            additionalProperties:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            description: |-\n                                              Requests describes the minimum amount of compute resources required.\n                                              If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                              otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                            type: object\n                                        type: object\n                                      selector:\n                                        description: selector is a label query over\n                                          volumes to consider for binding.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      storageClassName:\n                                        description: |-\n                                          storageClassName is the name of the StorageClass required by the claim.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                        type: string\n                                      volumeAttributesClassName:\n                                        description: |-\n                                          volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                          If specified, the CSI driver will create or update the volume with the attributes defined\n                                          in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                          it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                          will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                          If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                          will be set by the persistentvolume controller if it exists.\n                                          If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                          set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                          exists.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                          (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                        type: string\n                                      volumeMode:\n                                        description: |-\n                                          volumeMode defines what type of volume is required by the claim.\n                                          Value of Filesystem is implied when not included in claim spec.\n                                        type: string\n                                      volumeName:\n                                        description: volumeName is the binding reference\n                                          to the PersistentVolume backing this claim.\n                                        type: string\n                                    type: object\n                                required:\n                                - spec\n                                type: object\n                            type: object\n                          fc:\n                            description: fc represents a Fibre Channel resource that\n                              is attached to a kubelet's host machine and then exposed\n                              to the pod.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              lun:\n                                description: 'lun is Optional: FC target lun number'\n                                format: int32\n                                type: integer\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              targetWWNs:\n                                description: 'targetWWNs is Optional: FC target worldwide\n                                  names (WWNs)'\n                                items:\n                                  type: string\n                                type: array\n                              wwids:\n                                description: |-\n                                  wwids Optional: FC volume world wide identifiers (wwids)\n                                  Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          flexVolume:\n                            description: |-\n                              flexVolume represents a generic volume resource that is\n                              provisioned/attached using an exec based plugin.\n                            properties:\n                              driver:\n                                description: driver is the name of the driver to use\n                                  for this volume.\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                type: string\n                              options:\n                                additionalProperties:\n                                  type: string\n                                description: 'options is Optional: this field holds\n                                  extra command options if any.'\n                                type: object\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is Optional: secretRef is reference to the secret object containing\n                                  sensitive information to pass to the plugin scripts. This may be\n                                  empty if no secret object is specified. If the secret object\n                                  contains more than one secret, all secrets are passed to the plugin\n                                  scripts.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            required:\n                            - driver\n                            type: object\n                          flocker:\n                            description: flocker represents a Flocker volume attached\n                              to a kubelet's host machine. This depends on the Flocker\n                              control service being running\n                            properties:\n                              datasetName:\n                                description: |-\n                                  datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                  should be considered as deprecated\n                                type: string\n                              datasetUUID:\n                                description: datasetUUID is the UUID of the dataset.\n                                  This is unique identifier of a Flocker dataset\n                                type: string\n                            type: object\n                          gcePersistentDisk:\n                            description: |-\n                              gcePersistentDisk represents a GCE Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              partition:\n                                description: |-\n                                  partition is the partition in the volume that you want to mount.\n                                  If omitted, the default is to mount by volume name.\n                                  Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                  Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                format: int32\n                                type: integer\n                              pdName:\n                                description: |-\n                                  pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                type: boolean\n                            required:\n                            - pdName\n                            type: object\n                          gitRepo:\n                            description: |-\n                              gitRepo represents a git repository at a particular revision.\n                              DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                              EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                              into the Pod's container.\n                            properties:\n                              directory:\n                                description: |-\n                                  directory is the target directory name.\n                                  Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                  git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                  the subdirectory with the given name.\n                                type: string\n                              repository:\n                                description: repository is the URL\n                                type: string\n                              revision:\n                                description: revision is the commit hash for the specified\n                                  revision.\n                                type: string\n                            required:\n                            - repository\n                            type: object\n                          glusterfs:\n                            description: |-\n                              glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                              More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                            properties:\n                              endpoints:\n                                description: |-\n                                  endpoints is the endpoint name that details Glusterfs topology.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: string\n                              path:\n                                description: |-\n                                  path is the Glusterfs volume path.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                  Defaults to false.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: boolean\n                            required:\n                            - endpoints\n                            - path\n                            type: object\n                          hostPath:\n                            description: |-\n                              hostPath represents a pre-existing file or directory on the host\n                              machine that is directly exposed to the container. This is generally\n                              used for system agents or other privileged things that are allowed\n                              to see the host machine. Most containers will NOT need this.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                              ---\n                              TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                              mount host directories as read/write.\n                            properties:\n                              path:\n                                description: |-\n                                  path of the directory on the host.\n                                  If the path is a symlink, it will follow the link to the real path.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                type: string\n                              type:\n                                description: |-\n                                  type for HostPath Volume\n                                  Defaults to \"\"\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                type: string\n                            required:\n                            - path\n                            type: object\n                          iscsi:\n                            description: |-\n                              iscsi represents an ISCSI Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://examples.k8s.io/volumes/iscsi/README.md\n                            properties:\n                              chapAuthDiscovery:\n                                description: chapAuthDiscovery defines whether support\n                                  iSCSI Discovery CHAP authentication\n                                type: boolean\n                              chapAuthSession:\n                                description: chapAuthSession defines whether support\n                                  iSCSI Session CHAP authentication\n                                type: boolean\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              initiatorName:\n                                description: |-\n                                  initiatorName is the custom iSCSI Initiator Name.\n                                  If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                  <target portal>:<volume name> will be created for the connection.\n                                type: string\n                              iqn:\n                                description: iqn is the target iSCSI Qualified Name.\n                                type: string\n                              iscsiInterface:\n                                description: |-\n                                  iscsiInterface is the interface Name that uses an iSCSI transport.\n                                  Defaults to 'default' (tcp).\n                                type: string\n                              lun:\n                                description: lun represents iSCSI Target Lun number.\n                                format: int32\n                                type: integer\n                              portals:\n                                description: |-\n                                  portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                  is other than default (typically TCP ports 860 and 3260).\n                                items:\n                                  type: string\n                                type: array\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                type: boolean\n                              secretRef:\n                                description: secretRef is the CHAP Secret for iSCSI\n                                  target and initiator authentication\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              targetPortal:\n                                description: |-\n                                  targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                  is other than default (typically TCP ports 860 and 3260).\n                                type: string\n                            required:\n                            - iqn\n                            - lun\n                            - targetPortal\n                            type: object\n                          name:\n                            description: |-\n                              name of the volume.\n                              Must be a DNS_LABEL and unique within the pod.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            type: string\n                          nfs:\n                            description: |-\n                              nfs represents an NFS mount on the host that shares a pod's lifetime\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                            properties:\n                              path:\n                                description: |-\n                                  path that is exported by the NFS server.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the NFS export to be mounted with read-only permissions.\n                                  Defaults to false.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: boolean\n                              server:\n                                description: |-\n                                  server is the hostname or IP address of the NFS server.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: string\n                            required:\n                            - path\n                            - server\n                            type: object\n                          persistentVolumeClaim:\n                            description: |-\n                              persistentVolumeClaimVolumeSource represents a reference to a\n                              PersistentVolumeClaim in the same namespace.\n                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                            properties:\n                              claimName:\n                                description: |-\n                                  claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Will force the ReadOnly setting in VolumeMounts.\n                                  Default false.\n                                type: boolean\n                            required:\n                            - claimName\n                            type: object\n                          photonPersistentDisk:\n                            description: photonPersistentDisk represents a PhotonController\n                              persistent disk attached and mounted on kubelets host\n                              machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              pdID:\n                                description: pdID is the ID that identifies Photon\n                                  Controller persistent disk\n                                type: string\n                            required:\n                            - pdID\n                            type: object\n                          portworxVolume:\n                            description: portworxVolume represents a portworx volume\n                              attached and mounted on kubelets host machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fSType represents the filesystem type to mount\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              volumeID:\n                                description: volumeID uniquely identifies a Portworx\n                                  volume\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          projected:\n                            description: projected items for all in one resources\n                              secrets, configmaps, and downward API\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode are the mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              sources:\n                                description: sources is the list of volume projections\n                                items:\n                                  description: Projection that may be projected along\n                                    with other supported volume types\n                                  properties:\n                                    clusterTrustBundle:\n                                      description: |-\n                                        ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                        of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                        Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                        ClusterTrustBundle objects can either be selected by name, or by the\n                                        combination of signer name and a label selector.\n\n\n                                        Kubelet performs aggressive normalization of the PEM contents written\n                                        into the pod filesystem.  Esoteric PEM features such as inter-block\n                                        comments and block headers are stripped.  Certificates are deduplicated.\n                                        The ordering of certificates within the file is arbitrary, and Kubelet\n                                        may change the order over time.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            Select all ClusterTrustBundles that match this label selector.  Only has\n                                            effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                            interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                            everything\".\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        name:\n                                          description: |-\n                                            Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                            with signerName and labelSelector.\n                                          type: string\n                                        optional:\n                                          description: |-\n                                            If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                            aren't available.  If using name, then the named ClusterTrustBundle is\n                                            allowed not to exist.  If using signerName, then the combination of\n                                            signerName and labelSelector is allowed to match zero\n                                            ClusterTrustBundles.\n                                          type: boolean\n                                        path:\n                                          description: Relative path from the volume\n                                            root to write the bundle.\n                                          type: string\n                                        signerName:\n                                          description: |-\n                                            Select all ClusterTrustBundles that match this signer name.\n                                            Mutually-exclusive with name.  The contents of all selected\n                                            ClusterTrustBundles will be unified and deduplicated.\n                                          type: string\n                                      required:\n                                      - path\n                                      type: object\n                                    configMap:\n                                      description: configMap information about the\n                                        configMap data to project\n                                      properties:\n                                        items:\n                                          description: |-\n                                            items if unspecified, each key-value pair in the Data field of the referenced\n                                            ConfigMap will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the ConfigMap,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: optional specify whether the\n                                            ConfigMap or its keys must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    downwardAPI:\n                                      description: downwardAPI information about the\n                                        downwardAPI data to project\n                                      properties:\n                                        items:\n                                          description: Items is a list of DownwardAPIVolume\n                                            file\n                                          items:\n                                            description: DownwardAPIVolumeFile represents\n                                              information to create the file containing\n                                              the pod field\n                                            properties:\n                                              fieldRef:\n                                                description: 'Required: Selects a\n                                                  field of the pod: only annotations,\n                                                  labels, name and namespace are supported.'\n                                                properties:\n                                                  apiVersion:\n                                                    description: Version of the schema\n                                                      the FieldPath is written in\n                                                      terms of, defaults to \"v1\".\n                                                    type: string\n                                                  fieldPath:\n                                                    description: Path of the field\n                                                      to select in the specified API\n                                                      version.\n                                                    type: string\n                                                required:\n                                                - fieldPath\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              mode:\n                                                description: |-\n                                                  Optional: mode bits used to set permissions on this file, must be an octal value\n                                                  between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: 'Required: Path is  the\n                                                  relative path name of the file to\n                                                  be created. Must not be absolute\n                                                  or contain the ''..'' path. Must\n                                                  be utf-8 encoded. The first item\n                                                  of the relative path must not start\n                                                  with ''..'''\n                                                type: string\n                                              resourceFieldRef:\n                                                description: |-\n                                                  Selects a resource of the container: only resources limits and requests\n                                                  (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                properties:\n                                                  containerName:\n                                                    description: 'Container name:\n                                                      required for volumes, optional\n                                                      for env vars'\n                                                    type: string\n                                                  divisor:\n                                                    anyOf:\n                                                    - type: integer\n                                                    - type: string\n                                                    description: Specifies the output\n                                                      format of the exposed resources,\n                                                      defaults to \"1\"\n                                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                    x-kubernetes-int-or-string: true\n                                                  resource:\n                                                    description: 'Required: resource\n                                                      to select'\n                                                    type: string\n                                                required:\n                                                - resource\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                            required:\n                                            - path\n                                            type: object\n                                          type: array\n                                      type: object\n                                    secret:\n                                      description: secret information about the secret\n                                        data to project\n                                      properties:\n                                        items:\n                                          description: |-\n                                            items if unspecified, each key-value pair in the Data field of the referenced\n                                            Secret will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the Secret,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: optional field specify whether\n                                            the Secret or its key must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    serviceAccountToken:\n                                      description: serviceAccountToken is information\n                                        about the serviceAccountToken data to project\n                                      properties:\n                                        audience:\n                                          description: |-\n                                            audience is the intended audience of the token. A recipient of a token\n                                            must identify itself with an identifier specified in the audience of the\n                                            token, and otherwise should reject the token. The audience defaults to the\n                                            identifier of the apiserver.\n                                          type: string\n                                        expirationSeconds:\n                                          description: |-\n                                            expirationSeconds is the requested duration of validity of the service\n                                            account token. As the token approaches expiration, the kubelet volume\n                                            plugin will proactively rotate the service account token. The kubelet will\n                                            start trying to rotate the token if the token is older than 80 percent of\n                                            its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                            and must be at least 10 minutes.\n                                          format: int64\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the path relative to the mount point of the file to project the\n                                            token into.\n                                          type: string\n                                      required:\n                                      - path\n                                      type: object\n                                  type: object\n                                type: array\n                            type: object\n                          quobyte:\n                            description: quobyte represents a Quobyte mount on the\n                              host that shares a pod's lifetime\n                            properties:\n                              group:\n                                description: |-\n                                  group to map volume access to\n                                  Default is no group\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                  Defaults to false.\n                                type: boolean\n                              registry:\n                                description: |-\n                                  registry represents a single or multiple Quobyte Registry services\n                                  specified as a string as host:port pair (multiple entries are separated with commas)\n                                  which acts as the central registry for volumes\n                                type: string\n                              tenant:\n                                description: |-\n                                  tenant owning the given Quobyte volume in the Backend\n                                  Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                type: string\n                              user:\n                                description: |-\n                                  user to map volume access to\n                                  Defaults to serivceaccount user\n                                type: string\n                              volume:\n                                description: volume is a string that references an\n                                  already created Quobyte volume by name.\n                                type: string\n                            required:\n                            - registry\n                            - volume\n                            type: object\n                          rbd:\n                            description: |-\n                              rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                              More info: https://examples.k8s.io/volumes/rbd/README.md\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              image:\n                                description: |-\n                                  image is the rados image name.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              keyring:\n                                description: |-\n                                  keyring is the path to key ring for RBDUser.\n                                  Default is /etc/ceph/keyring.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              monitors:\n                                description: |-\n                                  monitors is a collection of Ceph monitors.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                items:\n                                  type: string\n                                type: array\n                              pool:\n                                description: |-\n                                  pool is the rados pool name.\n                                  Default is rbd.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is name of the authentication secret for RBDUser. If provided\n                                  overrides keyring.\n                                  Default is nil.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              user:\n                                description: |-\n                                  user is the rados user name.\n                                  Default is admin.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                            required:\n                            - image\n                            - monitors\n                            type: object\n                          scaleIO:\n                            description: scaleIO represents a ScaleIO persistent volume\n                              attached and mounted on Kubernetes nodes.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                  Default is \"xfs\".\n                                type: string\n                              gateway:\n                                description: gateway is the host address of the ScaleIO\n                                  API Gateway.\n                                type: string\n                              protectionDomain:\n                                description: protectionDomain is the name of the ScaleIO\n                                  Protection Domain for the configured storage.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef references to the secret for ScaleIO user and other\n                                  sensitive information. If this is not provided, Login operation will fail.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              sslEnabled:\n                                description: sslEnabled Flag enable/disable SSL communication\n                                  with Gateway, default false\n                                type: boolean\n                              storageMode:\n                                description: |-\n                                  storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                  Default is ThinProvisioned.\n                                type: string\n                              storagePool:\n                                description: storagePool is the ScaleIO Storage Pool\n                                  associated with the protection domain.\n                                type: string\n                              system:\n                                description: system is the name of the storage system\n                                  as configured in ScaleIO.\n                                type: string\n                              volumeName:\n                                description: |-\n                                  volumeName is the name of a volume already created in the ScaleIO system\n                                  that is associated with this volume source.\n                                type: string\n                            required:\n                            - gateway\n                            - secretRef\n                            - system\n                            type: object\n                          secret:\n                            description: |-\n                              secret represents a secret that should populate this volume.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values\n                                  for mode bits. Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items If unspecified, each key-value pair in the Data field of the referenced\n                                  Secret will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the Secret,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              optional:\n                                description: optional field specify whether the Secret\n                                  or its keys must be defined\n                                type: boolean\n                              secretName:\n                                description: |-\n                                  secretName is the name of the secret in the pod's namespace to use.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                type: string\n                            type: object\n                          storageos:\n                            description: storageOS represents a StorageOS volume attached\n                              and mounted on Kubernetes nodes.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef specifies the secret to use for obtaining the StorageOS API\n                                  credentials.  If not specified, default values will be attempted.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              volumeName:\n                                description: |-\n                                  volumeName is the human-readable name of the StorageOS volume.  Volume\n                                  names are only unique within a namespace.\n                                type: string\n                              volumeNamespace:\n                                description: |-\n                                  volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                  namespace is specified then the Pod's namespace will be used.  This allows the\n                                  Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                  Set VolumeName to any name to override the default behaviour.\n                                  Set to \"default\" if you are not using namespaces within StorageOS.\n                                  Namespaces that do not pre-exist within StorageOS will be created.\n                                type: string\n                            type: object\n                          vsphereVolume:\n                            description: vsphereVolume represents a vSphere volume\n                              attached and mounted on kubelets host machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              storagePolicyID:\n                                description: storagePolicyID is the storage Policy\n                                  Based Management (SPBM) profile ID associated with\n                                  the StoragePolicyName.\n                                type: string\n                              storagePolicyName:\n                                description: storagePolicyName is the storage Policy\n                                  Based Management (SPBM) profile name.\n                                type: string\n                              volumePath:\n                                description: volumePath is the path that identifies\n                                  vSphere volume vmdk\n                                type: string\n                            required:\n                            - volumePath\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                  required:\n                  - replicas\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n                x-kubernetes-validations:\n                - message: duplicated component\n                  rule: self.all(x, size(self.filter(c, c.name == x.name)) == 1)\n                - message: two kinds of definition API can not be used simultaneously\n                  rule: self.all(x, size(self.filter(c, has(c.componentDef))) == 0)\n                    || self.all(x, size(self.filter(c, has(c.componentDef))) == size(self))\n              network:\n                description: |-\n                  The configuration of network.\n\n\n                  Deprecated since v0.9.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                properties:\n                  hostNetworkAccessible:\n                    default: false\n                    description: Indicates whether the host network can be accessed.\n                      By default, this is set to false.\n                    type: boolean\n                  publiclyAccessible:\n                    default: false\n                    description: Indicates whether the network is accessible to the\n                      public. By default, this is set to false.\n                    type: boolean\n                type: object\n              replicas:\n                description: |-\n                  Specifies the replicas of the first componentSpec, if the replicas of the first componentSpec is specified,\n                  this value will be ignored.\n\n\n                  Deprecated since v0.9.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                format: int32\n                type: integer\n              resources:\n                description: |-\n                  Specifies the resources of the first componentSpec, if the resources of the first componentSpec is specified,\n                  this value will be ignored.\n\n\n                  Deprecated since v0.9.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                properties:\n                  cpu:\n                    anyOf:\n                    - type: integer\n                    - type: string\n                    description: |-\n                      Specifies the amount of CPU resource the Cluster needs.\n                      For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                    x-kubernetes-int-or-string: true\n                  memory:\n                    anyOf:\n                    - type: integer\n                    - type: string\n                    description: |-\n                      Specifies the amount of memory resource the Cluster needs.\n                      For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                    x-kubernetes-int-or-string: true\n                type: object\n              runtimeClassName:\n                description: Specifies runtimeClassName for all Pods managed by this\n                  Cluster.\n                type: string\n              schedulingPolicy:\n                description: Specifies the scheduling policy for the Cluster.\n                properties:\n                  affinity:\n                    description: Specifies a group of affinity scheduling rules of\n                      the Cluster, including NodeAffinity, PodAffinity, and PodAntiAffinity.\n                    properties:\n                      nodeAffinity:\n                        description: Describes node affinity scheduling rules for\n                          the pod.\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: |-\n                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                              properties:\n                                preference:\n                                  description: A node selector term, associated with\n                                    the corresponding weight.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                weight:\n                                  description: Weight associated with matching the\n                                    corresponding nodeSelectorTerm, in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - preference\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to an update), the system\n                              may or may not try to eventually evict the pod from its node.\n                            properties:\n                              nodeSelectorTerms:\n                                description: Required. A list of node selector terms.\n                                  The terms are ORed.\n                                items:\n                                  description: |-\n                                    A null or empty node selector term matches no objects. The requirements of\n                                    them are ANDed.\n                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                type: array\n                            required:\n                            - nodeSelectorTerms\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                      podAffinity:\n                        description: Describes pod affinity scheduling rules (e.g.\n                          co-locate this pod in the same node, zone, etc. as some\n                          other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                      podAntiAffinity:\n                        description: Describes pod anti-affinity scheduling rules\n                          (e.g. avoid putting this pod in the same node, zone, etc.\n                          as some other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the anti-affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the anti-affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the anti-affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                    type: object\n                  nodeName:\n                    description: |-\n                      NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                      the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                      requirements.\n                    type: string\n                  nodeSelector:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      NodeSelector is a selector which must be true for the Pod to fit on a node.\n                      Selector which must match a node's labels for the Pod to be scheduled on that node.\n                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  schedulerName:\n                    description: |-\n                      If specified, the Pod will be dispatched by specified scheduler.\n                      If not specified, the Pod will be dispatched by default scheduler.\n                    type: string\n                  tolerations:\n                    description: |-\n                      Allows Pods to be scheduled onto nodes with matching taints.\n                      Each toleration in the array allows the Pod to tolerate node taints based on\n                      specified `key`, `value`, `effect`, and `operator`.\n\n\n                      - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                      - The `operator` determines how the toleration matches the taint.\n\n\n                      Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                    items:\n                      description: |-\n                        The pod this Toleration is attached to tolerates any taint that matches\n                        the triple <key,value,effect> using the matching operator <operator>.\n                      properties:\n                        effect:\n                          description: |-\n                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                          type: string\n                        key:\n                          description: |-\n                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                          type: string\n                        operator:\n                          description: |-\n                            Operator represents a key's relationship to the value.\n                            Valid operators are Exists and Equal. Defaults to Equal.\n                            Exists is equivalent to wildcard for value, so that a pod can\n                            tolerate all taints of a particular category.\n                          type: string\n                        tolerationSeconds:\n                          description: |-\n                            TolerationSeconds represents the period of time the toleration (which must be\n                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                            negative values will be treated as 0 (evict immediately) by the system.\n                          format: int64\n                          type: integer\n                        value:\n                          description: |-\n                            Value is the taint value the toleration matches to.\n                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                          type: string\n                      type: object\n                    type: array\n                  topologySpreadConstraints:\n                    description: |-\n                      TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                      domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                      All topologySpreadConstraints are ANDed.\n                    items:\n                      description: TopologySpreadConstraint specifies how to spread\n                        matching pods among the given topology.\n                      properties:\n                        labelSelector:\n                          description: |-\n                            LabelSelector is used to find matching pods.\n                            Pods that match this label selector are counted to determine the number of pods\n                            in their corresponding topology domain.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        matchLabelKeys:\n                          description: |-\n                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                            spreading will be calculated. The keys are used to lookup values from the\n                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                            to select the group of existing pods over which spreading will be calculated\n                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                            Keys that don't exist in the incoming pod labels will\n                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        maxSkew:\n                          description: |-\n                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                            between the number of matching pods in the target topology and the global minimum.\n                            The global minimum is the minimum number of matching pods in an eligible domain\n                            or zero if the number of eligible domains is less than MinDomains.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 2/2/1:\n                            In this case, the global minimum is 1.\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |   P   |\n                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                            violate MaxSkew(1).\n                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                            to topologies that satisfy it.\n                            It's a required field. Default value is 1 and 0 is not allowed.\n                          format: int32\n                          type: integer\n                        minDomains:\n                          description: |-\n                            MinDomains indicates a minimum number of eligible domains.\n                            When the number of eligible domains with matching topology keys is less than minDomains,\n                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                            this value has no effect on scheduling.\n                            As a result, when the number of eligible domains is less than minDomains,\n                            scheduler won't schedule more than maxSkew Pods to those domains.\n                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                            Valid values are integers greater than 0.\n                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                            labelSelector spread as 2/2/2:\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |  P P  |\n                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                            it will violate MaxSkew.\n\n\n                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                          format: int32\n                          type: integer\n                        nodeAffinityPolicy:\n                          description: |-\n                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                            when calculating pod topology spread skew. Options are:\n                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                            If this value is nil, the behavior is equivalent to the Honor policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        nodeTaintsPolicy:\n                          description: |-\n                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                            pod topology spread skew. Options are:\n                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                            has a toleration, are included.\n                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        topologyKey:\n                          description: |-\n                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                            and identical values are considered to be in the same topology.\n                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                            of pods into each bucket.\n                            We define a domain as a particular instance of a topology.\n                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                            nodeAffinityPolicy and nodeTaintsPolicy.\n                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                            It's a required field.\n                          type: string\n                        whenUnsatisfiable:\n                          description: |-\n                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                            the spread constraint.\n                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                              but giving higher precedence to topologies that would help reduce the\n                              skew.\n                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                            if and only if every possible node assignment for that pod would violate\n                            \"MaxSkew\" on some topology.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 3/1/1:\n                            | zone1 | zone2 | zone3 |\n                            | P P P |   P   |   P   |\n                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                            won't make it *more* imbalanced.\n                            It's a required field.\n                          type: string\n                      required:\n                      - maxSkew\n                      - topologyKey\n                      - whenUnsatisfiable\n                      type: object\n                    type: array\n                type: object\n              services:\n                description: |-\n                  Defines a list of additional Services that are exposed by a Cluster.\n                  This field allows Services of selected Components, either from `componentSpecs` or `shardingSpecs` to be exposed,\n                  alongside Services defined with ComponentService.\n\n\n                  Services defined here can be referenced by other clusters using the ServiceRefClusterSelector.\n                items:\n                  description: |-\n                    ClusterService defines a service that is exposed externally, allowing entities outside the cluster to access it.\n                    For example, external applications, or other Clusters.\n                    And another Cluster managed by the same KubeBlocks operator can resolve the address exposed by a ClusterService\n                    using the `serviceRef` field.\n\n\n                    When a Component needs to access another Cluster's ClusterService using the `serviceRef` field,\n                    it must also define the service type and version information in the `componentDefinition.spec.serviceRefDeclarations`\n                    section.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        If ServiceType is LoadBalancer, cloud provider related parameters can be put here\n                        More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                      type: object\n                    componentSelector:\n                      description: |-\n                        Extends the ServiceSpec.Selector by allowing the specification of a component, to be used as a selector for the service.\n                        Note that this and the `shardingSelector` are mutually exclusive and cannot be set simultaneously.\n                      type: string\n                    name:\n                      description: |-\n                        Name defines the name of the service.\n                        otherwise, it indicates the name of the service.\n                        Others can refer to this service by its name. (e.g., connection credential)\n                        Cannot be updated.\n                      maxLength: 25\n                      type: string\n                    roleSelector:\n                      description: \"Extends the above `serviceSpec.selector` by allowing\n                        you to specify defined role as selector for the service.\\nWhen\n                        `roleSelector` is set, it adds a label selector \\\"kubeblocks.io/role:\n                        {roleSelector}\\\"\\nto the `serviceSpec.selector`.\\nExample\n                        usage:\\n\\n\\n\\t  roleSelector: \\\"leader\\\"\\n\\n\\nIn this example,\n                        setting `roleSelector` to \\\"leader\\\" will add a label selector\\n\\\"kubeblocks.io/role:\n                        leader\\\" to the `serviceSpec.selector`.\\nThis means that the\n                        service will select and route traffic to Pods with the label\\n\\\"kubeblocks.io/role\\\"\n                        set to \\\"leader\\\".\\n\\n\\nNote that if `podService` sets to\n                        true, RoleSelector will be ignored.\\nThe `podService` flag\n                        takes precedence over `roleSelector` and generates a service\n                        for each Pod.\"\n                      type: string\n                    serviceName:\n                      description: |-\n                        ServiceName defines the name of the underlying service object.\n                        If not specified, the default service name with different patterns will be used:\n\n\n                        - CLUSTER_NAME: for cluster-level services\n                        - CLUSTER_NAME-COMPONENT_NAME: for component-level services\n\n\n                        Only one default service name is allowed.\n                        Cannot be updated.\n                      maxLength: 25\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    shardingSelector:\n                      description: |-\n                        Extends the ServiceSpec.Selector by allowing the specification of a sharding name, which is defined in\n                        `cluster.spec.shardingSpecs[*].name`, to be used as a selector for the service.\n                        Note that this and the `componentSelector` are mutually exclusive and cannot be set simultaneously.\n                      type: string\n                    spec:\n                      description: |-\n                        Spec defines the behavior of a service.\n                        https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                      properties:\n                        allocateLoadBalancerNodePorts:\n                          description: |-\n                            allocateLoadBalancerNodePorts defines if NodePorts will be automatically\n                            allocated for services with type LoadBalancer.  Default is \"true\". It\n                            may be set to \"false\" if the cluster load-balancer does not rely on\n                            NodePorts.  If the caller requests specific NodePorts (by specifying a\n                            value), those requests will be respected, regardless of this field.\n                            This field may only be set for services with type LoadBalancer and will\n                            be cleared if the type is changed to any other type.\n                          type: boolean\n                        clusterIP:\n                          description: |-\n                            clusterIP is the IP address of the service and is usually assigned\n                            randomly. If an address is specified manually, is in-range (as per\n                            system configuration), and is not in use, it will be allocated to the\n                            service; otherwise creation of the service will fail. This field may not\n                            be changed through updates unless the type field is also being changed\n                            to ExternalName (which requires this field to be blank) or the type\n                            field is being changed from ExternalName (in which case this field may\n                            optionally be specified, as describe above).  Valid values are \"None\",\n                            empty string (\"\"), or a valid IP address. Setting this to \"None\" makes a\n                            \"headless service\" (no virtual IP), which is useful when direct endpoint\n                            connections are preferred and proxying is not required.  Only applies to\n                            types ClusterIP, NodePort, and LoadBalancer. If this field is specified\n                            when creating a Service of type ExternalName, creation will fail. This\n                            field will be wiped when updating a Service to type ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        clusterIPs:\n                          description: |-\n                            ClusterIPs is a list of IP addresses assigned to this service, and are\n                            usually assigned randomly.  If an address is specified manually, is\n                            in-range (as per system configuration), and is not in use, it will be\n                            allocated to the service; otherwise creation of the service will fail.\n                            This field may not be changed through updates unless the type field is\n                            also being changed to ExternalName (which requires this field to be\n                            empty) or the type field is being changed from ExternalName (in which\n                            case this field may optionally be specified, as describe above).  Valid\n                            values are \"None\", empty string (\"\"), or a valid IP address.  Setting\n                            this to \"None\" makes a \"headless service\" (no virtual IP), which is\n                            useful when direct endpoint connections are preferred and proxying is\n                            not required.  Only applies to types ClusterIP, NodePort, and\n                            LoadBalancer. If this field is specified when creating a Service of type\n                            ExternalName, creation will fail. This field will be wiped when updating\n                            a Service to type ExternalName.  If this field is not specified, it will\n                            be initialized from the clusterIP field.  If this field is specified,\n                            clients must ensure that clusterIPs[0] and clusterIP have the same\n                            value.\n\n\n                            This field may hold a maximum of two entries (dual-stack IPs, in either order).\n                            These IPs must correspond to the values of the ipFamilies field. Both\n                            clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        externalIPs:\n                          description: |-\n                            externalIPs is a list of IP addresses for which nodes in the cluster\n                            will also accept traffic for this service.  These IPs are not managed by\n                            Kubernetes.  The user is responsible for ensuring that traffic arrives\n                            at a node with this IP.  A common example is external load-balancers\n                            that are not part of the Kubernetes system.\n                          items:\n                            type: string\n                          type: array\n                        externalName:\n                          description: |-\n                            externalName is the external reference that discovery mechanisms will\n                            return as an alias for this service (e.g. a DNS CNAME record). No\n                            proxying will be involved.  Must be a lowercase RFC-1123 hostname\n                            (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".\n                          type: string\n                        externalTrafficPolicy:\n                          description: |-\n                            externalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on one of the Service's \"externally-facing\" addresses (NodePorts,\n                            ExternalIPs, and LoadBalancer IPs). If set to \"Local\", the proxy will configure\n                            the service in a way that assumes that external load balancers will take care\n                            of balancing the service traffic between nodes, and so each node will deliver\n                            traffic only to the node-local endpoints of the service, without masquerading\n                            the client source IP. (Traffic mistakenly sent to a node with no endpoints will\n                            be dropped.) The default value, \"Cluster\", uses the standard behavior of\n                            routing to all endpoints evenly (possibly modified by topology and other\n                            features). Note that traffic sent to an External IP or LoadBalancer IP from\n                            within the cluster will always get \"Cluster\" semantics, but clients sending to\n                            a NodePort from within the cluster may need to take traffic policy into account\n                            when picking a node.\n                          type: string\n                        healthCheckNodePort:\n                          description: |-\n                            healthCheckNodePort specifies the healthcheck nodePort for the service.\n                            This only applies when type is set to LoadBalancer and\n                            externalTrafficPolicy is set to Local. If a value is specified, is\n                            in-range, and is not in use, it will be used.  If not specified, a value\n                            will be automatically allocated.  External systems (e.g. load-balancers)\n                            can use this port to determine if a given node holds endpoints for this\n                            service or not.  If this field is specified when creating a Service\n                            which does not need it, creation will fail. This field will be wiped\n                            when updating a Service to no longer need it (e.g. changing type).\n                            This field cannot be updated once set.\n                          format: int32\n                          type: integer\n                        internalTrafficPolicy:\n                          description: |-\n                            InternalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on the ClusterIP. If set to \"Local\", the proxy will assume that pods\n                            only want to talk to endpoints of the service on the same node as the pod,\n                            dropping the traffic if there are no local endpoints. The default value,\n                            \"Cluster\", uses the standard behavior of routing to all endpoints evenly\n                            (possibly modified by topology and other features).\n                          type: string\n                        ipFamilies:\n                          description: |-\n                            IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this\n                            service. This field is usually assigned automatically based on cluster\n                            configuration and the ipFamilyPolicy field. If this field is specified\n                            manually, the requested family is available in the cluster,\n                            and ipFamilyPolicy allows it, it will be used; otherwise creation of\n                            the service will fail. This field is conditionally mutable: it allows\n                            for adding or removing a secondary IP family, but it does not allow\n                            changing the primary IP family of the Service. Valid values are \"IPv4\"\n                            and \"IPv6\".  This field only applies to Services of types ClusterIP,\n                            NodePort, and LoadBalancer, and does apply to \"headless\" services.\n                            This field will be wiped when updating a Service to type ExternalName.\n\n\n                            This field may hold a maximum of two entries (dual-stack families, in\n                            either order).  These families must correspond to the values of the\n                            clusterIPs field, if specified. Both clusterIPs and ipFamilies are\n                            governed by the ipFamilyPolicy field.\n                          items:\n                            description: |-\n                              IPFamily represents the IP Family (IPv4 or IPv6). This type is used\n                              to express the family of an IP expressed by a type (e.g. service.spec.ipFamilies).\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        ipFamilyPolicy:\n                          description: |-\n                            IPFamilyPolicy represents the dual-stack-ness requested or required by\n                            this Service. If there is no value provided, then this field will be set\n                            to SingleStack. Services can be \"SingleStack\" (a single IP family),\n                            \"PreferDualStack\" (two IP families on dual-stack configured clusters or\n                            a single IP family on single-stack clusters), or \"RequireDualStack\"\n                            (two IP families on dual-stack configured clusters, otherwise fail). The\n                            ipFamilies and clusterIPs fields depend on the value of this field. This\n                            field will be wiped when updating a service to type ExternalName.\n                          type: string\n                        loadBalancerClass:\n                          description: |-\n                            loadBalancerClass is the class of the load balancer implementation this Service belongs to.\n                            If specified, the value of this field must be a label-style identifier, with an optional prefix,\n                            e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users.\n                            This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load\n                            balancer implementation is used, today this is typically done through the cloud provider integration,\n                            but should apply for any default implementation. If set, it is assumed that a load balancer\n                            implementation is watching for Services with a matching class. Any default load balancer\n                            implementation (e.g. cloud providers) should ignore Services that set this field.\n                            This field can only be set when creating or updating a Service to type 'LoadBalancer'.\n                            Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.\n                          type: string\n                        loadBalancerIP:\n                          description: |-\n                            Only applies to Service Type: LoadBalancer.\n                            This feature depends on whether the underlying cloud-provider supports specifying\n                            the loadBalancerIP when a load balancer is created.\n                            This field will be ignored if the cloud-provider does not support the feature.\n                            Deprecated: This field was under-specified and its meaning varies across implementations.\n                            Using it is non-portable and it may not support dual-stack.\n                            Users are encouraged to use implementation-specific annotations when available.\n                          type: string\n                        loadBalancerSourceRanges:\n                          description: |-\n                            If specified and supported by the platform, this will restrict traffic through the cloud-provider\n                            load-balancer will be restricted to the specified client IPs. This field will be ignored if the\n                            cloud-provider does not support the feature.\"\n                            More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/\n                          items:\n                            type: string\n                          type: array\n                        ports:\n                          description: |-\n                            The list of ports that are exposed by this service.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            description: ServicePort contains information on service's\n                              port.\n                            properties:\n                              appProtocol:\n                                description: |-\n                                  The application protocol for this port.\n                                  This is used as a hint for implementations to offer richer behavior for protocols that they understand.\n                                  This field follows standard Kubernetes label syntax.\n                                  Valid values are either:\n\n\n                                  * Un-prefixed protocol names - reserved for IANA standard service names (as per\n                                  RFC-6335 and https://www.iana.org/assignments/service-names).\n\n\n                                  * Kubernetes-defined prefixed names:\n                                    * 'kubernetes.io/h2c' - HTTP/2 prior knowledge over cleartext as described in https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior-\n                                    * 'kubernetes.io/ws'  - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n                                    * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n\n                                  * Other protocols should use implementation-defined prefixed names such as\n                                  mycompany.com/my-custom-protocol.\n                                type: string\n                              name:\n                                description: |-\n                                  The name of this port within the service. This must be a DNS_LABEL.\n                                  All ports within a ServiceSpec must have unique names. When considering\n                                  the endpoints for a Service, this must match the 'name' field in the\n                                  EndpointPort.\n                                  Optional if only one ServicePort is defined on this service.\n                                type: string\n                              nodePort:\n                                description: |-\n                                  The port on each node on which this service is exposed when type is\n                                  NodePort or LoadBalancer.  Usually assigned by the system. If a value is\n                                  specified, in-range, and not in use it will be used, otherwise the\n                                  operation will fail.  If not specified, a port will be allocated if this\n                                  Service requires one.  If this field is specified when creating a\n                                  Service which does not need it, creation will fail. This field will be\n                                  wiped when updating a Service to no longer need it (e.g. changing type\n                                  from NodePort to ClusterIP).\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n                                format: int32\n                                type: integer\n                              port:\n                                description: The port that will be exposed by this\n                                  service.\n                                format: int32\n                                type: integer\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\".\n                                  Default is TCP.\n                                type: string\n                              targetPort:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Number or name of the port to access on the pods targeted by the service.\n                                  Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.\n                                  If this is a string, it will be looked up as a named port in the\n                                  target Pod's container ports. If this is not specified, the value\n                                  of the 'port' field is used (an identity map).\n                                  This field is ignored for services with clusterIP=None, and should be\n                                  omitted or set equal to the 'port' field.\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service\n                                x-kubernetes-int-or-string: true\n                            required:\n                            - port\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - port\n                          - protocol\n                          x-kubernetes-list-type: map\n                        publishNotReadyAddresses:\n                          description: |-\n                            publishNotReadyAddresses indicates that any agent which deals with endpoints for this\n                            Service should disregard any indications of ready/not-ready.\n                            The primary use case for setting this field is for a StatefulSet's Headless Service to\n                            propagate SRV DNS records for its Pods for the purpose of peer discovery.\n                            The Kubernetes controllers that generate Endpoints and EndpointSlice resources for\n                            Services interpret this to mean that all endpoints are considered \"ready\" even if the\n                            Pods themselves are not. Agents which consume only Kubernetes generated endpoints\n                            through the Endpoints or EndpointSlice resources can safely assume this behavior.\n                          type: boolean\n                        selector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            Route service traffic to pods with label keys and values matching this\n                            selector. If empty or not present, the service is assumed to have an\n                            external process managing its endpoints, which Kubernetes will not\n                            modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.\n                            Ignored if type is ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        sessionAffinity:\n                          description: |-\n                            Supports \"ClientIP\" and \"None\". Used to maintain session affinity.\n                            Enable client IP based session affinity.\n                            Must be ClientIP or None.\n                            Defaults to None.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        sessionAffinityConfig:\n                          description: sessionAffinityConfig contains the configurations\n                            of session affinity.\n                          properties:\n                            clientIP:\n                              description: clientIP contains the configurations of\n                                Client IP based session affinity.\n                              properties:\n                                timeoutSeconds:\n                                  description: |-\n                                    timeoutSeconds specifies the seconds of ClientIP type session sticky time.\n                                    The value must be >0 && <=86400(for 1 day) if ServiceAffinity == \"ClientIP\".\n                                    Default value is 10800(for 3 hours).\n                                  format: int32\n                                  type: integer\n                              type: object\n                          type: object\n                        type:\n                          description: |-\n                            type determines how the Service is exposed. Defaults to ClusterIP. Valid\n                            options are ExternalName, ClusterIP, NodePort, and LoadBalancer.\n                            \"ClusterIP\" allocates a cluster-internal IP address for load-balancing\n                            to endpoints. Endpoints are determined by the selector or if that is not\n                            specified, by manual construction of an Endpoints object or\n                            EndpointSlice objects. If clusterIP is \"None\", no virtual IP is\n                            allocated and the endpoints are published as a set of endpoints rather\n                            than a virtual IP.\n                            \"NodePort\" builds on ClusterIP and allocates a port on every node which\n                            routes to the same endpoints as the clusterIP.\n                            \"LoadBalancer\" builds on NodePort and creates an external load-balancer\n                            (if supported in the current cloud) which routes to the same endpoints\n                            as the clusterIP.\n                            \"ExternalName\" aliases this service to the specified externalName.\n                            Several other fields do not apply to ExternalName services.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types\n                          type: string\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-preserve-unknown-fields: true\n              shardingSpecs:\n                description: |-\n                  Specifies a list of ShardingSpec objects that manage the sharding topology for Cluster Components.\n                  Each ShardingSpec organizes components into shards, with each shard corresponding to a Component.\n                  Components within a shard are all based on a common ClusterComponentSpec template, ensuring uniform configurations.\n\n\n                  This field supports dynamic resharding by facilitating the addition or removal of shards\n                  through the `shards` field in ShardingSpec.\n\n\n                  Note: `shardingSpecs` and `componentSpecs` cannot both be empty; at least one must be defined to configure a Cluster.\n                items:\n                  description: |-\n                    ShardingSpec defines how KubeBlocks manage dynamic provisioned shards.\n                    A typical design pattern for distributed databases is to distribute data across multiple shards,\n                    with each shard consisting of multiple replicas.\n                    Therefore, KubeBlocks supports representing a shard with a Component and dynamically instantiating Components\n                    using a template when shards are added.\n                    When shards are removed, the corresponding Components are also deleted.\n                  properties:\n                    name:\n                      description: |-\n                        Represents the common parent part of all shard names.\n                        This identifier is included as part of the Service DNS name and must comply with IANA service naming rules.\n                        It is used to generate the names of underlying Components following the pattern `$(shardingSpec.name)-$(ShardID)`.\n                        ShardID is a random string that is appended to the Name to generate unique identifiers for each shard.\n                        For example, if the sharding specification name is \"my-shard\" and the ShardID is \"abc\", the resulting Component name\n                        would be \"my-shard-abc\".\n\n\n                        Note that the name defined in Component template(`shardingSpec.template.name`) will be disregarded\n                        when generating the Component names of the shards. The `shardingSpec.name` field takes precedence.\n                      maxLength: 15\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                      x-kubernetes-validations:\n                      - message: name is immutable\n                        rule: self == oldSelf\n                    shards:\n                      description: |-\n                        Specifies the desired number of shards.\n                        Users can declare the desired number of shards through this field.\n                        KubeBlocks dynamically creates and deletes Components based on the difference\n                        between the desired and actual number of shards.\n                        KubeBlocks provides lifecycle management for sharding, including:\n\n\n                        - Executing the postProvision Action defined in the ComponentDefinition when the number of shards increases.\n                          This allows for custom actions to be performed after a new shard is provisioned.\n                        - Executing the preTerminate Action defined in the ComponentDefinition when the number of shards decreases.\n                          This enables custom cleanup or data migration tasks to be executed before a shard is terminated.\n                          Resources and data associated with the corresponding Component will also be deleted.\n                      format: int32\n                      maximum: 2048\n                      minimum: 0\n                      type: integer\n                    template:\n                      description: |-\n                        The template for generating Components for shards, where each shard consists of one Component.\n                        This field is of type ClusterComponentSpec, which encapsulates all the required details and\n                        definitions for creating and managing the Components.\n                        KubeBlocks uses this template to generate a set of identical Components or shards.\n                        All the generated Components will have the same specifications and definitions as specified in the `template` field.\n\n\n                        This allows for the creation of multiple Components with consistent configurations,\n                        enabling sharding and distribution of workloads across Components.\n                      properties:\n                        affinity:\n                          description: |-\n                            Specifies a group of affinity scheduling rules for the Component.\n                            It allows users to control how the Component's Pods are scheduled onto nodes in the K8s cluster.\n\n\n                            Deprecated since v0.10, replaced by the `schedulingPolicy` field.\n                          properties:\n                            nodeLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                Indicates the node labels that must be present on nodes for pods to be scheduled on them.\n                                It is a map where the keys are the label keys and the values are the corresponding label values.\n                                Pods will only be scheduled on nodes that have all the specified labels with the corresponding values.\n\n\n                                For example, if NodeLabels is set to {\"nodeType\": \"ssd\", \"environment\": \"production\"},\n                                pods will only be scheduled on nodes that have both the \"nodeType\" label with value \"ssd\"\n                                and the \"environment\" label with value \"production\".\n\n\n                                This field allows users to control Pod placement based on specific node labels.\n                                It can be used to ensure that Pods are scheduled on nodes with certain characteristics,\n                                such as specific hardware (e.g., SSD), environment (e.g., production, staging),\n                                or any other custom labels assigned to nodes.\n                              type: object\n                            podAntiAffinity:\n                              default: Preferred\n                              description: |-\n                                Specifies the anti-affinity level of Pods within a Component.\n                                It determines how pods should be spread across nodes to improve availability and performance.\n                                It can have the following values: `Preferred` and `Required`.\n                                The default value is `Preferred`.\n                              enum:\n                              - Preferred\n                              - Required\n                              type: string\n                            tenancy:\n                              default: SharedNode\n                              description: |-\n                                Determines the level of resource isolation between Pods.\n                                It can have the following values: `SharedNode` and `DedicatedNode`.\n\n\n                                - SharedNode: Allow that multiple Pods may share the same node, which is the default behavior of K8s.\n                                - DedicatedNode: Each Pod runs on a dedicated node, ensuring that no two Pods share the same node.\n                                  In other words, if a Pod is already running on a node, no other Pods will be scheduled on that node.\n                                  Which provides a higher level of isolation and resource guarantee for Pods.\n\n\n                                 The default value is `SharedNode`.\n                              enum:\n                              - SharedNode\n                              - DedicatedNode\n                              type: string\n                            topologyKeys:\n                              description: |-\n                                Represents the key of node labels used to define the topology domain for Pod anti-affinity\n                                and Pod spread constraints.\n\n\n                                In K8s, a topology domain is a set of nodes that have the same value for a specific label key.\n                                Nodes with labels containing any of the specified TopologyKeys and identical values are considered\n                                to be in the same topology domain.\n\n\n                                Note: The concept of topology in the context of K8s TopologyKeys is different from the concept of\n                                topology in the ClusterDefinition.\n\n\n                                When a Pod has anti-affinity or spread constraints specified, Kubernetes will attempt to schedule the\n                                Pod on nodes with different values for the specified TopologyKeys.\n                                This ensures that Pods are spread across different topology domains, promoting high availability and\n                                reducing the impact of node failures.\n\n\n                                Some well-known label keys, such as `kubernetes.io/hostname` and `topology.kubernetes.io/zone`,\n                                are often used as TopologyKey.\n                                These keys represent the hostname and zone of a node, respectively.\n                                By including these keys in the TopologyKeys list, Pods will be spread across nodes with\n                                different hostnames or zones.\n\n\n                                In addition to the well-known keys, users can also specify custom label keys as TopologyKeys.\n                                This allows for more flexible and custom topology definitions based on the specific needs\n                                of the application or environment.\n\n\n                                The TopologyKeys field is a slice of strings, where each string represents a label key.\n                                The order of the keys in the slice does not matter.\n                              items:\n                                type: string\n                              type: array\n                              x-kubernetes-list-type: set\n                          type: object\n                        annotations:\n                          additionalProperties:\n                            type: string\n                          description: Specifies Annotations to override or add for\n                            underlying Pods, PVCs, Account & TLS Secrets, Services\n                            Owned by Component.\n                          type: object\n                        classDefRef:\n                          description: |-\n                            References the class defined in ComponentClassDefinition.\n\n\n                            Deprecated since v0.9.\n                            This field is maintained for backward compatibility and its use is discouraged.\n                            Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                          properties:\n                            class:\n                              description: Defines the name of the class that is defined\n                                in the ComponentClassDefinition.\n                              type: string\n                            name:\n                              description: Specifies the name of the ComponentClassDefinition.\n                              maxLength: 63\n                              pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                              type: string\n                          required:\n                          - class\n                          type: object\n                        componentDef:\n                          description: |-\n                            Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                            custom resource (CR) that defines the Component's characteristics and behavior.\n\n\n                            If both `componentDefRef` and `componentDef` are provided,\n                            the `componentDef` will take precedence over `componentDefRef`.\n                          maxLength: 64\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                        componentDefRef:\n                          description: |-\n                            References a ClusterComponentDefinition defined in the `clusterDefinition.spec.componentDef` field.\n                            Must comply with the IANA service naming rule.\n\n\n                            Deprecated since v0.9,\n                            because defining Components in `clusterDefinition.spec.componentDef` field has been deprecated.\n                            This field is replaced by the `componentDef` field, use `componentDef` instead.\n                            This field is maintained for backward compatibility and its use is discouraged.\n                            Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n\n\n                            TODO +kubebuilder:validation:XValidation:rule=\"self == oldSelf\",message=\"componentDefRef is immutable\"\n                          maxLength: 22\n                          pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        configs:\n                          description: Specifies the configuration content of a config\n                            template.\n                          items:\n                            description: ClusterComponentConfig represents a config\n                              with its source bound.\n                            properties:\n                              configMap:\n                                description: ConfigMap source for the config.\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      ConfigMap will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the ConfigMap,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional specify whether the ConfigMap\n                                      or its keys must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              name:\n                                description: The name of the config.\n                                type: string\n                            type: object\n                          type: array\n                        disableExporter:\n                          description: |-\n                            Determines whether metrics exporter information is annotated on the Component's headless Service.\n\n\n                            If set to true, the following annotations will not be patched into the Service:\n\n\n                            - \"monitor.kubeblocks.io/path\"\n                            - \"monitor.kubeblocks.io/port\"\n                            - \"monitor.kubeblocks.io/scheme\"\n\n\n                            These annotations allow the Prometheus installed by KubeBlocks to discover and scrape metrics from the exporter.\n                          type: boolean\n                        enabledLogs:\n                          description: |-\n                            Specifies which types of logs should be collected for the Component.\n                            The log types are defined in the `componentDefinition.spec.logConfigs` field with the LogConfig entries.\n\n\n                            The elements in the `enabledLogs` array correspond to the names of the LogConfig entries.\n                            For example, if the `componentDefinition.spec.logConfigs` defines LogConfig entries with\n                            names \"slow_query_log\" and \"error_log\",\n                            you can enable the collection of these logs by including their names in the `enabledLogs` array:\n                            ```yaml\n                            enabledLogs:\n                            - slow_query_log\n                            - error_log\n                            ```\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: set\n                        env:\n                          description: |-\n                            List of environment variables to add.\n                            These environment variables will be placed after the environment variables declared in the Pod.\n                          items:\n                            description: EnvVar represents an environment variable\n                              present in a Container.\n                            properties:\n                              name:\n                                description: Name of the environment variable. Must\n                                  be a C_IDENTIFIER.\n                                type: string\n                              value:\n                                description: |-\n                                  Variable references $(VAR_NAME) are expanded\n                                  using the previously defined environment variables in the container and\n                                  any service environment variables. If a variable cannot be resolved,\n                                  the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                  \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                  Escaped references will never be expanded, regardless of whether the variable\n                                  exists or not.\n                                  Defaults to \"\".\n                                type: string\n                              valueFrom:\n                                description: Source for the environment variable's\n                                  value. Cannot be used if value is not empty.\n                                properties:\n                                  configMapKeyRef:\n                                    description: Selects a key of a ConfigMap.\n                                    properties:\n                                      key:\n                                        description: The key to select.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          or its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  fieldRef:\n                                    description: |-\n                                      Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                      spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  secretKeyRef:\n                                    description: Selects a key of a secret in the\n                                      pod's namespace\n                                    properties:\n                                      key:\n                                        description: The key of the secret to select\n                                          from.  Must be a valid secret key.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret or\n                                          its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        instanceUpdateStrategy:\n                          description: |-\n                            Indicates the InstanceUpdateStrategy that will be\n                            employed to update Pods in the InstanceSet when a revision is made to\n                            Template.\n                          properties:\n                            maxUnavailable:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                The maximum number of pods that can be unavailable during the update.\n                                Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).\n                                Absolute number is calculated from percentage by rounding up. This can not be 0.\n                                Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,\n                                it will be counted towards MaxUnavailable.\n                              x-kubernetes-int-or-string: true\n                            partition:\n                              description: |-\n                                Partition indicates the number of pods that should be updated during a rolling update.\n                                The remaining pods will remain untouched. This is helpful in defining how many pods\n                                should participate in the update process. The update process will follow the order\n                                of pod names in descending lexicographical (dictionary) order. The default value is\n                                ComponentSpec.Replicas (i.e., update all pods).\n                              format: int32\n                              type: integer\n                          type: object\n                        instances:\n                          description: |-\n                            Allows for the customization of configuration values for each instance within a Component.\n                            An instance represent a single replica (Pod and associated K8s resources like PVCs, Services, and ConfigMaps).\n                            While instances typically share a common configuration as defined in the ClusterComponentSpec,\n                            they can require unique settings in various scenarios:\n\n\n                            For example:\n                            - A database Component might require different resource allocations for primary and secondary instances,\n                              with primaries needing more resources.\n                            - During a rolling upgrade, a Component may first update the image for one or a few instances,\n                              and then update the remaining instances after verifying that the updated instances are functioning correctly.\n\n\n                            InstanceTemplate allows for specifying these unique configurations per instance.\n                            Each instance's name is constructed using the pattern: $(component.name)-$(template.name)-$(ordinal),\n                            starting with an ordinal of 0.\n                            It is crucial to maintain unique names for each InstanceTemplate to avoid conflicts.\n\n\n                            The sum of replicas across all InstanceTemplates should not exceed the total number of replicas specified for the Component.\n                            Any remaining replicas will be generated using the default template and will follow the default naming rules.\n                          items:\n                            description: InstanceTemplate allows customization of\n                              individual replica configurations in a Component.\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                                  Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                                type: object\n                              env:\n                                description: |-\n                                  Defines Env to override.\n                                  Add new or override existing envs.\n                                items:\n                                  description: EnvVar represents an environment variable\n                                    present in a Container.\n                                  properties:\n                                    name:\n                                      description: Name of the environment variable.\n                                        Must be a C_IDENTIFIER.\n                                      type: string\n                                    value:\n                                      description: |-\n                                        Variable references $(VAR_NAME) are expanded\n                                        using the previously defined environment variables in the container and\n                                        any service environment variables. If a variable cannot be resolved,\n                                        the reference in the input string will be unchanged. Double $$ are reduced\n                                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                        Escaped references will never be expanded, regardless of whether the variable\n                                        exists or not.\n                                        Defaults to \"\".\n                                      type: string\n                                    valueFrom:\n                                      description: Source for the environment variable's\n                                        value. Cannot be used if value is not empty.\n                                      properties:\n                                        configMapKeyRef:\n                                          description: Selects a key of a ConfigMap.\n                                          properties:\n                                            key:\n                                              description: The key to select.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        fieldRef:\n                                          description: |-\n                                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        secretKeyRef:\n                                          description: Selects a key of a secret in\n                                            the pod's namespace\n                                          properties:\n                                            key:\n                                              description: The key of the secret to\n                                                select from.  Must be a valid secret\n                                                key.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                              image:\n                                description: Specifies an override for the first container's\n                                  image in the Pod.\n                                type: string\n                              labels:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                                  Values for existing keys will be overwritten, and new keys will be added.\n                                type: object\n                              name:\n                                description: |-\n                                  Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                                  This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal\n                                  using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                                  The specified name overrides any default naming conventions or patterns.\n                                maxLength: 54\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                              replicas:\n                                default: 1\n                                description: |-\n                                  Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                                  This field allows setting how many replicated instances of the Component,\n                                  with the specific overrides in the InstanceTemplate, are created.\n                                  The default value is 1. A value of 0 disables instance creation.\n                                format: int32\n                                minimum: 0\n                                type: integer\n                              resources:\n                                description: |-\n                                  Specifies an override for the resource requirements of the first container in the Pod.\n                                  This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                                properties:\n                                  claims:\n                                    description: |-\n                                      Claims lists the names of resources, defined in spec.resourceClaims,\n                                      that are used by this container.\n\n\n                                      This is an alpha field and requires enabling the\n                                      DynamicResourceAllocation feature gate.\n\n\n                                      This field is immutable. It can only be set for containers.\n                                    items:\n                                      description: ResourceClaim references one entry\n                                        in PodSpec.ResourceClaims.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name must match the name of one entry in pod.spec.resourceClaims of\n                                            the Pod where this field is used. It makes that resource available\n                                            inside a container.\n                                          type: string\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - name\n                                    x-kubernetes-list-type: map\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                              schedulingPolicy:\n                                description: Specifies the scheduling policy for the\n                                  Component.\n                                properties:\n                                  affinity:\n                                    description: Specifies a group of affinity scheduling\n                                      rules of the Cluster, including NodeAffinity,\n                                      PodAffinity, and PodAntiAffinity.\n                                    properties:\n                                      nodeAffinity:\n                                        description: Describes node affinity scheduling\n                                          rules for the pod.\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: |-\n                                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                              properties:\n                                                preference:\n                                                  description: A node selector term,\n                                                    associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        labels.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchFields:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        fields.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                weight:\n                                                  description: Weight associated with\n                                                    matching the corresponding nodeSelectorTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - preference\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to an update), the system\n                                              may or may not try to eventually evict the pod from its node.\n                                            properties:\n                                              nodeSelectorTerms:\n                                                description: Required. A list of node\n                                                  selector terms. The terms are ORed.\n                                                items:\n                                                  description: |-\n                                                    A null or empty node selector term matches no objects. The requirements of\n                                                    them are ANDed.\n                                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        labels.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchFields:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        fields.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                type: array\n                                            required:\n                                            - nodeSelectorTerms\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                        type: object\n                                      podAffinity:\n                                        description: Describes pod affinity scheduling\n                                          rules (e.g. co-locate this pod in the same\n                                          node, zone, etc. as some other pod(s)).\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: The weights of all of the\n                                                matched WeightedPodAffinityTerm fields\n                                                are added per-node to find the most\n                                                preferred node(s)\n                                              properties:\n                                                podAffinityTerm:\n                                                  description: Required. A pod affinity\n                                                    term, associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    labelSelector:\n                                                      description: |-\n                                                        A label query over a set of resources, in this case pods.\n                                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    matchLabelKeys:\n                                                      description: |-\n                                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    mismatchLabelKeys:\n                                                      description: |-\n                                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    namespaceSelector:\n                                                      description: |-\n                                                        A label query over the set of namespaces that the term applies to.\n                                                        The term is applied to the union of the namespaces selected by this field\n                                                        and the ones listed in the namespaces field.\n                                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                        An empty selector ({}) matches all namespaces.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    namespaces:\n                                                      description: |-\n                                                        namespaces specifies a static list of namespace names that the term applies to.\n                                                        The term is applied to the union of the namespaces listed in this field\n                                                        and the ones selected by namespaceSelector.\n                                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                    topologyKey:\n                                                      description: |-\n                                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                                        selected pods is running.\n                                                        Empty topologyKey is not allowed.\n                                                      type: string\n                                                  required:\n                                                  - topologyKey\n                                                  type: object\n                                                weight:\n                                                  description: |-\n                                                    weight associated with matching the corresponding podAffinityTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - podAffinityTerm\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to a pod label update), the\n                                              system may or may not try to eventually evict the pod from its node.\n                                              When there are multiple elements, the lists of nodes corresponding to each\n                                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                            items:\n                                              description: |-\n                                                Defines a set of pods (namely those matching the labelSelector\n                                                relative to the given namespace(s)) that this pod should be\n                                                co-located (affinity) or not co-located (anti-affinity) with,\n                                                where co-located is defined as running on a node whose value of\n                                                the label with key <topologyKey> matches that of any node on which\n                                                a pod of the set of pods is running\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            type: array\n                                        type: object\n                                      podAntiAffinity:\n                                        description: Describes pod anti-affinity scheduling\n                                          rules (e.g. avoid putting this pod in the\n                                          same node, zone, etc. as some other pod(s)).\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the anti-affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: The weights of all of the\n                                                matched WeightedPodAffinityTerm fields\n                                                are added per-node to find the most\n                                                preferred node(s)\n                                              properties:\n                                                podAffinityTerm:\n                                                  description: Required. A pod affinity\n                                                    term, associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    labelSelector:\n                                                      description: |-\n                                                        A label query over a set of resources, in this case pods.\n                                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    matchLabelKeys:\n                                                      description: |-\n                                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    mismatchLabelKeys:\n                                                      description: |-\n                                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    namespaceSelector:\n                                                      description: |-\n                                                        A label query over the set of namespaces that the term applies to.\n                                                        The term is applied to the union of the namespaces selected by this field\n                                                        and the ones listed in the namespaces field.\n                                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                        An empty selector ({}) matches all namespaces.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    namespaces:\n                                                      description: |-\n                                                        namespaces specifies a static list of namespace names that the term applies to.\n                                                        The term is applied to the union of the namespaces listed in this field\n                                                        and the ones selected by namespaceSelector.\n                                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                    topologyKey:\n                                                      description: |-\n                                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                                        selected pods is running.\n                                                        Empty topologyKey is not allowed.\n                                                      type: string\n                                                  required:\n                                                  - topologyKey\n                                                  type: object\n                                                weight:\n                                                  description: |-\n                                                    weight associated with matching the corresponding podAffinityTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - podAffinityTerm\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the anti-affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the anti-affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to a pod label update), the\n                                              system may or may not try to eventually evict the pod from its node.\n                                              When there are multiple elements, the lists of nodes corresponding to each\n                                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                            items:\n                                              description: |-\n                                                Defines a set of pods (namely those matching the labelSelector\n                                                relative to the given namespace(s)) that this pod should be\n                                                co-located (affinity) or not co-located (anti-affinity) with,\n                                                where co-located is defined as running on a node whose value of\n                                                the label with key <topologyKey> matches that of any node on which\n                                                a pod of the set of pods is running\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            type: array\n                                        type: object\n                                    type: object\n                                  nodeName:\n                                    description: |-\n                                      NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                                      the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                                      requirements.\n                                    type: string\n                                  nodeSelector:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      NodeSelector is a selector which must be true for the Pod to fit on a node.\n                                      Selector which must match a node's labels for the Pod to be scheduled on that node.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  schedulerName:\n                                    description: |-\n                                      If specified, the Pod will be dispatched by specified scheduler.\n                                      If not specified, the Pod will be dispatched by default scheduler.\n                                    type: string\n                                  tolerations:\n                                    description: |-\n                                      Allows Pods to be scheduled onto nodes with matching taints.\n                                      Each toleration in the array allows the Pod to tolerate node taints based on\n                                      specified `key`, `value`, `effect`, and `operator`.\n\n\n                                      - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                                      - The `operator` determines how the toleration matches the taint.\n\n\n                                      Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                                    items:\n                                      description: |-\n                                        The pod this Toleration is attached to tolerates any taint that matches\n                                        the triple <key,value,effect> using the matching operator <operator>.\n                                      properties:\n                                        effect:\n                                          description: |-\n                                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                          type: string\n                                        key:\n                                          description: |-\n                                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            Operator represents a key's relationship to the value.\n                                            Valid operators are Exists and Equal. Defaults to Equal.\n                                            Exists is equivalent to wildcard for value, so that a pod can\n                                            tolerate all taints of a particular category.\n                                          type: string\n                                        tolerationSeconds:\n                                          description: |-\n                                            TolerationSeconds represents the period of time the toleration (which must be\n                                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                            negative values will be treated as 0 (evict immediately) by the system.\n                                          format: int64\n                                          type: integer\n                                        value:\n                                          description: |-\n                                            Value is the taint value the toleration matches to.\n                                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                          type: string\n                                      type: object\n                                    type: array\n                                  topologySpreadConstraints:\n                                    description: |-\n                                      TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                                      domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                                      All topologySpreadConstraints are ANDed.\n                                    items:\n                                      description: TopologySpreadConstraint specifies\n                                        how to spread matching pods among the given\n                                        topology.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            LabelSelector is used to find matching pods.\n                                            Pods that match this label selector are counted to determine the number of pods\n                                            in their corresponding topology domain.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                                            spreading will be calculated. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                                            to select the group of existing pods over which spreading will be calculated\n                                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            Keys that don't exist in the incoming pod labels will\n                                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        maxSkew:\n                                          description: |-\n                                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                            between the number of matching pods in the target topology and the global minimum.\n                                            The global minimum is the minimum number of matching pods in an eligible domain\n                                            or zero if the number of eligible domains is less than MinDomains.\n                                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                            labelSelector spread as 2/2/1:\n                                            In this case, the global minimum is 1.\n                                            | zone1 | zone2 | zone3 |\n                                            |  P P  |  P P  |   P   |\n                                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                            violate MaxSkew(1).\n                                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                            to topologies that satisfy it.\n                                            It's a required field. Default value is 1 and 0 is not allowed.\n                                          format: int32\n                                          type: integer\n                                        minDomains:\n                                          description: |-\n                                            MinDomains indicates a minimum number of eligible domains.\n                                            When the number of eligible domains with matching topology keys is less than minDomains,\n                                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                            this value has no effect on scheduling.\n                                            As a result, when the number of eligible domains is less than minDomains,\n                                            scheduler won't schedule more than maxSkew Pods to those domains.\n                                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                            Valid values are integers greater than 0.\n                                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                            labelSelector spread as 2/2/2:\n                                            | zone1 | zone2 | zone3 |\n                                            |  P P  |  P P  |  P P  |\n                                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                            it will violate MaxSkew.\n\n\n                                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                          format: int32\n                                          type: integer\n                                        nodeAffinityPolicy:\n                                          description: |-\n                                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                            when calculating pod topology spread skew. Options are:\n                                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                            If this value is nil, the behavior is equivalent to the Honor policy.\n                                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                          type: string\n                                        nodeTaintsPolicy:\n                                          description: |-\n                                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                            pod topology spread skew. Options are:\n                                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                            has a toleration, are included.\n                                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                          type: string\n                                        topologyKey:\n                                          description: |-\n                                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                                            and identical values are considered to be in the same topology.\n                                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                            of pods into each bucket.\n                                            We define a domain as a particular instance of a topology.\n                                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                            nodeAffinityPolicy and nodeTaintsPolicy.\n                                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                            It's a required field.\n                                          type: string\n                                        whenUnsatisfiable:\n                                          description: |-\n                                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                            the spread constraint.\n                                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                              but giving higher precedence to topologies that would help reduce the\n                                              skew.\n                                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                            if and only if every possible node assignment for that pod would violate\n                                            \"MaxSkew\" on some topology.\n                                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                            labelSelector spread as 3/1/1:\n                                            | zone1 | zone2 | zone3 |\n                                            | P P P |   P   |   P   |\n                                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                            won't make it *more* imbalanced.\n                                            It's a required field.\n                                          type: string\n                                      required:\n                                      - maxSkew\n                                      - topologyKey\n                                      - whenUnsatisfiable\n                                      type: object\n                                    type: array\n                                type: object\n                              volumeClaimTemplates:\n                                description: |-\n                                  Defines VolumeClaimTemplates to override.\n                                  Add new or override existing volume claim templates.\n                                items:\n                                  properties:\n                                    annotations:\n                                      additionalProperties:\n                                        type: string\n                                      description: Specifies the annotations for the\n                                        PVC of the volume.\n                                      type: object\n                                    labels:\n                                      additionalProperties:\n                                        type: string\n                                      description: Specifies the labels for the PVC\n                                        of the volume.\n                                      type: object\n                                    name:\n                                      description: |-\n                                        Refers to the name of a volumeMount defined in either:\n\n\n                                        - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                                        - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                                        The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                                      type: string\n                                    spec:\n                                      description: |-\n                                        Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                                        with the mount name specified in the `name` field.\n\n\n                                        When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                                        defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                                      properties:\n                                        accessModes:\n                                          description: |-\n                                            Contains the desired access modes the volume should have.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-preserve-unknown-fields: true\n                                        resources:\n                                          description: |-\n                                            Represents the minimum resources the volume should have.\n                                            If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                            are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                          properties:\n                                            limits:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Limits describes the maximum amount of compute resources allowed.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                            requests:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Requests describes the minimum amount of compute resources required.\n                                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                          type: object\n                                          x-kubernetes-preserve-unknown-fields: true\n                                        storageClassName:\n                                          description: |-\n                                            The name of the StorageClass required by the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                          type: string\n                                        volumeMode:\n                                          description: Defines what type of volume\n                                            is required by the claim, either Block\n                                            or Filesystem.\n                                          type: string\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                              volumeMounts:\n                                description: |-\n                                  Defines VolumeMounts to override.\n                                  Add new or override existing volume mounts of the first container in the Pod.\n                                items:\n                                  description: VolumeMount describes a mounting of\n                                    a Volume within a container.\n                                  properties:\n                                    mountPath:\n                                      description: |-\n                                        Path within the container at which the volume should be mounted.  Must\n                                        not contain ':'.\n                                      type: string\n                                    mountPropagation:\n                                      description: |-\n                                        mountPropagation determines how mounts are propagated from the host\n                                        to container and the other way around.\n                                        When not set, MountPropagationNone is used.\n                                        This field is beta in 1.10.\n                                      type: string\n                                    name:\n                                      description: This must match the Name of a Volume.\n                                      type: string\n                                    readOnly:\n                                      description: |-\n                                        Mounted read-only if true, read-write otherwise (false or unspecified).\n                                        Defaults to false.\n                                      type: boolean\n                                    subPath:\n                                      description: |-\n                                        Path within the volume from which the container's volume should be mounted.\n                                        Defaults to \"\" (volume's root).\n                                      type: string\n                                    subPathExpr:\n                                      description: |-\n                                        Expanded path within the volume from which the container's volume should be mounted.\n                                        Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                        Defaults to \"\" (volume's root).\n                                        SubPathExpr and SubPath are mutually exclusive.\n                                      type: string\n                                  required:\n                                  - mountPath\n                                  - name\n                                  type: object\n                                type: array\n                              volumes:\n                                description: |-\n                                  Defines Volumes to override.\n                                  Add new or override existing volumes.\n                                items:\n                                  description: Volume represents a named volume in\n                                    a pod that may be accessed by any container in\n                                    the pod.\n                                  properties:\n                                    awsElasticBlockStore:\n                                      description: |-\n                                        awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                                        kubelet's host machine and then exposed to the pod.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fsType is the filesystem type of the volume that you want to mount.\n                                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                                          type: string\n                                        partition:\n                                          description: |-\n                                            partition is the partition in the volume that you want to mount.\n                                            If omitted, the default is to mount by volume name.\n                                            Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                            Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                          format: int32\n                                          type: integer\n                                        readOnly:\n                                          description: |-\n                                            readOnly value true will force the readOnly setting in VolumeMounts.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                          type: boolean\n                                        volumeID:\n                                          description: |-\n                                            volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                          type: string\n                                      required:\n                                      - volumeID\n                                      type: object\n                                    azureDisk:\n                                      description: azureDisk represents an Azure Data\n                                        Disk mount on the host and bind mount to the\n                                        pod.\n                                      properties:\n                                        cachingMode:\n                                          description: 'cachingMode is the Host Caching\n                                            mode: None, Read Only, Read Write.'\n                                          type: string\n                                        diskName:\n                                          description: diskName is the Name of the\n                                            data disk in the blob storage\n                                          type: string\n                                        diskURI:\n                                          description: diskURI is the URI of data\n                                            disk in the blob storage\n                                          type: string\n                                        fsType:\n                                          description: |-\n                                            fsType is Filesystem type to mount.\n                                            Must be a filesystem type supported by the host operating system.\n                                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          type: string\n                                        kind:\n                                          description: 'kind expected values are Shared:\n                                            multiple blob disks per storage account  Dedicated:\n                                            single blob disk per storage account  Managed:\n                                            azure managed data disk (only in managed\n                                            availability set). defaults to shared'\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly Defaults to false (read/write). ReadOnly here will force\n                                            the ReadOnly setting in VolumeMounts.\n                                          type: boolean\n                                      required:\n                                      - diskName\n                                      - diskURI\n                                      type: object\n                                    azureFile:\n                                      description: azureFile represents an Azure File\n                                        Service mount on the host and bind mount to\n                                        the pod.\n                                      properties:\n                                        readOnly:\n                                          description: |-\n                                            readOnly defaults to false (read/write). ReadOnly here will force\n                                            the ReadOnly setting in VolumeMounts.\n                                          type: boolean\n                                        secretName:\n                                          description: secretName is the  name of\n                                            secret that contains Azure Storage Account\n                                            Name and Key\n                                          type: string\n                                        shareName:\n                                          description: shareName is the azure share\n                                            Name\n                                          type: string\n                                      required:\n                                      - secretName\n                                      - shareName\n                                      type: object\n                                    cephfs:\n                                      description: cephFS represents a Ceph FS mount\n                                        on the host that shares a pod's lifetime\n                                      properties:\n                                        monitors:\n                                          description: |-\n                                            monitors is Required: Monitors is a collection of Ceph monitors\n                                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                          items:\n                                            type: string\n                                          type: array\n                                        path:\n                                          description: 'path is Optional: Used as\n                                            the mounted root, rather than the full\n                                            Ceph tree, default is /'\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                            the ReadOnly setting in VolumeMounts.\n                                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                          type: boolean\n                                        secretFile:\n                                          description: |-\n                                            secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                          type: string\n                                        secretRef:\n                                          description: |-\n                                            secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        user:\n                                          description: |-\n                                            user is optional: User is the rados user name, default is admin\n                                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                          type: string\n                                      required:\n                                      - monitors\n                                      type: object\n                                    cinder:\n                                      description: |-\n                                        cinder represents a cinder volume attached and mounted on kubelets host machine.\n                                        More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fsType is the filesystem type to mount.\n                                            Must be a filesystem type supported by the host operating system.\n                                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly defaults to false (read/write). ReadOnly here will force\n                                            the ReadOnly setting in VolumeMounts.\n                                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                          type: boolean\n                                        secretRef:\n                                          description: |-\n                                            secretRef is optional: points to a secret object containing parameters used to connect\n                                            to OpenStack.\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        volumeID:\n                                          description: |-\n                                            volumeID used to identify the volume in cinder.\n                                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                          type: string\n                                      required:\n                                      - volumeID\n                                      type: object\n                                    configMap:\n                                      description: configMap represents a configMap\n                                        that should populate this volume\n                                      properties:\n                                        defaultMode:\n                                          description: |-\n                                            defaultMode is optional: mode bits used to set permissions on created files by default.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            Defaults to 0644.\n                                            Directories within the path are not affected by this setting.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        items:\n                                          description: |-\n                                            items if unspecified, each key-value pair in the Data field of the referenced\n                                            ConfigMap will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the ConfigMap,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: optional specify whether the\n                                            ConfigMap or its keys must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    csi:\n                                      description: csi (Container Storage Interface)\n                                        represents ephemeral storage that is handled\n                                        by certain external CSI drivers (Beta feature).\n                                      properties:\n                                        driver:\n                                          description: |-\n                                            driver is the name of the CSI driver that handles this volume.\n                                            Consult with your admin for the correct name as registered in the cluster.\n                                          type: string\n                                        fsType:\n                                          description: |-\n                                            fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                            If not provided, the empty value is passed to the associated CSI driver\n                                            which will determine the default filesystem to apply.\n                                          type: string\n                                        nodePublishSecretRef:\n                                          description: |-\n                                            nodePublishSecretRef is a reference to the secret object containing\n                                            sensitive information to pass to the CSI driver to complete the CSI\n                                            NodePublishVolume and NodeUnpublishVolume calls.\n                                            This field is optional, and  may be empty if no secret is required. If the\n                                            secret object contains more than one secret, all secret references are passed.\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        readOnly:\n                                          description: |-\n                                            readOnly specifies a read-only configuration for the volume.\n                                            Defaults to false (read/write).\n                                          type: boolean\n                                        volumeAttributes:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            volumeAttributes stores driver-specific properties that are passed to the CSI\n                                            driver. Consult your driver's documentation for supported values.\n                                          type: object\n                                      required:\n                                      - driver\n                                      type: object\n                                    downwardAPI:\n                                      description: downwardAPI represents downward\n                                        API about the pod that should populate this\n                                        volume\n                                      properties:\n                                        defaultMode:\n                                          description: |-\n                                            Optional: mode bits to use on created files by default. Must be a\n                                            Optional: mode bits used to set permissions on created files by default.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            Defaults to 0644.\n                                            Directories within the path are not affected by this setting.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        items:\n                                          description: Items is a list of downward\n                                            API volume file\n                                          items:\n                                            description: DownwardAPIVolumeFile represents\n                                              information to create the file containing\n                                              the pod field\n                                            properties:\n                                              fieldRef:\n                                                description: 'Required: Selects a\n                                                  field of the pod: only annotations,\n                                                  labels, name and namespace are supported.'\n                                                properties:\n                                                  apiVersion:\n                                                    description: Version of the schema\n                                                      the FieldPath is written in\n                                                      terms of, defaults to \"v1\".\n                                                    type: string\n                                                  fieldPath:\n                                                    description: Path of the field\n                                                      to select in the specified API\n                                                      version.\n                                                    type: string\n                                                required:\n                                                - fieldPath\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              mode:\n                                                description: |-\n                                                  Optional: mode bits used to set permissions on this file, must be an octal value\n                                                  between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: 'Required: Path is  the\n                                                  relative path name of the file to\n                                                  be created. Must not be absolute\n                                                  or contain the ''..'' path. Must\n                                                  be utf-8 encoded. The first item\n                                                  of the relative path must not start\n                                                  with ''..'''\n                                                type: string\n                                              resourceFieldRef:\n                                                description: |-\n                                                  Selects a resource of the container: only resources limits and requests\n                                                  (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                properties:\n                                                  containerName:\n                                                    description: 'Container name:\n                                                      required for volumes, optional\n                                                      for env vars'\n                                                    type: string\n                                                  divisor:\n                                                    anyOf:\n                                                    - type: integer\n                                                    - type: string\n                                                    description: Specifies the output\n                                                      format of the exposed resources,\n                                                      defaults to \"1\"\n                                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                    x-kubernetes-int-or-string: true\n                                                  resource:\n                                                    description: 'Required: resource\n                                                      to select'\n                                                    type: string\n                                                required:\n                                                - resource\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                            required:\n                                            - path\n                                            type: object\n                                          type: array\n                                      type: object\n                                    emptyDir:\n                                      description: |-\n                                        emptyDir represents a temporary directory that shares a pod's lifetime.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                      properties:\n                                        medium:\n                                          description: |-\n                                            medium represents what type of storage medium should back this directory.\n                                            The default is \"\" which means to use the node's default medium.\n                                            Must be an empty string (default) or Memory.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                          type: string\n                                        sizeLimit:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                            The size limit is also applicable for memory medium.\n                                            The maximum usage on memory medium EmptyDir would be the minimum value between\n                                            the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                            The default is nil which means that the limit is undefined.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                      type: object\n                                    ephemeral:\n                                      description: |-\n                                        ephemeral represents a volume that is handled by a cluster storage driver.\n                                        The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                                        and deleted when the pod is removed.\n\n\n                                        Use this if:\n                                        a) the volume is only needed while the pod runs,\n                                        b) features of normal volumes like restoring from snapshot or capacity\n                                           tracking are needed,\n                                        c) the storage driver is specified through a storage class, and\n                                        d) the storage driver supports dynamic volume provisioning through\n                                           a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                           information on the connection between this volume type\n                                           and PersistentVolumeClaim).\n\n\n                                        Use PersistentVolumeClaim or one of the vendor-specific\n                                        APIs for volumes that persist for longer than the lifecycle\n                                        of an individual pod.\n\n\n                                        Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                                        be used that way - see the documentation of the driver for\n                                        more information.\n\n\n                                        A pod can use both types of ephemeral volumes and\n                                        persistent volumes at the same time.\n                                      properties:\n                                        volumeClaimTemplate:\n                                          description: |-\n                                            Will be used to create a stand-alone PVC to provision the volume.\n                                            The pod in which this EphemeralVolumeSource is embedded will be the\n                                            owner of the PVC, i.e. the PVC will be deleted together with the\n                                            pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                            `<volume name>` is the name from the `PodSpec.Volumes` array\n                                            entry. Pod validation will reject the pod if the concatenated name\n                                            is not valid for a PVC (for example, too long).\n\n\n                                            An existing PVC with that name that is not owned by the pod\n                                            will *not* be used for the pod to avoid using an unrelated\n                                            volume by mistake. Starting the pod is then blocked until\n                                            the unrelated PVC is removed. If such a pre-created PVC is\n                                            meant to be used by the pod, the PVC has to updated with an\n                                            owner reference to the pod once the pod exists. Normally\n                                            this should not be necessary, but it may be useful when\n                                            manually reconstructing a broken cluster.\n\n\n                                            This field is read-only and no changes will be made by Kubernetes\n                                            to the PVC after it has been created.\n\n\n                                            Required, must not be nil.\n                                          properties:\n                                            metadata:\n                                              description: |-\n                                                May contain labels and annotations that will be copied into the PVC\n                                                when creating it. No other fields are allowed and will be rejected during\n                                                validation.\n                                              properties:\n                                                annotations:\n                                                  additionalProperties:\n                                                    type: string\n                                                  type: object\n                                                finalizers:\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                labels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  type: object\n                                                name:\n                                                  type: string\n                                                namespace:\n                                                  type: string\n                                              type: object\n                                            spec:\n                                              description: |-\n                                                The specification for the PersistentVolumeClaim. The entire content is\n                                                copied unchanged into the PVC that gets created from this\n                                                template. The same fields as in a PersistentVolumeClaim\n                                                are also valid here.\n                                              properties:\n                                                accessModes:\n                                                  description: |-\n                                                    accessModes contains the desired access modes the volume should have.\n                                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                dataSource:\n                                                  description: |-\n                                                    dataSource field can be used to specify either:\n                                                    * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                                    * An existing PVC (PersistentVolumeClaim)\n                                                    If the provisioner or an external controller can support the specified data source,\n                                                    it will create a new volume based on the contents of the specified data source.\n                                                    When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                                    and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                                    If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                                  properties:\n                                                    apiGroup:\n                                                      description: |-\n                                                        APIGroup is the group for the resource being referenced.\n                                                        If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                        For any other third-party types, APIGroup is required.\n                                                      type: string\n                                                    kind:\n                                                      description: Kind is the type\n                                                        of resource being referenced\n                                                      type: string\n                                                    name:\n                                                      description: Name is the name\n                                                        of resource being referenced\n                                                      type: string\n                                                  required:\n                                                  - kind\n                                                  - name\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                dataSourceRef:\n                                                  description: |-\n                                                    dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                                    volume is desired. This may be any object from a non-empty API group (non\n                                                    core object) or a PersistentVolumeClaim object.\n                                                    When this field is specified, volume binding will only succeed if the type of\n                                                    the specified object matches some installed volume populator or dynamic\n                                                    provisioner.\n                                                    This field will replace the functionality of the dataSource field and as such\n                                                    if both fields are non-empty, they must have the same value. For backwards\n                                                    compatibility, when namespace isn't specified in dataSourceRef,\n                                                    both fields (dataSource and dataSourceRef) will be set to the same\n                                                    value automatically if one of them is empty and the other is non-empty.\n                                                    When namespace is specified in dataSourceRef,\n                                                    dataSource isn't set to the same value and must be empty.\n                                                    There are three important differences between dataSource and dataSourceRef:\n                                                    * While dataSource only allows two specific types of objects, dataSourceRef\n                                                      allows any non-core object, as well as PersistentVolumeClaim objects.\n                                                    * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                                      preserves all values, and generates an error if a disallowed value is\n                                                      specified.\n                                                    * While dataSource only allows local objects, dataSourceRef allows objects\n                                                      in any namespaces.\n                                                    (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                                    (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                                  properties:\n                                                    apiGroup:\n                                                      description: |-\n                                                        APIGroup is the group for the resource being referenced.\n                                                        If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                        For any other third-party types, APIGroup is required.\n                                                      type: string\n                                                    kind:\n                                                      description: Kind is the type\n                                                        of resource being referenced\n                                                      type: string\n                                                    name:\n                                                      description: Name is the name\n                                                        of resource being referenced\n                                                      type: string\n                                                    namespace:\n                                                      description: |-\n                                                        Namespace is the namespace of resource being referenced\n                                                        Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                                        (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                                      type: string\n                                                  required:\n                                                  - kind\n                                                  - name\n                                                  type: object\n                                                resources:\n                                                  description: |-\n                                                    resources represents the minimum resources the volume should have.\n                                                    If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                                    that are lower than previous value but must still be higher than capacity recorded in the\n                                                    status field of the claim.\n                                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                                  properties:\n                                                    limits:\n                                                      additionalProperties:\n                                                        anyOf:\n                                                        - type: integer\n                                                        - type: string\n                                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                        x-kubernetes-int-or-string: true\n                                                      description: |-\n                                                        Limits describes the maximum amount of compute resources allowed.\n                                                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                      type: object\n                                                    requests:\n                                                      additionalProperties:\n                                                        anyOf:\n                                                        - type: integer\n                                                        - type: string\n                                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                        x-kubernetes-int-or-string: true\n                                                      description: |-\n                                                        Requests describes the minimum amount of compute resources required.\n                                                        If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                        otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                      type: object\n                                                  type: object\n                                                selector:\n                                                  description: selector is a label\n                                                    query over volumes to consider\n                                                    for binding.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                storageClassName:\n                                                  description: |-\n                                                    storageClassName is the name of the StorageClass required by the claim.\n                                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                                  type: string\n                                                volumeAttributesClassName:\n                                                  description: |-\n                                                    volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                                    If specified, the CSI driver will create or update the volume with the attributes defined\n                                                    in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                                    it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                                    will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                                    If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                                    will be set by the persistentvolume controller if it exists.\n                                                    If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                                    set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                                    exists.\n                                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                                    (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                                  type: string\n                                                volumeMode:\n                                                  description: |-\n                                                    volumeMode defines what type of volume is required by the claim.\n                                                    Value of Filesystem is implied when not included in claim spec.\n                                                  type: string\n                                                volumeName:\n                                                  description: volumeName is the binding\n                                                    reference to the PersistentVolume\n                                                    backing this claim.\n                                                  type: string\n                                              type: object\n                                          required:\n                                          - spec\n                                          type: object\n                                      type: object\n                                    fc:\n                                      description: fc represents a Fibre Channel resource\n                                        that is attached to a kubelet's host machine\n                                        and then exposed to the pod.\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fsType is the filesystem type to mount.\n                                            Must be a filesystem type supported by the host operating system.\n                                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                                          type: string\n                                        lun:\n                                          description: 'lun is Optional: FC target\n                                            lun number'\n                                          format: int32\n                                          type: integer\n                                        readOnly:\n                                          description: |-\n                                            readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                            the ReadOnly setting in VolumeMounts.\n                                          type: boolean\n                                        targetWWNs:\n                                          description: 'targetWWNs is Optional: FC\n                                            target worldwide names (WWNs)'\n                                          items:\n                                            type: string\n                                          type: array\n                                        wwids:\n                                          description: |-\n                                            wwids Optional: FC volume world wide identifiers (wwids)\n                                            Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    flexVolume:\n                                      description: |-\n                                        flexVolume represents a generic volume resource that is\n                                        provisioned/attached using an exec based plugin.\n                                      properties:\n                                        driver:\n                                          description: driver is the name of the driver\n                                            to use for this volume.\n                                          type: string\n                                        fsType:\n                                          description: |-\n                                            fsType is the filesystem type to mount.\n                                            Must be a filesystem type supported by the host operating system.\n                                            Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                          type: string\n                                        options:\n                                          additionalProperties:\n                                            type: string\n                                          description: 'options is Optional: this\n                                            field holds extra command options if any.'\n                                          type: object\n                                        readOnly:\n                                          description: |-\n                                            readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                            the ReadOnly setting in VolumeMounts.\n                                          type: boolean\n                                        secretRef:\n                                          description: |-\n                                            secretRef is Optional: secretRef is reference to the secret object containing\n                                            sensitive information to pass to the plugin scripts. This may be\n                                            empty if no secret object is specified. If the secret object\n                                            contains more than one secret, all secrets are passed to the plugin\n                                            scripts.\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      required:\n                                      - driver\n                                      type: object\n                                    flocker:\n                                      description: flocker represents a Flocker volume\n                                        attached to a kubelet's host machine. This\n                                        depends on the Flocker control service being\n                                        running\n                                      properties:\n                                        datasetName:\n                                          description: |-\n                                            datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                            should be considered as deprecated\n                                          type: string\n                                        datasetUUID:\n                                          description: datasetUUID is the UUID of\n                                            the dataset. This is unique identifier\n                                            of a Flocker dataset\n                                          type: string\n                                      type: object\n                                    gcePersistentDisk:\n                                      description: |-\n                                        gcePersistentDisk represents a GCE Disk resource that is attached to a\n                                        kubelet's host machine and then exposed to the pod.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fsType is filesystem type of the volume that you want to mount.\n                                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                                          type: string\n                                        partition:\n                                          description: |-\n                                            partition is the partition in the volume that you want to mount.\n                                            If omitted, the default is to mount by volume name.\n                                            Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                            Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                          format: int32\n                                          type: integer\n                                        pdName:\n                                          description: |-\n                                            pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly here will force the ReadOnly setting in VolumeMounts.\n                                            Defaults to false.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                          type: boolean\n                                      required:\n                                      - pdName\n                                      type: object\n                                    gitRepo:\n                                      description: |-\n                                        gitRepo represents a git repository at a particular revision.\n                                        DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                                        EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                                        into the Pod's container.\n                                      properties:\n                                        directory:\n                                          description: |-\n                                            directory is the target directory name.\n                                            Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                            git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                            the subdirectory with the given name.\n                                          type: string\n                                        repository:\n                                          description: repository is the URL\n                                          type: string\n                                        revision:\n                                          description: revision is the commit hash\n                                            for the specified revision.\n                                          type: string\n                                      required:\n                                      - repository\n                                      type: object\n                                    glusterfs:\n                                      description: |-\n                                        glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                                        More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                                      properties:\n                                        endpoints:\n                                          description: |-\n                                            endpoints is the endpoint name that details Glusterfs topology.\n                                            More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                          type: string\n                                        path:\n                                          description: |-\n                                            path is the Glusterfs volume path.\n                                            More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                            Defaults to false.\n                                            More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                          type: boolean\n                                      required:\n                                      - endpoints\n                                      - path\n                                      type: object\n                                    hostPath:\n                                      description: |-\n                                        hostPath represents a pre-existing file or directory on the host\n                                        machine that is directly exposed to the container. This is generally\n                                        used for system agents or other privileged things that are allowed\n                                        to see the host machine. Most containers will NOT need this.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                        ---\n                                        TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                                        mount host directories as read/write.\n                                      properties:\n                                        path:\n                                          description: |-\n                                            path of the directory on the host.\n                                            If the path is a symlink, it will follow the link to the real path.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                          type: string\n                                        type:\n                                          description: |-\n                                            type for HostPath Volume\n                                            Defaults to \"\"\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                          type: string\n                                      required:\n                                      - path\n                                      type: object\n                                    iscsi:\n                                      description: |-\n                                        iscsi represents an ISCSI Disk resource that is attached to a\n                                        kubelet's host machine and then exposed to the pod.\n                                        More info: https://examples.k8s.io/volumes/iscsi/README.md\n                                      properties:\n                                        chapAuthDiscovery:\n                                          description: chapAuthDiscovery defines whether\n                                            support iSCSI Discovery CHAP authentication\n                                          type: boolean\n                                        chapAuthSession:\n                                          description: chapAuthSession defines whether\n                                            support iSCSI Session CHAP authentication\n                                          type: boolean\n                                        fsType:\n                                          description: |-\n                                            fsType is the filesystem type of the volume that you want to mount.\n                                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                                          type: string\n                                        initiatorName:\n                                          description: |-\n                                            initiatorName is the custom iSCSI Initiator Name.\n                                            If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                            <target portal>:<volume name> will be created for the connection.\n                                          type: string\n                                        iqn:\n                                          description: iqn is the target iSCSI Qualified\n                                            Name.\n                                          type: string\n                                        iscsiInterface:\n                                          description: |-\n                                            iscsiInterface is the interface Name that uses an iSCSI transport.\n                                            Defaults to 'default' (tcp).\n                                          type: string\n                                        lun:\n                                          description: lun represents iSCSI Target\n                                            Lun number.\n                                          format: int32\n                                          type: integer\n                                        portals:\n                                          description: |-\n                                            portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                            is other than default (typically TCP ports 860 and 3260).\n                                          items:\n                                            type: string\n                                          type: array\n                                        readOnly:\n                                          description: |-\n                                            readOnly here will force the ReadOnly setting in VolumeMounts.\n                                            Defaults to false.\n                                          type: boolean\n                                        secretRef:\n                                          description: secretRef is the CHAP Secret\n                                            for iSCSI target and initiator authentication\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        targetPortal:\n                                          description: |-\n                                            targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                            is other than default (typically TCP ports 860 and 3260).\n                                          type: string\n                                      required:\n                                      - iqn\n                                      - lun\n                                      - targetPortal\n                                      type: object\n                                    name:\n                                      description: |-\n                                        name of the volume.\n                                        Must be a DNS_LABEL and unique within the pod.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      type: string\n                                    nfs:\n                                      description: |-\n                                        nfs represents an NFS mount on the host that shares a pod's lifetime\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                      properties:\n                                        path:\n                                          description: |-\n                                            path that is exported by the NFS server.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly here will force the NFS export to be mounted with read-only permissions.\n                                            Defaults to false.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                          type: boolean\n                                        server:\n                                          description: |-\n                                            server is the hostname or IP address of the NFS server.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                          type: string\n                                      required:\n                                      - path\n                                      - server\n                                      type: object\n                                    persistentVolumeClaim:\n                                      description: |-\n                                        persistentVolumeClaimVolumeSource represents a reference to a\n                                        PersistentVolumeClaim in the same namespace.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                      properties:\n                                        claimName:\n                                          description: |-\n                                            claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly Will force the ReadOnly setting in VolumeMounts.\n                                            Default false.\n                                          type: boolean\n                                      required:\n                                      - claimName\n                                      type: object\n                                    photonPersistentDisk:\n                                      description: photonPersistentDisk represents\n                                        a PhotonController persistent disk attached\n                                        and mounted on kubelets host machine\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fsType is the filesystem type to mount.\n                                            Must be a filesystem type supported by the host operating system.\n                                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          type: string\n                                        pdID:\n                                          description: pdID is the ID that identifies\n                                            Photon Controller persistent disk\n                                          type: string\n                                      required:\n                                      - pdID\n                                      type: object\n                                    portworxVolume:\n                                      description: portworxVolume represents a portworx\n                                        volume attached and mounted on kubelets host\n                                        machine\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fSType represents the filesystem type to mount\n                                            Must be a filesystem type supported by the host operating system.\n                                            Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly defaults to false (read/write). ReadOnly here will force\n                                            the ReadOnly setting in VolumeMounts.\n                                          type: boolean\n                                        volumeID:\n                                          description: volumeID uniquely identifies\n                                            a Portworx volume\n                                          type: string\n                                      required:\n                                      - volumeID\n                                      type: object\n                                    projected:\n                                      description: projected items for all in one\n                                        resources secrets, configmaps, and downward\n                                        API\n                                      properties:\n                                        defaultMode:\n                                          description: |-\n                                            defaultMode are the mode bits used to set permissions on created files by default.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            Directories within the path are not affected by this setting.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        sources:\n                                          description: sources is the list of volume\n                                            projections\n                                          items:\n                                            description: Projection that may be projected\n                                              along with other supported volume types\n                                            properties:\n                                              clusterTrustBundle:\n                                                description: |-\n                                                  ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                                  of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                                  Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                                  ClusterTrustBundle objects can either be selected by name, or by the\n                                                  combination of signer name and a label selector.\n\n\n                                                  Kubelet performs aggressive normalization of the PEM contents written\n                                                  into the pod filesystem.  Esoteric PEM features such as inter-block\n                                                  comments and block headers are stripped.  Certificates are deduplicated.\n                                                  The ordering of certificates within the file is arbitrary, and Kubelet\n                                                  may change the order over time.\n                                                properties:\n                                                  labelSelector:\n                                                    description: |-\n                                                      Select all ClusterTrustBundles that match this label selector.  Only has\n                                                      effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                                      interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                                      everything\".\n                                                    properties:\n                                                      matchExpressions:\n                                                        description: matchExpressions\n                                                          is a list of label selector\n                                                          requirements. The requirements\n                                                          are ANDed.\n                                                        items:\n                                                          description: |-\n                                                            A label selector requirement is a selector that contains values, a key, and an operator that\n                                                            relates the key and values.\n                                                          properties:\n                                                            key:\n                                                              description: key is\n                                                                the label key that\n                                                                the selector applies\n                                                                to.\n                                                              type: string\n                                                            operator:\n                                                              description: |-\n                                                                operator represents a key's relationship to a set of values.\n                                                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                              type: string\n                                                            values:\n                                                              description: |-\n                                                                values is an array of string values. If the operator is In or NotIn,\n                                                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                the values array must be empty. This array is replaced during a strategic\n                                                                merge patch.\n                                                              items:\n                                                                type: string\n                                                              type: array\n                                                          required:\n                                                          - key\n                                                          - operator\n                                                          type: object\n                                                        type: array\n                                                      matchLabels:\n                                                        additionalProperties:\n                                                          type: string\n                                                        description: |-\n                                                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                        type: object\n                                                    type: object\n                                                    x-kubernetes-map-type: atomic\n                                                  name:\n                                                    description: |-\n                                                      Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                                      with signerName and labelSelector.\n                                                    type: string\n                                                  optional:\n                                                    description: |-\n                                                      If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                                      aren't available.  If using name, then the named ClusterTrustBundle is\n                                                      allowed not to exist.  If using signerName, then the combination of\n                                                      signerName and labelSelector is allowed to match zero\n                                                      ClusterTrustBundles.\n                                                    type: boolean\n                                                  path:\n                                                    description: Relative path from\n                                                      the volume root to write the\n                                                      bundle.\n                                                    type: string\n                                                  signerName:\n                                                    description: |-\n                                                      Select all ClusterTrustBundles that match this signer name.\n                                                      Mutually-exclusive with name.  The contents of all selected\n                                                      ClusterTrustBundles will be unified and deduplicated.\n                                                    type: string\n                                                required:\n                                                - path\n                                                type: object\n                                              configMap:\n                                                description: configMap information\n                                                  about the configMap data to project\n                                                properties:\n                                                  items:\n                                                    description: |-\n                                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                                      ConfigMap will be projected into the volume as a file whose name is the\n                                                      key and content is the value. If specified, the listed keys will be\n                                                      projected into the specified paths, and unlisted keys will not be\n                                                      present. If a key is specified which is not present in the ConfigMap,\n                                                      the volume setup will error unless it is marked optional. Paths must be\n                                                      relative and may not contain the '..' path or start with '..'.\n                                                    items:\n                                                      description: Maps a string key\n                                                        to a path within a volume.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            key to project.\n                                                          type: string\n                                                        mode:\n                                                          description: |-\n                                                            mode is Optional: mode bits used to set permissions on this file.\n                                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                            If not specified, the volume defaultMode will be used.\n                                                            This might be in conflict with other options that affect the file\n                                                            mode, like fsGroup, and the result can be other mode bits set.\n                                                          format: int32\n                                                          type: integer\n                                                        path:\n                                                          description: |-\n                                                            path is the relative path of the file to map the key to.\n                                                            May not be an absolute path.\n                                                            May not contain the path element '..'.\n                                                            May not start with the string '..'.\n                                                          type: string\n                                                      required:\n                                                      - key\n                                                      - path\n                                                      type: object\n                                                    type: array\n                                                  name:\n                                                    description: |-\n                                                      Name of the referent.\n                                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                                    type: string\n                                                  optional:\n                                                    description: optional specify\n                                                      whether the ConfigMap or its\n                                                      keys must be defined\n                                                    type: boolean\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              downwardAPI:\n                                                description: downwardAPI information\n                                                  about the downwardAPI data to project\n                                                properties:\n                                                  items:\n                                                    description: Items is a list of\n                                                      DownwardAPIVolume file\n                                                    items:\n                                                      description: DownwardAPIVolumeFile\n                                                        represents information to\n                                                        create the file containing\n                                                        the pod field\n                                                      properties:\n                                                        fieldRef:\n                                                          description: 'Required:\n                                                            Selects a field of the\n                                                            pod: only annotations,\n                                                            labels, name and namespace\n                                                            are supported.'\n                                                          properties:\n                                                            apiVersion:\n                                                              description: Version\n                                                                of the schema the\n                                                                FieldPath is written\n                                                                in terms of, defaults\n                                                                to \"v1\".\n                                                              type: string\n                                                            fieldPath:\n                                                              description: Path of\n                                                                the field to select\n                                                                in the specified API\n                                                                version.\n                                                              type: string\n                                                          required:\n                                                          - fieldPath\n                                                          type: object\n                                                          x-kubernetes-map-type: atomic\n                                                        mode:\n                                                          description: |-\n                                                            Optional: mode bits used to set permissions on this file, must be an octal value\n                                                            between 0000 and 0777 or a decimal value between 0 and 511.\n                                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                            If not specified, the volume defaultMode will be used.\n                                                            This might be in conflict with other options that affect the file\n                                                            mode, like fsGroup, and the result can be other mode bits set.\n                                                          format: int32\n                                                          type: integer\n                                                        path:\n                                                          description: 'Required:\n                                                            Path is  the relative\n                                                            path name of the file\n                                                            to be created. Must not\n                                                            be absolute or contain\n                                                            the ''..'' path. Must\n                                                            be utf-8 encoded. The\n                                                            first item of the relative\n                                                            path must not start with\n                                                            ''..'''\n                                                          type: string\n                                                        resourceFieldRef:\n                                                          description: |-\n                                                            Selects a resource of the container: only resources limits and requests\n                                                            (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                          properties:\n                                                            containerName:\n                                                              description: 'Container\n                                                                name: required for\n                                                                volumes, optional\n                                                                for env vars'\n                                                              type: string\n                                                            divisor:\n                                                              anyOf:\n                                                              - type: integer\n                                                              - type: string\n                                                              description: Specifies\n                                                                the output format\n                                                                of the exposed resources,\n                                                                defaults to \"1\"\n                                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                              x-kubernetes-int-or-string: true\n                                                            resource:\n                                                              description: 'Required:\n                                                                resource to select'\n                                                              type: string\n                                                          required:\n                                                          - resource\n                                                          type: object\n                                                          x-kubernetes-map-type: atomic\n                                                      required:\n                                                      - path\n                                                      type: object\n                                                    type: array\n                                                type: object\n                                              secret:\n                                                description: secret information about\n                                                  the secret data to project\n                                                properties:\n                                                  items:\n                                                    description: |-\n                                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                                      Secret will be projected into the volume as a file whose name is the\n                                                      key and content is the value. If specified, the listed keys will be\n                                                      projected into the specified paths, and unlisted keys will not be\n                                                      present. If a key is specified which is not present in the Secret,\n                                                      the volume setup will error unless it is marked optional. Paths must be\n                                                      relative and may not contain the '..' path or start with '..'.\n                                                    items:\n                                                      description: Maps a string key\n                                                        to a path within a volume.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            key to project.\n                                                          type: string\n                                                        mode:\n                                                          description: |-\n                                                            mode is Optional: mode bits used to set permissions on this file.\n                                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                            If not specified, the volume defaultMode will be used.\n                                                            This might be in conflict with other options that affect the file\n                                                            mode, like fsGroup, and the result can be other mode bits set.\n                                                          format: int32\n                                                          type: integer\n                                                        path:\n                                                          description: |-\n                                                            path is the relative path of the file to map the key to.\n                                                            May not be an absolute path.\n                                                            May not contain the path element '..'.\n                                                            May not start with the string '..'.\n                                                          type: string\n                                                      required:\n                                                      - key\n                                                      - path\n                                                      type: object\n                                                    type: array\n                                                  name:\n                                                    description: |-\n                                                      Name of the referent.\n                                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                                    type: string\n                                                  optional:\n                                                    description: optional field specify\n                                                      whether the Secret or its key\n                                                      must be defined\n                                                    type: boolean\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              serviceAccountToken:\n                                                description: serviceAccountToken is\n                                                  information about the serviceAccountToken\n                                                  data to project\n                                                properties:\n                                                  audience:\n                                                    description: |-\n                                                      audience is the intended audience of the token. A recipient of a token\n                                                      must identify itself with an identifier specified in the audience of the\n                                                      token, and otherwise should reject the token. The audience defaults to the\n                                                      identifier of the apiserver.\n                                                    type: string\n                                                  expirationSeconds:\n                                                    description: |-\n                                                      expirationSeconds is the requested duration of validity of the service\n                                                      account token. As the token approaches expiration, the kubelet volume\n                                                      plugin will proactively rotate the service account token. The kubelet will\n                                                      start trying to rotate the token if the token is older than 80 percent of\n                                                      its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                                      and must be at least 10 minutes.\n                                                    format: int64\n                                                    type: integer\n                                                  path:\n                                                    description: |-\n                                                      path is the path relative to the mount point of the file to project the\n                                                      token into.\n                                                    type: string\n                                                required:\n                                                - path\n                                                type: object\n                                            type: object\n                                          type: array\n                                      type: object\n                                    quobyte:\n                                      description: quobyte represents a Quobyte mount\n                                        on the host that shares a pod's lifetime\n                                      properties:\n                                        group:\n                                          description: |-\n                                            group to map volume access to\n                                            Default is no group\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                            Defaults to false.\n                                          type: boolean\n                                        registry:\n                                          description: |-\n                                            registry represents a single or multiple Quobyte Registry services\n                                            specified as a string as host:port pair (multiple entries are separated with commas)\n                                            which acts as the central registry for volumes\n                                          type: string\n                                        tenant:\n                                          description: |-\n                                            tenant owning the given Quobyte volume in the Backend\n                                            Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                          type: string\n                                        user:\n                                          description: |-\n                                            user to map volume access to\n                                            Defaults to serivceaccount user\n                                          type: string\n                                        volume:\n                                          description: volume is a string that references\n                                            an already created Quobyte volume by name.\n                                          type: string\n                                      required:\n                                      - registry\n                                      - volume\n                                      type: object\n                                    rbd:\n                                      description: |-\n                                        rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                                        More info: https://examples.k8s.io/volumes/rbd/README.md\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fsType is the filesystem type of the volume that you want to mount.\n                                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                                          type: string\n                                        image:\n                                          description: |-\n                                            image is the rados image name.\n                                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                          type: string\n                                        keyring:\n                                          description: |-\n                                            keyring is the path to key ring for RBDUser.\n                                            Default is /etc/ceph/keyring.\n                                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                          type: string\n                                        monitors:\n                                          description: |-\n                                            monitors is a collection of Ceph monitors.\n                                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                          items:\n                                            type: string\n                                          type: array\n                                        pool:\n                                          description: |-\n                                            pool is the rados pool name.\n                                            Default is rbd.\n                                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly here will force the ReadOnly setting in VolumeMounts.\n                                            Defaults to false.\n                                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                          type: boolean\n                                        secretRef:\n                                          description: |-\n                                            secretRef is name of the authentication secret for RBDUser. If provided\n                                            overrides keyring.\n                                            Default is nil.\n                                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        user:\n                                          description: |-\n                                            user is the rados user name.\n                                            Default is admin.\n                                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                          type: string\n                                      required:\n                                      - image\n                                      - monitors\n                                      type: object\n                                    scaleIO:\n                                      description: scaleIO represents a ScaleIO persistent\n                                        volume attached and mounted on Kubernetes\n                                        nodes.\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fsType is the filesystem type to mount.\n                                            Must be a filesystem type supported by the host operating system.\n                                            Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                            Default is \"xfs\".\n                                          type: string\n                                        gateway:\n                                          description: gateway is the host address\n                                            of the ScaleIO API Gateway.\n                                          type: string\n                                        protectionDomain:\n                                          description: protectionDomain is the name\n                                            of the ScaleIO Protection Domain for the\n                                            configured storage.\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly Defaults to false (read/write). ReadOnly here will force\n                                            the ReadOnly setting in VolumeMounts.\n                                          type: boolean\n                                        secretRef:\n                                          description: |-\n                                            secretRef references to the secret for ScaleIO user and other\n                                            sensitive information. If this is not provided, Login operation will fail.\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        sslEnabled:\n                                          description: sslEnabled Flag enable/disable\n                                            SSL communication with Gateway, default\n                                            false\n                                          type: boolean\n                                        storageMode:\n                                          description: |-\n                                            storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                            Default is ThinProvisioned.\n                                          type: string\n                                        storagePool:\n                                          description: storagePool is the ScaleIO\n                                            Storage Pool associated with the protection\n                                            domain.\n                                          type: string\n                                        system:\n                                          description: system is the name of the storage\n                                            system as configured in ScaleIO.\n                                          type: string\n                                        volumeName:\n                                          description: |-\n                                            volumeName is the name of a volume already created in the ScaleIO system\n                                            that is associated with this volume source.\n                                          type: string\n                                      required:\n                                      - gateway\n                                      - secretRef\n                                      - system\n                                      type: object\n                                    secret:\n                                      description: |-\n                                        secret represents a secret that should populate this volume.\n                                        More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                      properties:\n                                        defaultMode:\n                                          description: |-\n                                            defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values\n                                            for mode bits. Defaults to 0644.\n                                            Directories within the path are not affected by this setting.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        items:\n                                          description: |-\n                                            items If unspecified, each key-value pair in the Data field of the referenced\n                                            Secret will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the Secret,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        optional:\n                                          description: optional field specify whether\n                                            the Secret or its keys must be defined\n                                          type: boolean\n                                        secretName:\n                                          description: |-\n                                            secretName is the name of the secret in the pod's namespace to use.\n                                            More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                          type: string\n                                      type: object\n                                    storageos:\n                                      description: storageOS represents a StorageOS\n                                        volume attached and mounted on Kubernetes\n                                        nodes.\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fsType is the filesystem type to mount.\n                                            Must be a filesystem type supported by the host operating system.\n                                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            readOnly defaults to false (read/write). ReadOnly here will force\n                                            the ReadOnly setting in VolumeMounts.\n                                          type: boolean\n                                        secretRef:\n                                          description: |-\n                                            secretRef specifies the secret to use for obtaining the StorageOS API\n                                            credentials.  If not specified, default values will be attempted.\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        volumeName:\n                                          description: |-\n                                            volumeName is the human-readable name of the StorageOS volume.  Volume\n                                            names are only unique within a namespace.\n                                          type: string\n                                        volumeNamespace:\n                                          description: |-\n                                            volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                            namespace is specified then the Pod's namespace will be used.  This allows the\n                                            Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                            Set VolumeName to any name to override the default behaviour.\n                                            Set to \"default\" if you are not using namespaces within StorageOS.\n                                            Namespaces that do not pre-exist within StorageOS will be created.\n                                          type: string\n                                      type: object\n                                    vsphereVolume:\n                                      description: vsphereVolume represents a vSphere\n                                        volume attached and mounted on kubelets host\n                                        machine\n                                      properties:\n                                        fsType:\n                                          description: |-\n                                            fsType is filesystem type to mount.\n                                            Must be a filesystem type supported by the host operating system.\n                                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          type: string\n                                        storagePolicyID:\n                                          description: storagePolicyID is the storage\n                                            Policy Based Management (SPBM) profile\n                                            ID associated with the StoragePolicyName.\n                                          type: string\n                                        storagePolicyName:\n                                          description: storagePolicyName is the storage\n                                            Policy Based Management (SPBM) profile\n                                            name.\n                                          type: string\n                                        volumePath:\n                                          description: volumePath is the path that\n                                            identifies vSphere volume vmdk\n                                          type: string\n                                      required:\n                                      - volumePath\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        issuer:\n                          description: |-\n                            Specifies the configuration for the TLS certificates issuer.\n                            It allows defining the issuer name and the reference to the secret containing the TLS certificates and key.\n                            The secret should contain the CA certificate, TLS certificate, and private key in the specified keys.\n                            Required when TLS is enabled.\n                          properties:\n                            name:\n                              allOf:\n                              - enum:\n                                - KubeBlocks\n                                - UserProvided\n                              - enum:\n                                - KubeBlocks\n                                - UserProvided\n                              default: KubeBlocks\n                              description: |-\n                                The issuer for TLS certificates.\n                                It only allows two enum values: `KubeBlocks` and `UserProvided`.\n\n\n                                - `KubeBlocks` indicates that the self-signed TLS certificates generated by the KubeBlocks Operator will be used.\n                                - `UserProvided` means that the user is responsible for providing their own CA, Cert, and Key.\n                                  In this case, the user-provided CA certificate, server certificate, and private key will be used\n                                  for TLS communication.\n                              type: string\n                            secretRef:\n                              description: |-\n                                SecretRef is the reference to the secret that contains user-provided certificates.\n                                It is required when the issuer is set to `UserProvided`.\n                              properties:\n                                ca:\n                                  description: Key of CA cert in Secret\n                                  type: string\n                                cert:\n                                  description: Key of Cert in Secret\n                                  type: string\n                                key:\n                                  description: Key of TLS private key in Secret\n                                  type: string\n                                name:\n                                  description: Name of the Secret that contains user-provided\n                                    certificates.\n                                  type: string\n                              required:\n                              - ca\n                              - cert\n                              - key\n                              - name\n                              type: object\n                          required:\n                          - name\n                          type: object\n                        labels:\n                          additionalProperties:\n                            type: string\n                          description: Specifies Labels to override or add for underlying\n                            Pods, PVCs, Account & TLS Secrets, Services Owned by Component.\n                          type: object\n                        monitor:\n                          description: |-\n                            Deprecated since v0.9\n                            Determines whether metrics exporter information is annotated on the Component's headless Service.\n\n\n                            If set to true, the following annotations will be patched into the Service:\n\n\n                            - \"monitor.kubeblocks.io/path\"\n                            - \"monitor.kubeblocks.io/port\"\n                            - \"monitor.kubeblocks.io/scheme\"\n\n\n                            These annotations allow the Prometheus installed by KubeBlocks to discover and scrape metrics from the exporter.\n                          type: boolean\n                        name:\n                          description: |-\n                            Specifies the Component's name.\n                            It's part of the Service DNS name and must comply with the IANA service naming rule.\n                            The name is optional when ClusterComponentSpec is used as a template (e.g., in `shardingSpec`),\n                            but required otherwise.\n\n\n                            TODO +kubebuilder:validation:XValidation:rule=\"self == oldSelf\",message=\"name is immutable\"\n                          maxLength: 22\n                          pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        offlineInstances:\n                          description: |-\n                            Specifies the names of instances to be transitioned to offline status.\n\n\n                            Marking an instance as offline results in the following:\n\n\n                            1. The associated Pod is stopped, and its PersistentVolumeClaim (PVC) is retained for potential\n                               future reuse or data recovery, but it is no longer actively used.\n                            2. The ordinal number assigned to this instance is preserved, ensuring it remains unique\n                               and avoiding conflicts with new instances.\n\n\n                            Setting instances to offline allows for a controlled scale-in process, preserving their data and maintaining\n                            ordinal consistency within the Cluster.\n                            Note that offline instances and their associated resources, such as PVCs, are not automatically deleted.\n                            The administrator must manually manage the cleanup and removal of these resources when they are no longer needed.\n                          items:\n                            type: string\n                          type: array\n                        parallelPodManagementConcurrency:\n                          anyOf:\n                          - type: integer\n                          - type: string\n                          description: |-\n                            Controls the concurrency of pods during initial scale up, when replacing pods on nodes,\n                            or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.\n                            The default Concurrency is 100%.\n                          x-kubernetes-int-or-string: true\n                        podUpdatePolicy:\n                          description: |-\n                            PodUpdatePolicy indicates how pods should be updated\n\n\n                            - `StrictInPlace` indicates that only allows in-place upgrades.\n                            Any attempt to modify other fields will be rejected.\n                            - `PreferInPlace` indicates that we will first attempt an in-place upgrade of the Pod.\n                            If that fails, it will fall back to the ReCreate, where pod will be recreated.\n                            Default value is \"PreferInPlace\"\n                          enum:\n                          - StrictInPlace\n                          - PreferInPlace\n                          type: string\n                        replicas:\n                          default: 1\n                          description: Specifies the desired number of replicas in\n                            the Component for enhancing availability and durability,\n                            or load balancing.\n                          format: int32\n                          minimum: 0\n                          type: integer\n                        resources:\n                          description: |-\n                            Specifies the resources required by the Component.\n                            It allows defining the CPU, memory requirements and limits for the Component's containers.\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                          x-kubernetes-preserve-unknown-fields: true\n                        schedulingPolicy:\n                          description: Specifies the scheduling policy for the Component.\n                          properties:\n                            affinity:\n                              description: Specifies a group of affinity scheduling\n                                rules of the Cluster, including NodeAffinity, PodAffinity,\n                                and PodAntiAffinity.\n                              properties:\n                                nodeAffinity:\n                                  description: Describes node affinity scheduling\n                                    rules for the pod.\n                                  properties:\n                                    preferredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        The scheduler will prefer to schedule pods to nodes that satisfy\n                                        the affinity expressions specified by this field, but it may choose\n                                        a node that violates one or more of the expressions. The node that is\n                                        most preferred is the one with the greatest sum of weights, i.e.\n                                        for each node that meets all of the scheduling requirements (resource\n                                        request, requiredDuringScheduling affinity expressions, etc.),\n                                        compute a sum by iterating through the elements of this field and adding\n                                        \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                        node(s) with the highest sum are the most preferred.\n                                      items:\n                                        description: |-\n                                          An empty preferred scheduling term matches all objects with implicit weight 0\n                                          (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                        properties:\n                                          preference:\n                                            description: A node selector term, associated\n                                              with the corresponding weight.\n                                            properties:\n                                              matchExpressions:\n                                                description: A list of node selector\n                                                  requirements by node's labels.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchFields:\n                                                description: A list of node selector\n                                                  requirements by node's fields.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          weight:\n                                            description: Weight associated with matching\n                                              the corresponding nodeSelectorTerm,\n                                              in the range 1-100.\n                                            format: int32\n                                            type: integer\n                                        required:\n                                        - preference\n                                        - weight\n                                        type: object\n                                      type: array\n                                    requiredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        If the affinity requirements specified by this field are not met at\n                                        scheduling time, the pod will not be scheduled onto the node.\n                                        If the affinity requirements specified by this field cease to be met\n                                        at some point during pod execution (e.g. due to an update), the system\n                                        may or may not try to eventually evict the pod from its node.\n                                      properties:\n                                        nodeSelectorTerms:\n                                          description: Required. A list of node selector\n                                            terms. The terms are ORed.\n                                          items:\n                                            description: |-\n                                              A null or empty node selector term matches no objects. The requirements of\n                                              them are ANDed.\n                                              The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                            properties:\n                                              matchExpressions:\n                                                description: A list of node selector\n                                                  requirements by node's labels.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchFields:\n                                                description: A list of node selector\n                                                  requirements by node's fields.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          type: array\n                                      required:\n                                      - nodeSelectorTerms\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                                podAffinity:\n                                  description: Describes pod affinity scheduling rules\n                                    (e.g. co-locate this pod in the same node, zone,\n                                    etc. as some other pod(s)).\n                                  properties:\n                                    preferredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        The scheduler will prefer to schedule pods to nodes that satisfy\n                                        the affinity expressions specified by this field, but it may choose\n                                        a node that violates one or more of the expressions. The node that is\n                                        most preferred is the one with the greatest sum of weights, i.e.\n                                        for each node that meets all of the scheduling requirements (resource\n                                        request, requiredDuringScheduling affinity expressions, etc.),\n                                        compute a sum by iterating through the elements of this field and adding\n                                        \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                        node(s) with the highest sum are the most preferred.\n                                      items:\n                                        description: The weights of all of the matched\n                                          WeightedPodAffinityTerm fields are added\n                                          per-node to find the most preferred node(s)\n                                        properties:\n                                          podAffinityTerm:\n                                            description: Required. A pod affinity\n                                              term, associated with the corresponding\n                                              weight.\n                                            properties:\n                                              labelSelector:\n                                                description: |-\n                                                  A label query over a set of resources, in this case pods.\n                                                  If it's null, this PodAffinityTerm matches with no Pods.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              matchLabelKeys:\n                                                description: |-\n                                                  MatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                  Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              mismatchLabelKeys:\n                                                description: |-\n                                                  MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                  Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              namespaceSelector:\n                                                description: |-\n                                                  A label query over the set of namespaces that the term applies to.\n                                                  The term is applied to the union of the namespaces selected by this field\n                                                  and the ones listed in the namespaces field.\n                                                  null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                  An empty selector ({}) matches all namespaces.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              namespaces:\n                                                description: |-\n                                                  namespaces specifies a static list of namespace names that the term applies to.\n                                                  The term is applied to the union of the namespaces listed in this field\n                                                  and the ones selected by namespaceSelector.\n                                                  null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                items:\n                                                  type: string\n                                                type: array\n                                              topologyKey:\n                                                description: |-\n                                                  This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                  the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                  whose value of the label with key topologyKey matches that of any node on which any of the\n                                                  selected pods is running.\n                                                  Empty topologyKey is not allowed.\n                                                type: string\n                                            required:\n                                            - topologyKey\n                                            type: object\n                                          weight:\n                                            description: |-\n                                              weight associated with matching the corresponding podAffinityTerm,\n                                              in the range 1-100.\n                                            format: int32\n                                            type: integer\n                                        required:\n                                        - podAffinityTerm\n                                        - weight\n                                        type: object\n                                      type: array\n                                    requiredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        If the affinity requirements specified by this field are not met at\n                                        scheduling time, the pod will not be scheduled onto the node.\n                                        If the affinity requirements specified by this field cease to be met\n                                        at some point during pod execution (e.g. due to a pod label update), the\n                                        system may or may not try to eventually evict the pod from its node.\n                                        When there are multiple elements, the lists of nodes corresponding to each\n                                        podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                      items:\n                                        description: |-\n                                          Defines a set of pods (namely those matching the labelSelector\n                                          relative to the given namespace(s)) that this pod should be\n                                          co-located (affinity) or not co-located (anti-affinity) with,\n                                          where co-located is defined as running on a node whose value of\n                                          the label with key <topologyKey> matches that of any node on which\n                                          a pod of the set of pods is running\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      type: array\n                                  type: object\n                                podAntiAffinity:\n                                  description: Describes pod anti-affinity scheduling\n                                    rules (e.g. avoid putting this pod in the same\n                                    node, zone, etc. as some other pod(s)).\n                                  properties:\n                                    preferredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        The scheduler will prefer to schedule pods to nodes that satisfy\n                                        the anti-affinity expressions specified by this field, but it may choose\n                                        a node that violates one or more of the expressions. The node that is\n                                        most preferred is the one with the greatest sum of weights, i.e.\n                                        for each node that meets all of the scheduling requirements (resource\n                                        request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                        compute a sum by iterating through the elements of this field and adding\n                                        \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                        node(s) with the highest sum are the most preferred.\n                                      items:\n                                        description: The weights of all of the matched\n                                          WeightedPodAffinityTerm fields are added\n                                          per-node to find the most preferred node(s)\n                                        properties:\n                                          podAffinityTerm:\n                                            description: Required. A pod affinity\n                                              term, associated with the corresponding\n                                              weight.\n                                            properties:\n                                              labelSelector:\n                                                description: |-\n                                                  A label query over a set of resources, in this case pods.\n                                                  If it's null, this PodAffinityTerm matches with no Pods.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              matchLabelKeys:\n                                                description: |-\n                                                  MatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                  Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              mismatchLabelKeys:\n                                                description: |-\n                                                  MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                  Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              namespaceSelector:\n                                                description: |-\n                                                  A label query over the set of namespaces that the term applies to.\n                                                  The term is applied to the union of the namespaces selected by this field\n                                                  and the ones listed in the namespaces field.\n                                                  null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                  An empty selector ({}) matches all namespaces.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              namespaces:\n                                                description: |-\n                                                  namespaces specifies a static list of namespace names that the term applies to.\n                                                  The term is applied to the union of the namespaces listed in this field\n                                                  and the ones selected by namespaceSelector.\n                                                  null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                items:\n                                                  type: string\n                                                type: array\n                                              topologyKey:\n                                                description: |-\n                                                  This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                  the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                  whose value of the label with key topologyKey matches that of any node on which any of the\n                                                  selected pods is running.\n                                                  Empty topologyKey is not allowed.\n                                                type: string\n                                            required:\n                                            - topologyKey\n                                            type: object\n                                          weight:\n                                            description: |-\n                                              weight associated with matching the corresponding podAffinityTerm,\n                                              in the range 1-100.\n                                            format: int32\n                                            type: integer\n                                        required:\n                                        - podAffinityTerm\n                                        - weight\n                                        type: object\n                                      type: array\n                                    requiredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        If the anti-affinity requirements specified by this field are not met at\n                                        scheduling time, the pod will not be scheduled onto the node.\n                                        If the anti-affinity requirements specified by this field cease to be met\n                                        at some point during pod execution (e.g. due to a pod label update), the\n                                        system may or may not try to eventually evict the pod from its node.\n                                        When there are multiple elements, the lists of nodes corresponding to each\n                                        podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                      items:\n                                        description: |-\n                                          Defines a set of pods (namely those matching the labelSelector\n                                          relative to the given namespace(s)) that this pod should be\n                                          co-located (affinity) or not co-located (anti-affinity) with,\n                                          where co-located is defined as running on a node whose value of\n                                          the label with key <topologyKey> matches that of any node on which\n                                          a pod of the set of pods is running\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      type: array\n                                  type: object\n                              type: object\n                            nodeName:\n                              description: |-\n                                NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                                the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                                requirements.\n                              type: string\n                            nodeSelector:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                NodeSelector is a selector which must be true for the Pod to fit on a node.\n                                Selector which must match a node's labels for the Pod to be scheduled on that node.\n                                More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            schedulerName:\n                              description: |-\n                                If specified, the Pod will be dispatched by specified scheduler.\n                                If not specified, the Pod will be dispatched by default scheduler.\n                              type: string\n                            tolerations:\n                              description: |-\n                                Allows Pods to be scheduled onto nodes with matching taints.\n                                Each toleration in the array allows the Pod to tolerate node taints based on\n                                specified `key`, `value`, `effect`, and `operator`.\n\n\n                                - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                                - The `operator` determines how the toleration matches the taint.\n\n\n                                Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                              items:\n                                description: |-\n                                  The pod this Toleration is attached to tolerates any taint that matches\n                                  the triple <key,value,effect> using the matching operator <operator>.\n                                properties:\n                                  effect:\n                                    description: |-\n                                      Effect indicates the taint effect to match. Empty means match all taint effects.\n                                      When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                    type: string\n                                  key:\n                                    description: |-\n                                      Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                      If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      Operator represents a key's relationship to the value.\n                                      Valid operators are Exists and Equal. Defaults to Equal.\n                                      Exists is equivalent to wildcard for value, so that a pod can\n                                      tolerate all taints of a particular category.\n                                    type: string\n                                  tolerationSeconds:\n                                    description: |-\n                                      TolerationSeconds represents the period of time the toleration (which must be\n                                      of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                      it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                      negative values will be treated as 0 (evict immediately) by the system.\n                                    format: int64\n                                    type: integer\n                                  value:\n                                    description: |-\n                                      Value is the taint value the toleration matches to.\n                                      If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                    type: string\n                                type: object\n                              type: array\n                            topologySpreadConstraints:\n                              description: |-\n                                TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                                domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                                All topologySpreadConstraints are ANDed.\n                              items:\n                                description: TopologySpreadConstraint specifies how\n                                  to spread matching pods among the given topology.\n                                properties:\n                                  labelSelector:\n                                    description: |-\n                                      LabelSelector is used to find matching pods.\n                                      Pods that match this label selector are counted to determine the number of pods\n                                      in their corresponding topology domain.\n                                    properties:\n                                      matchExpressions:\n                                        description: matchExpressions is a list of\n                                          label selector requirements. The requirements\n                                          are ANDed.\n                                        items:\n                                          description: |-\n                                            A label selector requirement is a selector that contains values, a key, and an operator that\n                                            relates the key and values.\n                                          properties:\n                                            key:\n                                              description: key is the label key that\n                                                the selector applies to.\n                                              type: string\n                                            operator:\n                                              description: |-\n                                                operator represents a key's relationship to a set of values.\n                                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                                              type: string\n                                            values:\n                                              description: |-\n                                                values is an array of string values. If the operator is In or NotIn,\n                                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                the values array must be empty. This array is replaced during a strategic\n                                                merge patch.\n                                              items:\n                                                type: string\n                                              type: array\n                                          required:\n                                          - key\n                                          - operator\n                                          type: object\n                                        type: array\n                                      matchLabels:\n                                        additionalProperties:\n                                          type: string\n                                        description: |-\n                                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                        type: object\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  matchLabelKeys:\n                                    description: |-\n                                      MatchLabelKeys is a set of pod label keys to select the pods over which\n                                      spreading will be calculated. The keys are used to lookup values from the\n                                      incoming pod labels, those key-value labels are ANDed with labelSelector\n                                      to select the group of existing pods over which spreading will be calculated\n                                      for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                      MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                      Keys that don't exist in the incoming pod labels will\n                                      be ignored. A null or empty list means only match against labelSelector.\n\n\n                                      This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                    items:\n                                      type: string\n                                    type: array\n                                    x-kubernetes-list-type: atomic\n                                  maxSkew:\n                                    description: |-\n                                      MaxSkew describes the degree to which pods may be unevenly distributed.\n                                      When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                      between the number of matching pods in the target topology and the global minimum.\n                                      The global minimum is the minimum number of matching pods in an eligible domain\n                                      or zero if the number of eligible domains is less than MinDomains.\n                                      For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                      labelSelector spread as 2/2/1:\n                                      In this case, the global minimum is 1.\n                                      | zone1 | zone2 | zone3 |\n                                      |  P P  |  P P  |   P   |\n                                      - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                      scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                      violate MaxSkew(1).\n                                      - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                      When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                      to topologies that satisfy it.\n                                      It's a required field. Default value is 1 and 0 is not allowed.\n                                    format: int32\n                                    type: integer\n                                  minDomains:\n                                    description: |-\n                                      MinDomains indicates a minimum number of eligible domains.\n                                      When the number of eligible domains with matching topology keys is less than minDomains,\n                                      Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                      And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                      this value has no effect on scheduling.\n                                      As a result, when the number of eligible domains is less than minDomains,\n                                      scheduler won't schedule more than maxSkew Pods to those domains.\n                                      If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                      Valid values are integers greater than 0.\n                                      When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                      For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                      labelSelector spread as 2/2/2:\n                                      | zone1 | zone2 | zone3 |\n                                      |  P P  |  P P  |  P P  |\n                                      The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                      In this situation, new pod with the same labelSelector cannot be scheduled,\n                                      because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                      it will violate MaxSkew.\n\n\n                                      This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                    format: int32\n                                    type: integer\n                                  nodeAffinityPolicy:\n                                    description: |-\n                                      NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                      when calculating pod topology spread skew. Options are:\n                                      - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                      - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                      If this value is nil, the behavior is equivalent to the Honor policy.\n                                      This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                    type: string\n                                  nodeTaintsPolicy:\n                                    description: |-\n                                      NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                      pod topology spread skew. Options are:\n                                      - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                      has a toleration, are included.\n                                      - Ignore: node taints are ignored. All nodes are included.\n\n\n                                      If this value is nil, the behavior is equivalent to the Ignore policy.\n                                      This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                    type: string\n                                  topologyKey:\n                                    description: |-\n                                      TopologyKey is the key of node labels. Nodes that have a label with this key\n                                      and identical values are considered to be in the same topology.\n                                      We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                      of pods into each bucket.\n                                      We define a domain as a particular instance of a topology.\n                                      Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                      nodeAffinityPolicy and nodeTaintsPolicy.\n                                      e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                      And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                      It's a required field.\n                                    type: string\n                                  whenUnsatisfiable:\n                                    description: |-\n                                      WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                      the spread constraint.\n                                      - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                      - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                        but giving higher precedence to topologies that would help reduce the\n                                        skew.\n                                      A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                      if and only if every possible node assignment for that pod would violate\n                                      \"MaxSkew\" on some topology.\n                                      For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                      labelSelector spread as 3/1/1:\n                                      | zone1 | zone2 | zone3 |\n                                      | P P P |   P   |   P   |\n                                      If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                      to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                      MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                      won't make it *more* imbalanced.\n                                      It's a required field.\n                                    type: string\n                                required:\n                                - maxSkew\n                                - topologyKey\n                                - whenUnsatisfiable\n                                type: object\n                              type: array\n                          type: object\n                        serviceAccountName:\n                          description: |-\n                            Specifies the name of the ServiceAccount required by the running Component.\n                            This ServiceAccount is used to grant necessary permissions for the Component's Pods to interact\n                            with other Kubernetes resources, such as modifying Pod labels or sending events.\n\n\n                            Defaults:\n                            To perform certain operational tasks, agent sidecars running in Pods require specific RBAC permissions.\n                            The service account will be bound to a default role named \"kubeblocks-cluster-pod-role\" which is installed together with KubeBlocks.\n                            If not specified, KubeBlocks automatically assigns a default ServiceAccount named \"kb-{cluster.name}\"\n\n\n                            Future Changes:\n                            Future versions might change the default ServiceAccount creation strategy to one per Component,\n                            potentially revising the naming to \"kb-{cluster.name}-{component.name}\".\n\n\n                            Users can override the automatic ServiceAccount assignment by explicitly setting the name of\n                            an existed ServiceAccount in this field.\n                          type: string\n                        serviceRefs:\n                          description: |-\n                            Defines a list of ServiceRef for a Component, enabling access to both external services and\n                            Services provided by other Clusters.\n\n\n                            Types of services:\n\n\n                            - External services: Not managed by KubeBlocks or managed by a different KubeBlocks operator;\n                              Require a ServiceDescriptor for connection details.\n                            - Services provided by a Cluster: Managed by the same KubeBlocks operator;\n                              identified using Cluster, Component and Service names.\n\n\n                            ServiceRefs with identical `serviceRef.name` in the same Cluster are considered the same.\n\n\n                            Example:\n                            ```yaml\n                            serviceRefs:\n                              - name: \"redis-sentinel\"\n                                serviceDescriptor:\n                                  name: \"external-redis-sentinel\"\n                              - name: \"postgres-cluster\"\n                                clusterServiceSelector:\n                                  cluster: \"my-postgres-cluster\"\n                                  service:\n                                    component: \"postgresql\"\n                            ```\n                            The example above includes ServiceRefs to an external Redis Sentinel service and a PostgreSQL Cluster.\n                          items:\n                            properties:\n                              cluster:\n                                description: |-\n                                  Specifies the name of the KubeBlocks Cluster being referenced.\n                                  This is used when services from another KubeBlocks Cluster are consumed.\n\n\n                                  By default, the referenced KubeBlocks Cluster's `clusterDefinition.spec.connectionCredential`\n                                  will be utilized to bind to the current Component. This credential should include:\n                                  `endpoint`, `port`, `username`, and `password`.\n\n\n                                  Note:\n\n\n                                  - The `ServiceKind` and `ServiceVersion` specified in the service reference within the\n                                    ClusterDefinition are not validated when using this approach.\n                                  - If both `cluster` and `serviceDescriptor` are present, `cluster` will take precedence.\n\n\n                                  Deprecated since v0.9 since `clusterDefinition.spec.connectionCredential` is deprecated,\n                                  use `clusterServiceSelector` instead.\n                                  This field is maintained for backward compatibility and its use is discouraged.\n                                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                                type: string\n                              clusterServiceSelector:\n                                description: |-\n                                  References a service provided by another KubeBlocks Cluster.\n                                  It specifies the ClusterService and the account credentials needed for access.\n                                properties:\n                                  cluster:\n                                    description: The name of the Cluster being referenced.\n                                    type: string\n                                  credential:\n                                    description: |-\n                                      Specifies the SystemAccount to authenticate and establish a connection with the referenced Cluster.\n                                      The SystemAccount should be defined in `componentDefinition.spec.systemAccounts`\n                                      of the Component providing the service in the referenced Cluster.\n                                    properties:\n                                      component:\n                                        description: The name of the Component where\n                                          the credential resides in.\n                                        type: string\n                                      name:\n                                        description: The name of the credential (SystemAccount)\n                                          to reference.\n                                        type: string\n                                    required:\n                                    - component\n                                    - name\n                                    type: object\n                                  service:\n                                    description: Identifies a ClusterService from\n                                      the list of Services defined in `cluster.spec.services`\n                                      of the referenced Cluster.\n                                    properties:\n                                      component:\n                                        description: |-\n                                          The name of the Component where the Service resides in.\n\n\n                                          It is required when referencing a Component's Service.\n                                        type: string\n                                      port:\n                                        description: |-\n                                          The port name of the Service to be referenced.\n\n\n                                          If there is a non-zero node-port exist for the matched Service port, the node-port will be selected first.\n\n\n                                          If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                          and the resolved value will be presented in the following format: service1.name:port1,service2.name:port2...\n                                        type: string\n                                      service:\n                                        description: |-\n                                          The name of the Service to be referenced.\n\n\n                                          Leave it empty to reference the default Service. Set it to \"headless\" to reference the default headless Service.\n\n\n                                          If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                          and the resolved value will be presented in the following format: service1.name,service2.name...\n                                        type: string\n                                    required:\n                                    - service\n                                    type: object\n                                required:\n                                - cluster\n                                type: object\n                              name:\n                                description: |-\n                                  Specifies the identifier of the service reference declaration.\n                                  It corresponds to the serviceRefDeclaration name defined in either:\n\n\n                                  - `componentDefinition.spec.serviceRefDeclarations[*].name`\n                                  - `clusterDefinition.spec.componentDefs[*].serviceRefDeclarations[*].name` (deprecated)\n                                type: string\n                              namespace:\n                                description: |-\n                                  Specifies the namespace of the referenced Cluster or the namespace of the referenced ServiceDescriptor object.\n                                  If not provided, the referenced Cluster and ServiceDescriptor will be searched in the namespace of the current\n                                  Cluster by default.\n                                type: string\n                              serviceDescriptor:\n                                description: |-\n                                  Specifies the name of the ServiceDescriptor object that describes a service provided by external sources.\n\n\n                                  When referencing a service provided by external sources, a ServiceDescriptor object is required to establish\n                                  the service binding.\n                                  The `serviceDescriptor.spec.serviceKind` and `serviceDescriptor.spec.serviceVersion` should match the serviceKind\n                                  and serviceVersion declared in the definition.\n\n\n                                  If both `cluster` and `serviceDescriptor` are specified, the `cluster` takes precedence.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        serviceVersion:\n                          description: |-\n                            ServiceVersion specifies the version of the Service expected to be provisioned by this Component.\n                            The version should follow the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n                            If no version is specified, the latest available version will be used.\n                          maxLength: 32\n                          type: string\n                        services:\n                          description: Overrides services defined in referenced ComponentDefinition\n                            and expose endpoints that can be accessed by clients.\n                          items:\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  If ServiceType is LoadBalancer, cloud provider related parameters can be put here.\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                                type: object\n                              name:\n                                description: References the ComponentService name\n                                  defined in the `componentDefinition.spec.services[*].name`.\n                                maxLength: 25\n                                type: string\n                              podService:\n                                default: false\n                                description: |-\n                                  Indicates whether to generate individual Services for each Pod.\n                                  If set to true, a separate Service will be created for each Pod in the Cluster.\n                                type: boolean\n                              serviceType:\n                                default: ClusterIP\n                                description: |-\n                                  Determines how the Service is exposed. Valid options are `ClusterIP`, `NodePort`, and `LoadBalancer`.\n\n\n                                  - `ClusterIP` allocates a Cluster-internal IP address for load-balancing to endpoints.\n                                     Endpoints are determined by the selector or if that is not specified,\n                                     they are determined by manual construction of an Endpoints object or EndpointSlice objects.\n                                  - `NodePort` builds on ClusterIP and allocates a port on every node which routes to the same endpoints as the ClusterIP.\n                                  - `LoadBalancer` builds on NodePort and creates an external load-balancer (if supported in the current cloud)\n                                     which routes to the same endpoints as the ClusterIP.\n\n\n                                  Note: although K8s Service type allows the 'ExternalName' type, it is not a valid option for ClusterComponentService.\n\n\n                                  For more info, see:\n                                  https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types.\n                                enum:\n                                - ClusterIP\n                                - NodePort\n                                - LoadBalancer\n                                type: string\n                                x-kubernetes-preserve-unknown-fields: true\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        stop:\n                          description: |-\n                            Stop the Component.\n                            If set, all the computing resources will be released.\n                          type: boolean\n                        switchPolicy:\n                          description: |-\n                            Defines the strategy for switchover and failover.\n\n\n                            Deprecated since v0.9.\n                            This field is maintained for backward compatibility and its use is discouraged.\n                            Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                          properties:\n                            type:\n                              default: Noop\n                              description: Type specifies the type of switch policy\n                                to be applied.\n                              enum:\n                              - Noop\n                              type: string\n                          type: object\n                        systemAccounts:\n                          description: Overrides system accounts defined in referenced\n                            ComponentDefinition.\n                          items:\n                            properties:\n                              name:\n                                description: The name of the system account.\n                                type: string\n                              passwordConfig:\n                                description: |-\n                                  Specifies the policy for generating the account's password.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  length:\n                                    default: 16\n                                    description: The length of the password.\n                                    format: int32\n                                    maximum: 32\n                                    minimum: 8\n                                    type: integer\n                                  letterCase:\n                                    default: MixedCases\n                                    description: The case of the letters in the password.\n                                    enum:\n                                    - LowerCases\n                                    - UpperCases\n                                    - MixedCases\n                                    type: string\n                                  numDigits:\n                                    default: 4\n                                    description: The number of digits in the password.\n                                    format: int32\n                                    maximum: 8\n                                    minimum: 0\n                                    type: integer\n                                  numSymbols:\n                                    default: 0\n                                    description: The number of symbols in the password.\n                                    format: int32\n                                    maximum: 8\n                                    minimum: 0\n                                    type: integer\n                                  seed:\n                                    description: |-\n                                      Seed to generate the account's password.\n                                      Cannot be updated.\n                                    type: string\n                                type: object\n                              secretRef:\n                                description: |-\n                                  Refers to the secret from which data will be copied to create the new account.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  name:\n                                    description: The unique identifier of the secret.\n                                    type: string\n                                  namespace:\n                                    description: The namespace where the secret is\n                                      located.\n                                    type: string\n                                required:\n                                - name\n                                - namespace\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        tls:\n                          description: |-\n                            A boolean flag that indicates whether the Component should use Transport Layer Security (TLS)\n                            for secure communication.\n                            When set to true, the Component will be configured to use TLS encryption for its network connections.\n                            This ensures that the data transmitted between the Component and its clients or other Components is encrypted\n                            and protected from unauthorized access.\n                            If TLS is enabled, the Component may require additional configuration, such as specifying TLS certificates and keys,\n                            to properly set up the secure communication channel.\n                          type: boolean\n                        tolerations:\n                          description: |-\n                            Allows Pods to be scheduled onto nodes with matching taints.\n                            Each toleration in the array allows the Pod to tolerate node taints based on\n                            specified `key`, `value`, `effect`, and `operator`.\n\n\n                            - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                            - The `operator` determines how the toleration matches the taint.\n\n\n                            Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n\n\n                            Deprecated since v0.10, replaced by the `schedulingPolicy` field.\n                          items:\n                            description: |-\n                              The pod this Toleration is attached to tolerates any taint that matches\n                              the triple <key,value,effect> using the matching operator <operator>.\n                            properties:\n                              effect:\n                                description: |-\n                                  Effect indicates the taint effect to match. Empty means match all taint effects.\n                                  When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                type: string\n                              key:\n                                description: |-\n                                  Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                  If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                type: string\n                              operator:\n                                description: |-\n                                  Operator represents a key's relationship to the value.\n                                  Valid operators are Exists and Equal. Defaults to Equal.\n                                  Exists is equivalent to wildcard for value, so that a pod can\n                                  tolerate all taints of a particular category.\n                                type: string\n                              tolerationSeconds:\n                                description: |-\n                                  TolerationSeconds represents the period of time the toleration (which must be\n                                  of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                  it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                  negative values will be treated as 0 (evict immediately) by the system.\n                                format: int64\n                                type: integer\n                              value:\n                                description: |-\n                                  Value is the taint value the toleration matches to.\n                                  If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                type: string\n                            type: object\n                          type: array\n                          x-kubernetes-preserve-unknown-fields: true\n                        updateStrategy:\n                          description: |-\n                            Defines the update strategy for the Component.\n\n\n                            Deprecated since v0.9.\n                            This field is maintained for backward compatibility and its use is discouraged.\n                            Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                          enum:\n                          - Serial\n                          - BestEffortParallel\n                          - Parallel\n                          type: string\n                        userResourceRefs:\n                          description: |-\n                            Allows users to specify custom ConfigMaps and Secrets to be mounted as volumes\n                            in the Cluster's Pods.\n                            This is useful in scenarios where users need to provide additional resources to the Cluster, such as:\n\n\n                            - Mounting custom scripts or configuration files during Cluster startup.\n                            - Mounting Secrets as volumes to provide sensitive information, like S3 AK/SK, to the Cluster.\n                          properties:\n                            configMapRefs:\n                              description: ConfigMapRefs defines the user-defined\n                                ConfigMaps.\n                              items:\n                                description: ConfigMapRef defines a reference to a\n                                  ConfigMap.\n                                properties:\n                                  asVolumeFrom:\n                                    description: AsVolumeFrom lists the names of containers\n                                      in which the volume should be mounted.\n                                    items:\n                                      type: string\n                                    type: array\n                                    x-kubernetes-list-type: set\n                                  configMap:\n                                    description: ConfigMap specifies the ConfigMap\n                                      to be mounted as a volume.\n                                    properties:\n                                      defaultMode:\n                                        description: |-\n                                          defaultMode is optional: mode bits used to set permissions on created files by default.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          Defaults to 0644.\n                                          Directories within the path are not affected by this setting.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      items:\n                                        description: |-\n                                          items if unspecified, each key-value pair in the Data field of the referenced\n                                          ConfigMap will be projected into the volume as a file whose name is the\n                                          key and content is the value. If specified, the listed keys will be\n                                          projected into the specified paths, and unlisted keys will not be\n                                          present. If a key is specified which is not present in the ConfigMap,\n                                          the volume setup will error unless it is marked optional. Paths must be\n                                          relative and may not contain the '..' path or start with '..'.\n                                        items:\n                                          description: Maps a string key to a path\n                                            within a volume.\n                                          properties:\n                                            key:\n                                              description: key is the key to project.\n                                              type: string\n                                            mode:\n                                              description: |-\n                                                mode is Optional: mode bits used to set permissions on this file.\n                                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the relative path of the file to map the key to.\n                                                May not be an absolute path.\n                                                May not contain the path element '..'.\n                                                May not start with the string '..'.\n                                              type: string\n                                          required:\n                                          - key\n                                          - path\n                                          type: object\n                                        type: array\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: optional specify whether the\n                                          ConfigMap or its keys must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  mountPoint:\n                                    description: MountPoint is the filesystem path\n                                      where the volume will be mounted.\n                                    maxLength: 256\n                                    type: string\n                                  name:\n                                    description: Name is the name of the referenced\n                                      ConfigMap or Secret object. It must conform\n                                      to DNS label standards.\n                                    maxLength: 63\n                                    pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                    type: string\n                                  subPath:\n                                    description: SubPath specifies a path within the\n                                      volume from which to mount.\n                                    type: string\n                                required:\n                                - configMap\n                                - mountPoint\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            secretRefs:\n                              description: SecretRefs defines the user-defined Secrets.\n                              items:\n                                description: SecretRef defines a reference to a Secret.\n                                properties:\n                                  asVolumeFrom:\n                                    description: AsVolumeFrom lists the names of containers\n                                      in which the volume should be mounted.\n                                    items:\n                                      type: string\n                                    type: array\n                                    x-kubernetes-list-type: set\n                                  mountPoint:\n                                    description: MountPoint is the filesystem path\n                                      where the volume will be mounted.\n                                    maxLength: 256\n                                    type: string\n                                  name:\n                                    description: Name is the name of the referenced\n                                      ConfigMap or Secret object. It must conform\n                                      to DNS label standards.\n                                    maxLength: 63\n                                    pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                    type: string\n                                  secret:\n                                    description: Secret specifies the Secret to be\n                                      mounted as a volume.\n                                    properties:\n                                      defaultMode:\n                                        description: |-\n                                          defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values\n                                          for mode bits. Defaults to 0644.\n                                          Directories within the path are not affected by this setting.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      items:\n                                        description: |-\n                                          items If unspecified, each key-value pair in the Data field of the referenced\n                                          Secret will be projected into the volume as a file whose name is the\n                                          key and content is the value. If specified, the listed keys will be\n                                          projected into the specified paths, and unlisted keys will not be\n                                          present. If a key is specified which is not present in the Secret,\n                                          the volume setup will error unless it is marked optional. Paths must be\n                                          relative and may not contain the '..' path or start with '..'.\n                                        items:\n                                          description: Maps a string key to a path\n                                            within a volume.\n                                          properties:\n                                            key:\n                                              description: key is the key to project.\n                                              type: string\n                                            mode:\n                                              description: |-\n                                                mode is Optional: mode bits used to set permissions on this file.\n                                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the relative path of the file to map the key to.\n                                                May not be an absolute path.\n                                                May not contain the path element '..'.\n                                                May not start with the string '..'.\n                                              type: string\n                                          required:\n                                          - key\n                                          - path\n                                          type: object\n                                        type: array\n                                      optional:\n                                        description: optional field specify whether\n                                          the Secret or its keys must be defined\n                                        type: boolean\n                                      secretName:\n                                        description: |-\n                                          secretName is the name of the secret in the pod's namespace to use.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                        type: string\n                                    type: object\n                                  subPath:\n                                    description: SubPath specifies a path within the\n                                      volume from which to mount.\n                                    type: string\n                                required:\n                                - mountPoint\n                                - name\n                                - secret\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                          type: object\n                        volumeClaimTemplates:\n                          description: |-\n                            Specifies a list of PersistentVolumeClaim templates that represent the storage requirements for the Component.\n                            Each template specifies the desired characteristics of a persistent volume, such as storage class,\n                            size, and access modes.\n                            These templates are used to dynamically provision persistent volumes for the Component.\n                          items:\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                description: Specifies the annotations for the PVC\n                                  of the volume.\n                                type: object\n                              labels:\n                                additionalProperties:\n                                  type: string\n                                description: Specifies the labels for the PVC of the\n                                  volume.\n                                type: object\n                              name:\n                                description: |-\n                                  Refers to the name of a volumeMount defined in either:\n\n\n                                  - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                                  - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                                  The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                                type: string\n                              spec:\n                                description: |-\n                                  Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                                  with the mount name specified in the `name` field.\n\n\n                                  When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                                  defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                                properties:\n                                  accessModes:\n                                    description: |-\n                                      Contains the desired access modes the volume should have.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                    items:\n                                      type: string\n                                    type: array\n                                    x-kubernetes-preserve-unknown-fields: true\n                                  resources:\n                                    description: |-\n                                      Represents the minimum resources the volume should have.\n                                      If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                      are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                    properties:\n                                      limits:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Limits describes the maximum amount of compute resources allowed.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                      requests:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Requests describes the minimum amount of compute resources required.\n                                          If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                          otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                    type: object\n                                    x-kubernetes-preserve-unknown-fields: true\n                                  storageClassName:\n                                    description: |-\n                                      The name of the StorageClass required by the claim.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                    type: string\n                                  volumeMode:\n                                    description: Defines what type of volume is required\n                                      by the claim, either Block or Filesystem.\n                                    type: string\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        volumes:\n                          description: List of volumes to override.\n                          items:\n                            description: Volume represents a named volume in a pod\n                              that may be accessed by any container in the pod.\n                            properties:\n                              awsElasticBlockStore:\n                                description: |-\n                                  awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                                  kubelet's host machine and then exposed to the pod.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  partition:\n                                    description: |-\n                                      partition is the partition in the volume that you want to mount.\n                                      If omitted, the default is to mount by volume name.\n                                      Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                      Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                    format: int32\n                                    type: integer\n                                  readOnly:\n                                    description: |-\n                                      readOnly value true will force the readOnly setting in VolumeMounts.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                    type: boolean\n                                  volumeID:\n                                    description: |-\n                                      volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                    type: string\n                                required:\n                                - volumeID\n                                type: object\n                              azureDisk:\n                                description: azureDisk represents an Azure Data Disk\n                                  mount on the host and bind mount to the pod.\n                                properties:\n                                  cachingMode:\n                                    description: 'cachingMode is the Host Caching\n                                      mode: None, Read Only, Read Write.'\n                                    type: string\n                                  diskName:\n                                    description: diskName is the Name of the data\n                                      disk in the blob storage\n                                    type: string\n                                  diskURI:\n                                    description: diskURI is the URI of data disk in\n                                      the blob storage\n                                    type: string\n                                  fsType:\n                                    description: |-\n                                      fsType is Filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  kind:\n                                    description: 'kind expected values are Shared:\n                                      multiple blob disks per storage account  Dedicated:\n                                      single blob disk per storage account  Managed:\n                                      azure managed data disk (only in managed availability\n                                      set). defaults to shared'\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                required:\n                                - diskName\n                                - diskURI\n                                type: object\n                              azureFile:\n                                description: azureFile represents an Azure File Service\n                                  mount on the host and bind mount to the pod.\n                                properties:\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretName:\n                                    description: secretName is the  name of secret\n                                      that contains Azure Storage Account Name and\n                                      Key\n                                    type: string\n                                  shareName:\n                                    description: shareName is the azure share Name\n                                    type: string\n                                required:\n                                - secretName\n                                - shareName\n                                type: object\n                              cephfs:\n                                description: cephFS represents a Ceph FS mount on\n                                  the host that shares a pod's lifetime\n                                properties:\n                                  monitors:\n                                    description: |-\n                                      monitors is Required: Monitors is a collection of Ceph monitors\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    items:\n                                      type: string\n                                    type: array\n                                  path:\n                                    description: 'path is Optional: Used as the mounted\n                                      root, rather than the full Ceph tree, default\n                                      is /'\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    type: boolean\n                                  secretFile:\n                                    description: |-\n                                      secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    type: string\n                                  secretRef:\n                                    description: |-\n                                      secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  user:\n                                    description: |-\n                                      user is optional: User is the rados user name, default is admin\n                                      More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                    type: string\n                                required:\n                                - monitors\n                                type: object\n                              cinder:\n                                description: |-\n                                  cinder represents a cinder volume attached and mounted on kubelets host machine.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef is optional: points to a secret object containing parameters used to connect\n                                      to OpenStack.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  volumeID:\n                                    description: |-\n                                      volumeID used to identify the volume in cinder.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    type: string\n                                required:\n                                - volumeID\n                                type: object\n                              configMap:\n                                description: configMap represents a configMap that\n                                  should populate this volume\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      ConfigMap will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the ConfigMap,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional specify whether the ConfigMap\n                                      or its keys must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              csi:\n                                description: csi (Container Storage Interface) represents\n                                  ephemeral storage that is handled by certain external\n                                  CSI drivers (Beta feature).\n                                properties:\n                                  driver:\n                                    description: |-\n                                      driver is the name of the CSI driver that handles this volume.\n                                      Consult with your admin for the correct name as registered in the cluster.\n                                    type: string\n                                  fsType:\n                                    description: |-\n                                      fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                      If not provided, the empty value is passed to the associated CSI driver\n                                      which will determine the default filesystem to apply.\n                                    type: string\n                                  nodePublishSecretRef:\n                                    description: |-\n                                      nodePublishSecretRef is a reference to the secret object containing\n                                      sensitive information to pass to the CSI driver to complete the CSI\n                                      NodePublishVolume and NodeUnpublishVolume calls.\n                                      This field is optional, and  may be empty if no secret is required. If the\n                                      secret object contains more than one secret, all secret references are passed.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  readOnly:\n                                    description: |-\n                                      readOnly specifies a read-only configuration for the volume.\n                                      Defaults to false (read/write).\n                                    type: boolean\n                                  volumeAttributes:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      volumeAttributes stores driver-specific properties that are passed to the CSI\n                                      driver. Consult your driver's documentation for supported values.\n                                    type: object\n                                required:\n                                - driver\n                                type: object\n                              downwardAPI:\n                                description: downwardAPI represents downward API about\n                                  the pod that should populate this volume\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      Optional: mode bits to use on created files by default. Must be a\n                                      Optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: Items is a list of downward API volume\n                                      file\n                                    items:\n                                      description: DownwardAPIVolumeFile represents\n                                        information to create the file containing\n                                        the pod field\n                                      properties:\n                                        fieldRef:\n                                          description: 'Required: Selects a field\n                                            of the pod: only annotations, labels,\n                                            name and namespace are supported.'\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        mode:\n                                          description: |-\n                                            Optional: mode bits used to set permissions on this file, must be an octal value\n                                            between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: 'Required: Path is  the relative\n                                            path name of the file to be created. Must\n                                            not be absolute or contain the ''..''\n                                            path. Must be utf-8 encoded. The first\n                                            item of the relative path must not start\n                                            with ''..'''\n                                          type: string\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      required:\n                                      - path\n                                      type: object\n                                    type: array\n                                type: object\n                              emptyDir:\n                                description: |-\n                                  emptyDir represents a temporary directory that shares a pod's lifetime.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                properties:\n                                  medium:\n                                    description: |-\n                                      medium represents what type of storage medium should back this directory.\n                                      The default is \"\" which means to use the node's default medium.\n                                      Must be an empty string (default) or Memory.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                    type: string\n                                  sizeLimit:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: |-\n                                      sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                      The size limit is also applicable for memory medium.\n                                      The maximum usage on memory medium EmptyDir would be the minimum value between\n                                      the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                      The default is nil which means that the limit is undefined.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                type: object\n                              ephemeral:\n                                description: |-\n                                  ephemeral represents a volume that is handled by a cluster storage driver.\n                                  The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                                  and deleted when the pod is removed.\n\n\n                                  Use this if:\n                                  a) the volume is only needed while the pod runs,\n                                  b) features of normal volumes like restoring from snapshot or capacity\n                                     tracking are needed,\n                                  c) the storage driver is specified through a storage class, and\n                                  d) the storage driver supports dynamic volume provisioning through\n                                     a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                     information on the connection between this volume type\n                                     and PersistentVolumeClaim).\n\n\n                                  Use PersistentVolumeClaim or one of the vendor-specific\n                                  APIs for volumes that persist for longer than the lifecycle\n                                  of an individual pod.\n\n\n                                  Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                                  be used that way - see the documentation of the driver for\n                                  more information.\n\n\n                                  A pod can use both types of ephemeral volumes and\n                                  persistent volumes at the same time.\n                                properties:\n                                  volumeClaimTemplate:\n                                    description: |-\n                                      Will be used to create a stand-alone PVC to provision the volume.\n                                      The pod in which this EphemeralVolumeSource is embedded will be the\n                                      owner of the PVC, i.e. the PVC will be deleted together with the\n                                      pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                      `<volume name>` is the name from the `PodSpec.Volumes` array\n                                      entry. Pod validation will reject the pod if the concatenated name\n                                      is not valid for a PVC (for example, too long).\n\n\n                                      An existing PVC with that name that is not owned by the pod\n                                      will *not* be used for the pod to avoid using an unrelated\n                                      volume by mistake. Starting the pod is then blocked until\n                                      the unrelated PVC is removed. If such a pre-created PVC is\n                                      meant to be used by the pod, the PVC has to updated with an\n                                      owner reference to the pod once the pod exists. Normally\n                                      this should not be necessary, but it may be useful when\n                                      manually reconstructing a broken cluster.\n\n\n                                      This field is read-only and no changes will be made by Kubernetes\n                                      to the PVC after it has been created.\n\n\n                                      Required, must not be nil.\n                                    properties:\n                                      metadata:\n                                        description: |-\n                                          May contain labels and annotations that will be copied into the PVC\n                                          when creating it. No other fields are allowed and will be rejected during\n                                          validation.\n                                        properties:\n                                          annotations:\n                                            additionalProperties:\n                                              type: string\n                                            type: object\n                                          finalizers:\n                                            items:\n                                              type: string\n                                            type: array\n                                          labels:\n                                            additionalProperties:\n                                              type: string\n                                            type: object\n                                          name:\n                                            type: string\n                                          namespace:\n                                            type: string\n                                        type: object\n                                      spec:\n                                        description: |-\n                                          The specification for the PersistentVolumeClaim. The entire content is\n                                          copied unchanged into the PVC that gets created from this\n                                          template. The same fields as in a PersistentVolumeClaim\n                                          are also valid here.\n                                        properties:\n                                          accessModes:\n                                            description: |-\n                                              accessModes contains the desired access modes the volume should have.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                            items:\n                                              type: string\n                                            type: array\n                                          dataSource:\n                                            description: |-\n                                              dataSource field can be used to specify either:\n                                              * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                              * An existing PVC (PersistentVolumeClaim)\n                                              If the provisioner or an external controller can support the specified data source,\n                                              it will create a new volume based on the contents of the specified data source.\n                                              When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                              and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                              If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                            properties:\n                                              apiGroup:\n                                                description: |-\n                                                  APIGroup is the group for the resource being referenced.\n                                                  If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                  For any other third-party types, APIGroup is required.\n                                                type: string\n                                              kind:\n                                                description: Kind is the type of resource\n                                                  being referenced\n                                                type: string\n                                              name:\n                                                description: Name is the name of resource\n                                                  being referenced\n                                                type: string\n                                            required:\n                                            - kind\n                                            - name\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          dataSourceRef:\n                                            description: |-\n                                              dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                              volume is desired. This may be any object from a non-empty API group (non\n                                              core object) or a PersistentVolumeClaim object.\n                                              When this field is specified, volume binding will only succeed if the type of\n                                              the specified object matches some installed volume populator or dynamic\n                                              provisioner.\n                                              This field will replace the functionality of the dataSource field and as such\n                                              if both fields are non-empty, they must have the same value. For backwards\n                                              compatibility, when namespace isn't specified in dataSourceRef,\n                                              both fields (dataSource and dataSourceRef) will be set to the same\n                                              value automatically if one of them is empty and the other is non-empty.\n                                              When namespace is specified in dataSourceRef,\n                                              dataSource isn't set to the same value and must be empty.\n                                              There are three important differences between dataSource and dataSourceRef:\n                                              * While dataSource only allows two specific types of objects, dataSourceRef\n                                                allows any non-core object, as well as PersistentVolumeClaim objects.\n                                              * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                                preserves all values, and generates an error if a disallowed value is\n                                                specified.\n                                              * While dataSource only allows local objects, dataSourceRef allows objects\n                                                in any namespaces.\n                                              (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                              (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                            properties:\n                                              apiGroup:\n                                                description: |-\n                                                  APIGroup is the group for the resource being referenced.\n                                                  If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                  For any other third-party types, APIGroup is required.\n                                                type: string\n                                              kind:\n                                                description: Kind is the type of resource\n                                                  being referenced\n                                                type: string\n                                              name:\n                                                description: Name is the name of resource\n                                                  being referenced\n                                                type: string\n                                              namespace:\n                                                description: |-\n                                                  Namespace is the namespace of resource being referenced\n                                                  Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                                  (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                                type: string\n                                            required:\n                                            - kind\n                                            - name\n                                            type: object\n                                          resources:\n                                            description: |-\n                                              resources represents the minimum resources the volume should have.\n                                              If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                              that are lower than previous value but must still be higher than capacity recorded in the\n                                              status field of the claim.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                            properties:\n                                              limits:\n                                                additionalProperties:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                description: |-\n                                                  Limits describes the maximum amount of compute resources allowed.\n                                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                type: object\n                                              requests:\n                                                additionalProperties:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                description: |-\n                                                  Requests describes the minimum amount of compute resources required.\n                                                  If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                  otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                type: object\n                                            type: object\n                                          selector:\n                                            description: selector is a label query\n                                              over volumes to consider for binding.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          storageClassName:\n                                            description: |-\n                                              storageClassName is the name of the StorageClass required by the claim.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                            type: string\n                                          volumeAttributesClassName:\n                                            description: |-\n                                              volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                              If specified, the CSI driver will create or update the volume with the attributes defined\n                                              in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                              it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                              will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                              If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                              will be set by the persistentvolume controller if it exists.\n                                              If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                              set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                              exists.\n                                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                              (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                            type: string\n                                          volumeMode:\n                                            description: |-\n                                              volumeMode defines what type of volume is required by the claim.\n                                              Value of Filesystem is implied when not included in claim spec.\n                                            type: string\n                                          volumeName:\n                                            description: volumeName is the binding\n                                              reference to the PersistentVolume backing\n                                              this claim.\n                                            type: string\n                                        type: object\n                                    required:\n                                    - spec\n                                    type: object\n                                type: object\n                              fc:\n                                description: fc represents a Fibre Channel resource\n                                  that is attached to a kubelet's host machine and\n                                  then exposed to the pod.\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  lun:\n                                    description: 'lun is Optional: FC target lun number'\n                                    format: int32\n                                    type: integer\n                                  readOnly:\n                                    description: |-\n                                      readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  targetWWNs:\n                                    description: 'targetWWNs is Optional: FC target\n                                      worldwide names (WWNs)'\n                                    items:\n                                      type: string\n                                    type: array\n                                  wwids:\n                                    description: |-\n                                      wwids Optional: FC volume world wide identifiers (wwids)\n                                      Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                    items:\n                                      type: string\n                                    type: array\n                                type: object\n                              flexVolume:\n                                description: |-\n                                  flexVolume represents a generic volume resource that is\n                                  provisioned/attached using an exec based plugin.\n                                properties:\n                                  driver:\n                                    description: driver is the name of the driver\n                                      to use for this volume.\n                                    type: string\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                    type: string\n                                  options:\n                                    additionalProperties:\n                                      type: string\n                                    description: 'options is Optional: this field\n                                      holds extra command options if any.'\n                                    type: object\n                                  readOnly:\n                                    description: |-\n                                      readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef is Optional: secretRef is reference to the secret object containing\n                                      sensitive information to pass to the plugin scripts. This may be\n                                      empty if no secret object is specified. If the secret object\n                                      contains more than one secret, all secrets are passed to the plugin\n                                      scripts.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                required:\n                                - driver\n                                type: object\n                              flocker:\n                                description: flocker represents a Flocker volume attached\n                                  to a kubelet's host machine. This depends on the\n                                  Flocker control service being running\n                                properties:\n                                  datasetName:\n                                    description: |-\n                                      datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                      should be considered as deprecated\n                                    type: string\n                                  datasetUUID:\n                                    description: datasetUUID is the UUID of the dataset.\n                                      This is unique identifier of a Flocker dataset\n                                    type: string\n                                type: object\n                              gcePersistentDisk:\n                                description: |-\n                                  gcePersistentDisk represents a GCE Disk resource that is attached to a\n                                  kubelet's host machine and then exposed to the pod.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  partition:\n                                    description: |-\n                                      partition is the partition in the volume that you want to mount.\n                                      If omitted, the default is to mount by volume name.\n                                      Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                      Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    format: int32\n                                    type: integer\n                                  pdName:\n                                    description: |-\n                                      pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the ReadOnly setting in VolumeMounts.\n                                      Defaults to false.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    type: boolean\n                                required:\n                                - pdName\n                                type: object\n                              gitRepo:\n                                description: |-\n                                  gitRepo represents a git repository at a particular revision.\n                                  DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                                  EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                                  into the Pod's container.\n                                properties:\n                                  directory:\n                                    description: |-\n                                      directory is the target directory name.\n                                      Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                      git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                      the subdirectory with the given name.\n                                    type: string\n                                  repository:\n                                    description: repository is the URL\n                                    type: string\n                                  revision:\n                                    description: revision is the commit hash for the\n                                      specified revision.\n                                    type: string\n                                required:\n                                - repository\n                                type: object\n                              glusterfs:\n                                description: |-\n                                  glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                                properties:\n                                  endpoints:\n                                    description: |-\n                                      endpoints is the endpoint name that details Glusterfs topology.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                    type: string\n                                  path:\n                                    description: |-\n                                      path is the Glusterfs volume path.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                      Defaults to false.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                    type: boolean\n                                required:\n                                - endpoints\n                                - path\n                                type: object\n                              hostPath:\n                                description: |-\n                                  hostPath represents a pre-existing file or directory on the host\n                                  machine that is directly exposed to the container. This is generally\n                                  used for system agents or other privileged things that are allowed\n                                  to see the host machine. Most containers will NOT need this.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                  ---\n                                  TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                                  mount host directories as read/write.\n                                properties:\n                                  path:\n                                    description: |-\n                                      path of the directory on the host.\n                                      If the path is a symlink, it will follow the link to the real path.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                    type: string\n                                  type:\n                                    description: |-\n                                      type for HostPath Volume\n                                      Defaults to \"\"\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                    type: string\n                                required:\n                                - path\n                                type: object\n                              iscsi:\n                                description: |-\n                                  iscsi represents an ISCSI Disk resource that is attached to a\n                                  kubelet's host machine and then exposed to the pod.\n                                  More info: https://examples.k8s.io/volumes/iscsi/README.md\n                                properties:\n                                  chapAuthDiscovery:\n                                    description: chapAuthDiscovery defines whether\n                                      support iSCSI Discovery CHAP authentication\n                                    type: boolean\n                                  chapAuthSession:\n                                    description: chapAuthSession defines whether support\n                                      iSCSI Session CHAP authentication\n                                    type: boolean\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  initiatorName:\n                                    description: |-\n                                      initiatorName is the custom iSCSI Initiator Name.\n                                      If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                      <target portal>:<volume name> will be created for the connection.\n                                    type: string\n                                  iqn:\n                                    description: iqn is the target iSCSI Qualified\n                                      Name.\n                                    type: string\n                                  iscsiInterface:\n                                    description: |-\n                                      iscsiInterface is the interface Name that uses an iSCSI transport.\n                                      Defaults to 'default' (tcp).\n                                    type: string\n                                  lun:\n                                    description: lun represents iSCSI Target Lun number.\n                                    format: int32\n                                    type: integer\n                                  portals:\n                                    description: |-\n                                      portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                      is other than default (typically TCP ports 860 and 3260).\n                                    items:\n                                      type: string\n                                    type: array\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the ReadOnly setting in VolumeMounts.\n                                      Defaults to false.\n                                    type: boolean\n                                  secretRef:\n                                    description: secretRef is the CHAP Secret for\n                                      iSCSI target and initiator authentication\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  targetPortal:\n                                    description: |-\n                                      targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                      is other than default (typically TCP ports 860 and 3260).\n                                    type: string\n                                required:\n                                - iqn\n                                - lun\n                                - targetPortal\n                                type: object\n                              name:\n                                description: |-\n                                  name of the volume.\n                                  Must be a DNS_LABEL and unique within the pod.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                type: string\n                              nfs:\n                                description: |-\n                                  nfs represents an NFS mount on the host that shares a pod's lifetime\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                properties:\n                                  path:\n                                    description: |-\n                                      path that is exported by the NFS server.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the NFS export to be mounted with read-only permissions.\n                                      Defaults to false.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    type: boolean\n                                  server:\n                                    description: |-\n                                      server is the hostname or IP address of the NFS server.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    type: string\n                                required:\n                                - path\n                                - server\n                                type: object\n                              persistentVolumeClaim:\n                                description: |-\n                                  persistentVolumeClaimVolumeSource represents a reference to a\n                                  PersistentVolumeClaim in the same namespace.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                properties:\n                                  claimName:\n                                    description: |-\n                                      claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly Will force the ReadOnly setting in VolumeMounts.\n                                      Default false.\n                                    type: boolean\n                                required:\n                                - claimName\n                                type: object\n                              photonPersistentDisk:\n                                description: photonPersistentDisk represents a PhotonController\n                                  persistent disk attached and mounted on kubelets\n                                  host machine\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  pdID:\n                                    description: pdID is the ID that identifies Photon\n                                      Controller persistent disk\n                                    type: string\n                                required:\n                                - pdID\n                                type: object\n                              portworxVolume:\n                                description: portworxVolume represents a portworx\n                                  volume attached and mounted on kubelets host machine\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fSType represents the filesystem type to mount\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  volumeID:\n                                    description: volumeID uniquely identifies a Portworx\n                                      volume\n                                    type: string\n                                required:\n                                - volumeID\n                                type: object\n                              projected:\n                                description: projected items for all in one resources\n                                  secrets, configmaps, and downward API\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode are the mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  sources:\n                                    description: sources is the list of volume projections\n                                    items:\n                                      description: Projection that may be projected\n                                        along with other supported volume types\n                                      properties:\n                                        clusterTrustBundle:\n                                          description: |-\n                                            ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                            of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                            Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                            ClusterTrustBundle objects can either be selected by name, or by the\n                                            combination of signer name and a label selector.\n\n\n                                            Kubelet performs aggressive normalization of the PEM contents written\n                                            into the pod filesystem.  Esoteric PEM features such as inter-block\n                                            comments and block headers are stripped.  Certificates are deduplicated.\n                                            The ordering of certificates within the file is arbitrary, and Kubelet\n                                            may change the order over time.\n                                          properties:\n                                            labelSelector:\n                                              description: |-\n                                                Select all ClusterTrustBundles that match this label selector.  Only has\n                                                effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                                interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                                everything\".\n                                              properties:\n                                                matchExpressions:\n                                                  description: matchExpressions is\n                                                    a list of label selector requirements.\n                                                    The requirements are ANDed.\n                                                  items:\n                                                    description: |-\n                                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                                      relates the key and values.\n                                                    properties:\n                                                      key:\n                                                        description: key is the label\n                                                          key that the selector applies\n                                                          to.\n                                                        type: string\n                                                      operator:\n                                                        description: |-\n                                                          operator represents a key's relationship to a set of values.\n                                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                        type: string\n                                                      values:\n                                                        description: |-\n                                                          values is an array of string values. If the operator is In or NotIn,\n                                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                          the values array must be empty. This array is replaced during a strategic\n                                                          merge patch.\n                                                        items:\n                                                          type: string\n                                                        type: array\n                                                    required:\n                                                    - key\n                                                    - operator\n                                                    type: object\n                                                  type: array\n                                                matchLabels:\n                                                  additionalProperties:\n                                                    type: string\n                                                  description: |-\n                                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                  type: object\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            name:\n                                              description: |-\n                                                Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                                with signerName and labelSelector.\n                                              type: string\n                                            optional:\n                                              description: |-\n                                                If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                                aren't available.  If using name, then the named ClusterTrustBundle is\n                                                allowed not to exist.  If using signerName, then the combination of\n                                                signerName and labelSelector is allowed to match zero\n                                                ClusterTrustBundles.\n                                              type: boolean\n                                            path:\n                                              description: Relative path from the\n                                                volume root to write the bundle.\n                                              type: string\n                                            signerName:\n                                              description: |-\n                                                Select all ClusterTrustBundles that match this signer name.\n                                                Mutually-exclusive with name.  The contents of all selected\n                                                ClusterTrustBundles will be unified and deduplicated.\n                                              type: string\n                                          required:\n                                          - path\n                                          type: object\n                                        configMap:\n                                          description: configMap information about\n                                            the configMap data to project\n                                          properties:\n                                            items:\n                                              description: |-\n                                                items if unspecified, each key-value pair in the Data field of the referenced\n                                                ConfigMap will be projected into the volume as a file whose name is the\n                                                key and content is the value. If specified, the listed keys will be\n                                                projected into the specified paths, and unlisted keys will not be\n                                                present. If a key is specified which is not present in the ConfigMap,\n                                                the volume setup will error unless it is marked optional. Paths must be\n                                                relative and may not contain the '..' path or start with '..'.\n                                              items:\n                                                description: Maps a string key to\n                                                  a path within a volume.\n                                                properties:\n                                                  key:\n                                                    description: key is the key to\n                                                      project.\n                                                    type: string\n                                                  mode:\n                                                    description: |-\n                                                      mode is Optional: mode bits used to set permissions on this file.\n                                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                      If not specified, the volume defaultMode will be used.\n                                                      This might be in conflict with other options that affect the file\n                                                      mode, like fsGroup, and the result can be other mode bits set.\n                                                    format: int32\n                                                    type: integer\n                                                  path:\n                                                    description: |-\n                                                      path is the relative path of the file to map the key to.\n                                                      May not be an absolute path.\n                                                      May not contain the path element '..'.\n                                                      May not start with the string '..'.\n                                                    type: string\n                                                required:\n                                                - key\n                                                - path\n                                                type: object\n                                              type: array\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: optional specify whether\n                                                the ConfigMap or its keys must be\n                                                defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        downwardAPI:\n                                          description: downwardAPI information about\n                                            the downwardAPI data to project\n                                          properties:\n                                            items:\n                                              description: Items is a list of DownwardAPIVolume\n                                                file\n                                              items:\n                                                description: DownwardAPIVolumeFile\n                                                  represents information to create\n                                                  the file containing the pod field\n                                                properties:\n                                                  fieldRef:\n                                                    description: 'Required: Selects\n                                                      a field of the pod: only annotations,\n                                                      labels, name and namespace are\n                                                      supported.'\n                                                    properties:\n                                                      apiVersion:\n                                                        description: Version of the\n                                                          schema the FieldPath is\n                                                          written in terms of, defaults\n                                                          to \"v1\".\n                                                        type: string\n                                                      fieldPath:\n                                                        description: Path of the field\n                                                          to select in the specified\n                                                          API version.\n                                                        type: string\n                                                    required:\n                                                    - fieldPath\n                                                    type: object\n                                                    x-kubernetes-map-type: atomic\n                                                  mode:\n                                                    description: |-\n                                                      Optional: mode bits used to set permissions on this file, must be an octal value\n                                                      between 0000 and 0777 or a decimal value between 0 and 511.\n                                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                      If not specified, the volume defaultMode will be used.\n                                                      This might be in conflict with other options that affect the file\n                                                      mode, like fsGroup, and the result can be other mode bits set.\n                                                    format: int32\n                                                    type: integer\n                                                  path:\n                                                    description: 'Required: Path is  the\n                                                      relative path name of the file\n                                                      to be created. Must not be absolute\n                                                      or contain the ''..'' path.\n                                                      Must be utf-8 encoded. The first\n                                                      item of the relative path must\n                                                      not start with ''..'''\n                                                    type: string\n                                                  resourceFieldRef:\n                                                    description: |-\n                                                      Selects a resource of the container: only resources limits and requests\n                                                      (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                    properties:\n                                                      containerName:\n                                                        description: 'Container name:\n                                                          required for volumes, optional\n                                                          for env vars'\n                                                        type: string\n                                                      divisor:\n                                                        anyOf:\n                                                        - type: integer\n                                                        - type: string\n                                                        description: Specifies the\n                                                          output format of the exposed\n                                                          resources, defaults to \"1\"\n                                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                        x-kubernetes-int-or-string: true\n                                                      resource:\n                                                        description: 'Required: resource\n                                                          to select'\n                                                        type: string\n                                                    required:\n                                                    - resource\n                                                    type: object\n                                                    x-kubernetes-map-type: atomic\n                                                required:\n                                                - path\n                                                type: object\n                                              type: array\n                                          type: object\n                                        secret:\n                                          description: secret information about the\n                                            secret data to project\n                                          properties:\n                                            items:\n                                              description: |-\n                                                items if unspecified, each key-value pair in the Data field of the referenced\n                                                Secret will be projected into the volume as a file whose name is the\n                                                key and content is the value. If specified, the listed keys will be\n                                                projected into the specified paths, and unlisted keys will not be\n                                                present. If a key is specified which is not present in the Secret,\n                                                the volume setup will error unless it is marked optional. Paths must be\n                                                relative and may not contain the '..' path or start with '..'.\n                                              items:\n                                                description: Maps a string key to\n                                                  a path within a volume.\n                                                properties:\n                                                  key:\n                                                    description: key is the key to\n                                                      project.\n                                                    type: string\n                                                  mode:\n                                                    description: |-\n                                                      mode is Optional: mode bits used to set permissions on this file.\n                                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                      If not specified, the volume defaultMode will be used.\n                                                      This might be in conflict with other options that affect the file\n                                                      mode, like fsGroup, and the result can be other mode bits set.\n                                                    format: int32\n                                                    type: integer\n                                                  path:\n                                                    description: |-\n                                                      path is the relative path of the file to map the key to.\n                                                      May not be an absolute path.\n                                                      May not contain the path element '..'.\n                                                      May not start with the string '..'.\n                                                    type: string\n                                                required:\n                                                - key\n                                                - path\n                                                type: object\n                                              type: array\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: optional field specify\n                                                whether the Secret or its key must\n                                                be defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        serviceAccountToken:\n                                          description: serviceAccountToken is information\n                                            about the serviceAccountToken data to\n                                            project\n                                          properties:\n                                            audience:\n                                              description: |-\n                                                audience is the intended audience of the token. A recipient of a token\n                                                must identify itself with an identifier specified in the audience of the\n                                                token, and otherwise should reject the token. The audience defaults to the\n                                                identifier of the apiserver.\n                                              type: string\n                                            expirationSeconds:\n                                              description: |-\n                                                expirationSeconds is the requested duration of validity of the service\n                                                account token. As the token approaches expiration, the kubelet volume\n                                                plugin will proactively rotate the service account token. The kubelet will\n                                                start trying to rotate the token if the token is older than 80 percent of\n                                                its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                                and must be at least 10 minutes.\n                                              format: int64\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the path relative to the mount point of the file to project the\n                                                token into.\n                                              type: string\n                                          required:\n                                          - path\n                                          type: object\n                                      type: object\n                                    type: array\n                                type: object\n                              quobyte:\n                                description: quobyte represents a Quobyte mount on\n                                  the host that shares a pod's lifetime\n                                properties:\n                                  group:\n                                    description: |-\n                                      group to map volume access to\n                                      Default is no group\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                      Defaults to false.\n                                    type: boolean\n                                  registry:\n                                    description: |-\n                                      registry represents a single or multiple Quobyte Registry services\n                                      specified as a string as host:port pair (multiple entries are separated with commas)\n                                      which acts as the central registry for volumes\n                                    type: string\n                                  tenant:\n                                    description: |-\n                                      tenant owning the given Quobyte volume in the Backend\n                                      Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                    type: string\n                                  user:\n                                    description: |-\n                                      user to map volume access to\n                                      Defaults to serivceaccount user\n                                    type: string\n                                  volume:\n                                    description: volume is a string that references\n                                      an already created Quobyte volume by name.\n                                    type: string\n                                required:\n                                - registry\n                                - volume\n                                type: object\n                              rbd:\n                                description: |-\n                                  rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type of the volume that you want to mount.\n                                      Tip: Ensure that the filesystem type is supported by the host operating system.\n                                      Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                      TODO: how do we prevent errors in the filesystem from compromising the machine\n                                    type: string\n                                  image:\n                                    description: |-\n                                      image is the rados image name.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                  keyring:\n                                    description: |-\n                                      keyring is the path to key ring for RBDUser.\n                                      Default is /etc/ceph/keyring.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                  monitors:\n                                    description: |-\n                                      monitors is a collection of Ceph monitors.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    items:\n                                      type: string\n                                    type: array\n                                  pool:\n                                    description: |-\n                                      pool is the rados pool name.\n                                      Default is rbd.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly here will force the ReadOnly setting in VolumeMounts.\n                                      Defaults to false.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef is name of the authentication secret for RBDUser. If provided\n                                      overrides keyring.\n                                      Default is nil.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  user:\n                                    description: |-\n                                      user is the rados user name.\n                                      Default is admin.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                    type: string\n                                required:\n                                - image\n                                - monitors\n                                type: object\n                              scaleIO:\n                                description: scaleIO represents a ScaleIO persistent\n                                  volume attached and mounted on Kubernetes nodes.\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                      Default is \"xfs\".\n                                    type: string\n                                  gateway:\n                                    description: gateway is the host address of the\n                                      ScaleIO API Gateway.\n                                    type: string\n                                  protectionDomain:\n                                    description: protectionDomain is the name of the\n                                      ScaleIO Protection Domain for the configured\n                                      storage.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly Defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef references to the secret for ScaleIO user and other\n                                      sensitive information. If this is not provided, Login operation will fail.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  sslEnabled:\n                                    description: sslEnabled Flag enable/disable SSL\n                                      communication with Gateway, default false\n                                    type: boolean\n                                  storageMode:\n                                    description: |-\n                                      storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                      Default is ThinProvisioned.\n                                    type: string\n                                  storagePool:\n                                    description: storagePool is the ScaleIO Storage\n                                      Pool associated with the protection domain.\n                                    type: string\n                                  system:\n                                    description: system is the name of the storage\n                                      system as configured in ScaleIO.\n                                    type: string\n                                  volumeName:\n                                    description: |-\n                                      volumeName is the name of a volume already created in the ScaleIO system\n                                      that is associated with this volume source.\n                                    type: string\n                                required:\n                                - gateway\n                                - secretRef\n                                - system\n                                type: object\n                              secret:\n                                description: |-\n                                  secret represents a secret that should populate this volume.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                properties:\n                                  defaultMode:\n                                    description: |-\n                                      defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values\n                                      for mode bits. Defaults to 0644.\n                                      Directories within the path are not affected by this setting.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  items:\n                                    description: |-\n                                      items If unspecified, each key-value pair in the Data field of the referenced\n                                      Secret will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the Secret,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  optional:\n                                    description: optional field specify whether the\n                                      Secret or its keys must be defined\n                                    type: boolean\n                                  secretName:\n                                    description: |-\n                                      secretName is the name of the secret in the pod's namespace to use.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                    type: string\n                                type: object\n                              storageos:\n                                description: storageOS represents a StorageOS volume\n                                  attached and mounted on Kubernetes nodes.\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is the filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      readOnly defaults to false (read/write). ReadOnly here will force\n                                      the ReadOnly setting in VolumeMounts.\n                                    type: boolean\n                                  secretRef:\n                                    description: |-\n                                      secretRef specifies the secret to use for obtaining the StorageOS API\n                                      credentials.  If not specified, default values will be attempted.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  volumeName:\n                                    description: |-\n                                      volumeName is the human-readable name of the StorageOS volume.  Volume\n                                      names are only unique within a namespace.\n                                    type: string\n                                  volumeNamespace:\n                                    description: |-\n                                      volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                      namespace is specified then the Pod's namespace will be used.  This allows the\n                                      Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                      Set VolumeName to any name to override the default behaviour.\n                                      Set to \"default\" if you are not using namespaces within StorageOS.\n                                      Namespaces that do not pre-exist within StorageOS will be created.\n                                    type: string\n                                type: object\n                              vsphereVolume:\n                                description: vsphereVolume represents a vSphere volume\n                                  attached and mounted on kubelets host machine\n                                properties:\n                                  fsType:\n                                    description: |-\n                                      fsType is filesystem type to mount.\n                                      Must be a filesystem type supported by the host operating system.\n                                      Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    type: string\n                                  storagePolicyID:\n                                    description: storagePolicyID is the storage Policy\n                                      Based Management (SPBM) profile ID associated\n                                      with the StoragePolicyName.\n                                    type: string\n                                  storagePolicyName:\n                                    description: storagePolicyName is the storage\n                                      Policy Based Management (SPBM) profile name.\n                                    type: string\n                                  volumePath:\n                                    description: volumePath is the path that identifies\n                                      vSphere volume vmdk\n                                    type: string\n                                required:\n                                - volumePath\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                      required:\n                      - replicas\n                      type: object\n                  required:\n                  - name\n                  - template\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              storage:\n                description: |-\n                  Specifies the storage of the first componentSpec, if the storage of the first componentSpec is specified,\n                  this value will be ignored.\n\n\n                  Deprecated since v0.9.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                properties:\n                  size:\n                    anyOf:\n                    - type: integer\n                    - type: string\n                    description: |-\n                      Specifies the amount of storage the Cluster needs.\n                      For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                    x-kubernetes-int-or-string: true\n                type: object\n              tenancy:\n                description: |-\n                  Describes how Pods are distributed across node.\n\n\n                  Deprecated since v0.9.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                enum:\n                - SharedNode\n                - DedicatedNode\n                type: string\n              terminationPolicy:\n                description: |-\n                  Specifies the behavior when a Cluster is deleted.\n                  It defines how resources, data, and backups associated with a Cluster are managed during termination.\n                  Choose a policy based on the desired level of resource cleanup and data preservation:\n\n\n                  - `DoNotTerminate`: Prevents deletion of the Cluster. This policy ensures that all resources remain intact.\n                  - `Halt`: Deletes Cluster resources like Pods and Services but retains Persistent Volume Claims (PVCs),\n                    allowing for data preservation while stopping other operations.\n                     Warning: Halt policy is deprecated in 0.9.1 and will have same meaning as DoNotTerminate.\n                  - `Delete`: Extends the `Halt` policy by also removing PVCs, leading to a thorough cleanup while\n                    removing all persistent data.\n                  - `WipeOut`: An aggressive policy that deletes all Cluster resources, including volume snapshots and\n                    backups in external storage.\n                    This results in complete data removal and should be used cautiously, primarily in non-production environments\n                    to avoid irreversible data loss.\n\n\n                  Warning: Choosing an inappropriate termination policy can result in data loss.\n                  The `WipeOut` policy is particularly risky in production environments due to its irreversible nature.\n                enum:\n                - DoNotTerminate\n                - Halt\n                - Delete\n                - WipeOut\n                type: string\n              tolerations:\n                description: |-\n                  An array that specifies tolerations attached to the Cluster's Pods,\n                  allowing them to be scheduled onto nodes with matching taints.\n\n\n                  Deprecated since v0.10. Use the `schedulingPolicy` field instead.\n                items:\n                  description: |-\n                    The pod this Toleration is attached to tolerates any taint that matches\n                    the triple <key,value,effect> using the matching operator <operator>.\n                  properties:\n                    effect:\n                      description: |-\n                        Effect indicates the taint effect to match. Empty means match all taint effects.\n                        When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                      type: string\n                    key:\n                      description: |-\n                        Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                        If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                      type: string\n                    operator:\n                      description: |-\n                        Operator represents a key's relationship to the value.\n                        Valid operators are Exists and Equal. Defaults to Equal.\n                        Exists is equivalent to wildcard for value, so that a pod can\n                        tolerate all taints of a particular category.\n                      type: string\n                    tolerationSeconds:\n                      description: |-\n                        TolerationSeconds represents the period of time the toleration (which must be\n                        of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                        it is not set, which means tolerate the taint forever (do not evict). Zero and\n                        negative values will be treated as 0 (evict immediately) by the system.\n                      format: int64\n                      type: integer\n                    value:\n                      description: |-\n                        Value is the taint value the toleration matches to.\n                        If the operator is Exists, the value should be empty, otherwise just a regular string.\n                      type: string\n                  type: object\n                type: array\n                x-kubernetes-preserve-unknown-fields: true\n              topology:\n                description: |-\n                  Specifies the name of the ClusterTopology to be used when creating the Cluster.\n\n\n                  This field defines which set of Components, as outlined in the ClusterDefinition, will be used to\n                  construct the Cluster based on the named topology.\n                  The ClusterDefinition may list multiple topologies under `clusterdefinition.spec.topologies[*]`,\n                  each tailored to different use cases or environments.\n\n\n                  If `topology` is not specified, the Cluster will use the default topology defined in the ClusterDefinition.\n\n\n                  Note: Once set during the Cluster creation, the `topology` field cannot be modified.\n                  It establishes the initial composition and structure of the Cluster and is intended for one-time configuration.\n                maxLength: 32\n                type: string\n            required:\n            - terminationPolicy\n            type: object\n          status:\n            description: ClusterStatus defines the observed state of the Cluster.\n            properties:\n              clusterDefGeneration:\n                description: Represents the generation number of the referenced ClusterDefinition.\n                format: int64\n                type: integer\n              components:\n                additionalProperties:\n                  description: ClusterComponentStatus records Component status.\n                  properties:\n                    membersStatus:\n                      description: Represents the status of the members.\n                      items:\n                        properties:\n                          podName:\n                            default: Unknown\n                            description: Represents the name of the pod.\n                            type: string\n                          role:\n                            description: Defines the role of the replica in the cluster.\n                            properties:\n                              accessMode:\n                                default: ReadWrite\n                                description: Specifies the service capabilities of\n                                  this member.\n                                enum:\n                                - None\n                                - Readonly\n                                - ReadWrite\n                                type: string\n                              canVote:\n                                default: true\n                                description: Indicates if this member has voting rights.\n                                type: boolean\n                              isLeader:\n                                default: false\n                                description: Determines if this member is the leader.\n                                type: boolean\n                              name:\n                                default: leader\n                                description: Defines the role name of the replica.\n                                type: string\n                            required:\n                            - accessMode\n                            - name\n                            type: object\n                        required:\n                        - podName\n                        type: object\n                      type: array\n                    message:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Records detailed information about the Component in its current phase.\n                        The keys are either podName, deployName, or statefulSetName, formatted as 'ObjectKind/Name'.\n                      type: object\n                    phase:\n                      description: Specifies the current state of the Component.\n                      enum:\n                      - Creating\n                      - Running\n                      - Updating\n                      - Stopping\n                      - Stopped\n                      - Deleting\n                      - Failed\n                      - Abnormal\n                      type: string\n                    podsReady:\n                      description: Checks if all Pods of the Component are ready.\n                      type: boolean\n                    podsReadyTime:\n                      description: |-\n                        Indicates the time when all Component Pods became ready.\n                        This is the readiness time of the last Component Pod.\n                      format: date-time\n                      type: string\n                  type: object\n                description: Records the current status information of all Components\n                  within the Cluster.\n                type: object\n              conditions:\n                description: |-\n                  Represents a list of detailed status of the Cluster object.\n                  Each condition in the list provides real-time information about certain aspect of the Cluster object.\n\n\n                  This field is crucial for administrators and developers to monitor and respond to changes within the Cluster.\n                  It provides a history of state transitions and a snapshot of the current state that can be used for\n                  automated logic or direct inspection.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: The most recent generation number of the Cluster object\n                  that has been observed by the controller.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  The current phase of the Cluster includes:\n                  `Creating`, `Running`, `Updating`, `Stopping`, `Stopped`, `Deleting`, `Failed`, `Abnormal`.\n                enum:\n                - Creating\n                - Running\n                - Updating\n                - Stopping\n                - Stopped\n                - Deleting\n                - Failed\n                - Abnormal\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: false\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: componentdefinitions.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ComponentDefinition\n    listKind: ComponentDefinitionList\n    plural: componentdefinitions\n    shortNames:\n    - cmpd\n    singular: componentdefinition\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: service\n      jsonPath: .spec.serviceKind\n      name: SERVICE\n      type: string\n    - description: service version\n      jsonPath: .spec.serviceVersion\n      name: SERVICE-VERSION\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          ComponentDefinition serves as a reusable blueprint for creating Components,\n          encapsulating essential static settings such as Component description,\n          Pod templates, configuration file templates, scripts, parameter lists,\n          injected environment variables and their sources, and event handlers.\n          ComponentDefinition works in conjunction with dynamic settings from the ClusterComponentSpec,\n          to instantiate Components during Cluster creation.\n\n\n          Key aspects that can be defined in a ComponentDefinition include:\n\n\n          - PodSpec template: Specifies the PodSpec template used by the Component.\n          - Configuration templates: Specify the configuration file templates required by the Component.\n          - Scripts: Provide the necessary scripts for Component management and operations.\n          - Storage volumes: Specify the storage volumes and their configurations for the Component.\n          - Pod roles: Outlines various roles of Pods within the Component along with their capabilities.\n          - Exposed Kubernetes Services: Specify the Services that need to be exposed by the Component.\n          - System accounts: Define the system accounts required for the Component.\n          - Monitoring and logging: Configure the exporter and logging settings for the Component.\n\n\n          ComponentDefinitions also enable defining reactive behaviors of the Component in response to events,\n          such as member join/leave, Component addition/deletion, role changes, switch over, and more.\n          This allows for automatic event handling, thus encapsulating complex behaviors within the Component.\n\n\n          Referencing a ComponentDefinition when creating individual Components ensures inheritance of predefined configurations,\n          promoting reusability and consistency across different deployments and cluster topologies.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            properties:\n              annotations:\n                additionalProperties:\n                  type: string\n                description: |-\n                  Specifies static annotations that will be patched to all Kubernetes resources created for the Component.\n\n\n                  Note: If an annotation key in the `annotations` field conflicts with any system annotations\n                  or user-specified annotations, it will be silently ignored to avoid overriding higher-priority annotations.\n\n\n                  This field is immutable.\n                type: object\n              available:\n                description: |-\n                  Specifies the strategies for determining the available status of the Component.\n\n\n                  This field is immutable.\n                properties:\n                  withPhases:\n                    description: |-\n                      Specifies the phases that the component will go through to be considered available.\n\n\n                      This field is immutable once set.\n                    type: string\n                  withProbe:\n                    description: |-\n                      Specifies the strategies for determining whether the component is available based on the available probe.\n\n\n                      If specified, it will take precedence over the WithPhases and WithRole fields.\n\n\n                      This field is immutable once set.\n                    properties:\n                      condition:\n                        description: |-\n                          Specifies the conditions that the component will go through to be considered available.\n\n\n                          This field is immutable once set.\n                        properties:\n                          all:\n                            description: |-\n                              All replicas must satisfy the assertion.\n\n\n                              This field is immutable once set.\n                            properties:\n                              and:\n                                description: |-\n                                  Logical And to combine multiple assertions.\n\n\n                                  This field is immutable once set.\n                                items:\n                                  description: ActionAssertion defines the custom\n                                    assertions for evaluating the success or failure\n                                    of an action.\n                                  properties:\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                type: array\n                              not:\n                                description: |-\n                                  Logical Not to negate the assertions.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  stderr:\n                                    description: |-\n                                      Specifies the stderr matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  stdout:\n                                    description: |-\n                                      Specifies the stdout matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  succeed:\n                                    description: |-\n                                      Whether the action should succeed or fail.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                type: object\n                              or:\n                                description: |-\n                                  Logical Or to combine multiple assertions.\n\n\n                                  This field is immutable once set.\n                                items:\n                                  description: ActionAssertion defines the custom\n                                    assertions for evaluating the success or failure\n                                    of an action.\n                                  properties:\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                type: array\n                              stderr:\n                                description: |-\n                                  Specifies the stderr matcher for the action.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  contains:\n                                    description: |-\n                                      The output of the action should contain the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                  equalTo:\n                                    description: |-\n                                      The output of the action should be equal to the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                type: object\n                              stdout:\n                                description: |-\n                                  Specifies the stdout matcher for the action.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  contains:\n                                    description: |-\n                                      The output of the action should contain the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                  equalTo:\n                                    description: |-\n                                      The output of the action should be equal to the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                type: object\n                              strict:\n                                description: |-\n                                  Specifies whether apply the assertions strictly to all replicas.\n\n\n                                  This field is immutable once set.\n                                type: boolean\n                              succeed:\n                                description: |-\n                                  Whether the action should succeed or fail.\n\n\n                                  This field is immutable once set.\n                                type: boolean\n                            type: object\n                          and:\n                            description: |-\n                              Logical And to combine multiple expressions.\n\n\n                              This field is immutable once set.\n                            items:\n                              properties:\n                                all:\n                                  description: |-\n                                    All replicas must satisfy the assertion.\n\n\n                                    This field is immutable once set.\n                                  properties:\n                                    and:\n                                      description: |-\n                                        Logical And to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    not:\n                                      description: |-\n                                        Logical Not to negate the assertions.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    or:\n                                      description: |-\n                                        Logical Or to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    strict:\n                                      description: |-\n                                        Specifies whether apply the assertions strictly to all replicas.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                any:\n                                  description: |-\n                                    At least one replica must satisfy the assertion.\n\n\n                                    This field is immutable once set.\n                                  properties:\n                                    and:\n                                      description: |-\n                                        Logical And to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    not:\n                                      description: |-\n                                        Logical Not to negate the assertions.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    or:\n                                      description: |-\n                                        Logical Or to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    strict:\n                                      description: |-\n                                        Specifies whether apply the assertions strictly to all replicas.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                majority:\n                                  description: |-\n                                    Majority replicas must satisfy the assertion.\n\n\n                                    This field is immutable once set.\n                                  properties:\n                                    and:\n                                      description: |-\n                                        Logical And to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    not:\n                                      description: |-\n                                        Logical Not to negate the assertions.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    or:\n                                      description: |-\n                                        Logical Or to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    strict:\n                                      description: |-\n                                        Specifies whether apply the assertions strictly to all replicas.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                none:\n                                  description: |-\n                                    None of the replicas must satisfy the assertion.\n\n\n                                    This field is immutable once set.\n                                  properties:\n                                    and:\n                                      description: |-\n                                        Logical And to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    not:\n                                      description: |-\n                                        Logical Not to negate the assertions.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    or:\n                                      description: |-\n                                        Logical Or to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    strict:\n                                      description: |-\n                                        Specifies whether apply the assertions strictly to all replicas.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                              type: object\n                            type: array\n                          any:\n                            description: |-\n                              At least one replica must satisfy the assertion.\n\n\n                              This field is immutable once set.\n                            properties:\n                              and:\n                                description: |-\n                                  Logical And to combine multiple assertions.\n\n\n                                  This field is immutable once set.\n                                items:\n                                  description: ActionAssertion defines the custom\n                                    assertions for evaluating the success or failure\n                                    of an action.\n                                  properties:\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                type: array\n                              not:\n                                description: |-\n                                  Logical Not to negate the assertions.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  stderr:\n                                    description: |-\n                                      Specifies the stderr matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  stdout:\n                                    description: |-\n                                      Specifies the stdout matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  succeed:\n                                    description: |-\n                                      Whether the action should succeed or fail.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                type: object\n                              or:\n                                description: |-\n                                  Logical Or to combine multiple assertions.\n\n\n                                  This field is immutable once set.\n                                items:\n                                  description: ActionAssertion defines the custom\n                                    assertions for evaluating the success or failure\n                                    of an action.\n                                  properties:\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                type: array\n                              stderr:\n                                description: |-\n                                  Specifies the stderr matcher for the action.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  contains:\n                                    description: |-\n                                      The output of the action should contain the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                  equalTo:\n                                    description: |-\n                                      The output of the action should be equal to the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                type: object\n                              stdout:\n                                description: |-\n                                  Specifies the stdout matcher for the action.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  contains:\n                                    description: |-\n                                      The output of the action should contain the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                  equalTo:\n                                    description: |-\n                                      The output of the action should be equal to the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                type: object\n                              strict:\n                                description: |-\n                                  Specifies whether apply the assertions strictly to all replicas.\n\n\n                                  This field is immutable once set.\n                                type: boolean\n                              succeed:\n                                description: |-\n                                  Whether the action should succeed or fail.\n\n\n                                  This field is immutable once set.\n                                type: boolean\n                            type: object\n                          majority:\n                            description: |-\n                              Majority replicas must satisfy the assertion.\n\n\n                              This field is immutable once set.\n                            properties:\n                              and:\n                                description: |-\n                                  Logical And to combine multiple assertions.\n\n\n                                  This field is immutable once set.\n                                items:\n                                  description: ActionAssertion defines the custom\n                                    assertions for evaluating the success or failure\n                                    of an action.\n                                  properties:\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                type: array\n                              not:\n                                description: |-\n                                  Logical Not to negate the assertions.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  stderr:\n                                    description: |-\n                                      Specifies the stderr matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  stdout:\n                                    description: |-\n                                      Specifies the stdout matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  succeed:\n                                    description: |-\n                                      Whether the action should succeed or fail.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                type: object\n                              or:\n                                description: |-\n                                  Logical Or to combine multiple assertions.\n\n\n                                  This field is immutable once set.\n                                items:\n                                  description: ActionAssertion defines the custom\n                                    assertions for evaluating the success or failure\n                                    of an action.\n                                  properties:\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                type: array\n                              stderr:\n                                description: |-\n                                  Specifies the stderr matcher for the action.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  contains:\n                                    description: |-\n                                      The output of the action should contain the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                  equalTo:\n                                    description: |-\n                                      The output of the action should be equal to the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                type: object\n                              stdout:\n                                description: |-\n                                  Specifies the stdout matcher for the action.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  contains:\n                                    description: |-\n                                      The output of the action should contain the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                  equalTo:\n                                    description: |-\n                                      The output of the action should be equal to the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                type: object\n                              strict:\n                                description: |-\n                                  Specifies whether apply the assertions strictly to all replicas.\n\n\n                                  This field is immutable once set.\n                                type: boolean\n                              succeed:\n                                description: |-\n                                  Whether the action should succeed or fail.\n\n\n                                  This field is immutable once set.\n                                type: boolean\n                            type: object\n                          none:\n                            description: |-\n                              None of the replicas must satisfy the assertion.\n\n\n                              This field is immutable once set.\n                            properties:\n                              and:\n                                description: |-\n                                  Logical And to combine multiple assertions.\n\n\n                                  This field is immutable once set.\n                                items:\n                                  description: ActionAssertion defines the custom\n                                    assertions for evaluating the success or failure\n                                    of an action.\n                                  properties:\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                type: array\n                              not:\n                                description: |-\n                                  Logical Not to negate the assertions.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  stderr:\n                                    description: |-\n                                      Specifies the stderr matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  stdout:\n                                    description: |-\n                                      Specifies the stdout matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  succeed:\n                                    description: |-\n                                      Whether the action should succeed or fail.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                type: object\n                              or:\n                                description: |-\n                                  Logical Or to combine multiple assertions.\n\n\n                                  This field is immutable once set.\n                                items:\n                                  description: ActionAssertion defines the custom\n                                    assertions for evaluating the success or failure\n                                    of an action.\n                                  properties:\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                type: array\n                              stderr:\n                                description: |-\n                                  Specifies the stderr matcher for the action.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  contains:\n                                    description: |-\n                                      The output of the action should contain the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                  equalTo:\n                                    description: |-\n                                      The output of the action should be equal to the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                type: object\n                              stdout:\n                                description: |-\n                                  Specifies the stdout matcher for the action.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  contains:\n                                    description: |-\n                                      The output of the action should contain the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                  equalTo:\n                                    description: |-\n                                      The output of the action should be equal to the specified value.\n\n\n                                      This field is immutable once set.\n                                    type: string\n                                type: object\n                              strict:\n                                description: |-\n                                  Specifies whether apply the assertions strictly to all replicas.\n\n\n                                  This field is immutable once set.\n                                type: boolean\n                              succeed:\n                                description: |-\n                                  Whether the action should succeed or fail.\n\n\n                                  This field is immutable once set.\n                                type: boolean\n                            type: object\n                          not:\n                            description: |-\n                              Logical Not to negate the expression.\n\n\n                              This field is immutable once set.\n                            properties:\n                              all:\n                                description: |-\n                                  All replicas must satisfy the assertion.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  and:\n                                    description: |-\n                                      Logical And to combine multiple assertions.\n\n\n                                      This field is immutable once set.\n                                    items:\n                                      description: ActionAssertion defines the custom\n                                        assertions for evaluating the success or failure\n                                        of an action.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    type: array\n                                  not:\n                                    description: |-\n                                      Logical Not to negate the assertions.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      stderr:\n                                        description: |-\n                                          Specifies the stderr matcher for the action.\n\n\n                                          This field is immutable once set.\n                                        properties:\n                                          contains:\n                                            description: |-\n                                              The output of the action should contain the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                          equalTo:\n                                            description: |-\n                                              The output of the action should be equal to the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                        type: object\n                                      stdout:\n                                        description: |-\n                                          Specifies the stdout matcher for the action.\n\n\n                                          This field is immutable once set.\n                                        properties:\n                                          contains:\n                                            description: |-\n                                              The output of the action should contain the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                          equalTo:\n                                            description: |-\n                                              The output of the action should be equal to the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                        type: object\n                                      succeed:\n                                        description: |-\n                                          Whether the action should succeed or fail.\n\n\n                                          This field is immutable once set.\n                                        type: boolean\n                                    type: object\n                                  or:\n                                    description: |-\n                                      Logical Or to combine multiple assertions.\n\n\n                                      This field is immutable once set.\n                                    items:\n                                      description: ActionAssertion defines the custom\n                                        assertions for evaluating the success or failure\n                                        of an action.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    type: array\n                                  stderr:\n                                    description: |-\n                                      Specifies the stderr matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  stdout:\n                                    description: |-\n                                      Specifies the stdout matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  strict:\n                                    description: |-\n                                      Specifies whether apply the assertions strictly to all replicas.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                  succeed:\n                                    description: |-\n                                      Whether the action should succeed or fail.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                type: object\n                              any:\n                                description: |-\n                                  At least one replica must satisfy the assertion.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  and:\n                                    description: |-\n                                      Logical And to combine multiple assertions.\n\n\n                                      This field is immutable once set.\n                                    items:\n                                      description: ActionAssertion defines the custom\n                                        assertions for evaluating the success or failure\n                                        of an action.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    type: array\n                                  not:\n                                    description: |-\n                                      Logical Not to negate the assertions.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      stderr:\n                                        description: |-\n                                          Specifies the stderr matcher for the action.\n\n\n                                          This field is immutable once set.\n                                        properties:\n                                          contains:\n                                            description: |-\n                                              The output of the action should contain the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                          equalTo:\n                                            description: |-\n                                              The output of the action should be equal to the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                        type: object\n                                      stdout:\n                                        description: |-\n                                          Specifies the stdout matcher for the action.\n\n\n                                          This field is immutable once set.\n                                        properties:\n                                          contains:\n                                            description: |-\n                                              The output of the action should contain the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                          equalTo:\n                                            description: |-\n                                              The output of the action should be equal to the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                        type: object\n                                      succeed:\n                                        description: |-\n                                          Whether the action should succeed or fail.\n\n\n                                          This field is immutable once set.\n                                        type: boolean\n                                    type: object\n                                  or:\n                                    description: |-\n                                      Logical Or to combine multiple assertions.\n\n\n                                      This field is immutable once set.\n                                    items:\n                                      description: ActionAssertion defines the custom\n                                        assertions for evaluating the success or failure\n                                        of an action.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    type: array\n                                  stderr:\n                                    description: |-\n                                      Specifies the stderr matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  stdout:\n                                    description: |-\n                                      Specifies the stdout matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  strict:\n                                    description: |-\n                                      Specifies whether apply the assertions strictly to all replicas.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                  succeed:\n                                    description: |-\n                                      Whether the action should succeed or fail.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                type: object\n                              majority:\n                                description: |-\n                                  Majority replicas must satisfy the assertion.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  and:\n                                    description: |-\n                                      Logical And to combine multiple assertions.\n\n\n                                      This field is immutable once set.\n                                    items:\n                                      description: ActionAssertion defines the custom\n                                        assertions for evaluating the success or failure\n                                        of an action.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    type: array\n                                  not:\n                                    description: |-\n                                      Logical Not to negate the assertions.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      stderr:\n                                        description: |-\n                                          Specifies the stderr matcher for the action.\n\n\n                                          This field is immutable once set.\n                                        properties:\n                                          contains:\n                                            description: |-\n                                              The output of the action should contain the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                          equalTo:\n                                            description: |-\n                                              The output of the action should be equal to the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                        type: object\n                                      stdout:\n                                        description: |-\n                                          Specifies the stdout matcher for the action.\n\n\n                                          This field is immutable once set.\n                                        properties:\n                                          contains:\n                                            description: |-\n                                              The output of the action should contain the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                          equalTo:\n                                            description: |-\n                                              The output of the action should be equal to the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                        type: object\n                                      succeed:\n                                        description: |-\n                                          Whether the action should succeed or fail.\n\n\n                                          This field is immutable once set.\n                                        type: boolean\n                                    type: object\n                                  or:\n                                    description: |-\n                                      Logical Or to combine multiple assertions.\n\n\n                                      This field is immutable once set.\n                                    items:\n                                      description: ActionAssertion defines the custom\n                                        assertions for evaluating the success or failure\n                                        of an action.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    type: array\n                                  stderr:\n                                    description: |-\n                                      Specifies the stderr matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  stdout:\n                                    description: |-\n                                      Specifies the stdout matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  strict:\n                                    description: |-\n                                      Specifies whether apply the assertions strictly to all replicas.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                  succeed:\n                                    description: |-\n                                      Whether the action should succeed or fail.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                type: object\n                              none:\n                                description: |-\n                                  None of the replicas must satisfy the assertion.\n\n\n                                  This field is immutable once set.\n                                properties:\n                                  and:\n                                    description: |-\n                                      Logical And to combine multiple assertions.\n\n\n                                      This field is immutable once set.\n                                    items:\n                                      description: ActionAssertion defines the custom\n                                        assertions for evaluating the success or failure\n                                        of an action.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    type: array\n                                  not:\n                                    description: |-\n                                      Logical Not to negate the assertions.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      stderr:\n                                        description: |-\n                                          Specifies the stderr matcher for the action.\n\n\n                                          This field is immutable once set.\n                                        properties:\n                                          contains:\n                                            description: |-\n                                              The output of the action should contain the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                          equalTo:\n                                            description: |-\n                                              The output of the action should be equal to the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                        type: object\n                                      stdout:\n                                        description: |-\n                                          Specifies the stdout matcher for the action.\n\n\n                                          This field is immutable once set.\n                                        properties:\n                                          contains:\n                                            description: |-\n                                              The output of the action should contain the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                          equalTo:\n                                            description: |-\n                                              The output of the action should be equal to the specified value.\n\n\n                                              This field is immutable once set.\n                                            type: string\n                                        type: object\n                                      succeed:\n                                        description: |-\n                                          Whether the action should succeed or fail.\n\n\n                                          This field is immutable once set.\n                                        type: boolean\n                                    type: object\n                                  or:\n                                    description: |-\n                                      Logical Or to combine multiple assertions.\n\n\n                                      This field is immutable once set.\n                                    items:\n                                      description: ActionAssertion defines the custom\n                                        assertions for evaluating the success or failure\n                                        of an action.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    type: array\n                                  stderr:\n                                    description: |-\n                                      Specifies the stderr matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  stdout:\n                                    description: |-\n                                      Specifies the stdout matcher for the action.\n\n\n                                      This field is immutable once set.\n                                    properties:\n                                      contains:\n                                        description: |-\n                                          The output of the action should contain the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                      equalTo:\n                                        description: |-\n                                          The output of the action should be equal to the specified value.\n\n\n                                          This field is immutable once set.\n                                        type: string\n                                    type: object\n                                  strict:\n                                    description: |-\n                                      Specifies whether apply the assertions strictly to all replicas.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                  succeed:\n                                    description: |-\n                                      Whether the action should succeed or fail.\n\n\n                                      This field is immutable once set.\n                                    type: boolean\n                                type: object\n                            type: object\n                          or:\n                            description: |-\n                              Logical Or to combine multiple expressions.\n\n\n                              This field is immutable once set.\n                            items:\n                              properties:\n                                all:\n                                  description: |-\n                                    All replicas must satisfy the assertion.\n\n\n                                    This field is immutable once set.\n                                  properties:\n                                    and:\n                                      description: |-\n                                        Logical And to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    not:\n                                      description: |-\n                                        Logical Not to negate the assertions.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    or:\n                                      description: |-\n                                        Logical Or to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    strict:\n                                      description: |-\n                                        Specifies whether apply the assertions strictly to all replicas.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                any:\n                                  description: |-\n                                    At least one replica must satisfy the assertion.\n\n\n                                    This field is immutable once set.\n                                  properties:\n                                    and:\n                                      description: |-\n                                        Logical And to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    not:\n                                      description: |-\n                                        Logical Not to negate the assertions.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    or:\n                                      description: |-\n                                        Logical Or to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    strict:\n                                      description: |-\n                                        Specifies whether apply the assertions strictly to all replicas.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                majority:\n                                  description: |-\n                                    Majority replicas must satisfy the assertion.\n\n\n                                    This field is immutable once set.\n                                  properties:\n                                    and:\n                                      description: |-\n                                        Logical And to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    not:\n                                      description: |-\n                                        Logical Not to negate the assertions.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    or:\n                                      description: |-\n                                        Logical Or to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    strict:\n                                      description: |-\n                                        Specifies whether apply the assertions strictly to all replicas.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                                none:\n                                  description: |-\n                                    None of the replicas must satisfy the assertion.\n\n\n                                    This field is immutable once set.\n                                  properties:\n                                    and:\n                                      description: |-\n                                        Logical And to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    not:\n                                      description: |-\n                                        Logical Not to negate the assertions.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        stderr:\n                                          description: |-\n                                            Specifies the stderr matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        stdout:\n                                          description: |-\n                                            Specifies the stdout matcher for the action.\n\n\n                                            This field is immutable once set.\n                                          properties:\n                                            contains:\n                                              description: |-\n                                                The output of the action should contain the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                            equalTo:\n                                              description: |-\n                                                The output of the action should be equal to the specified value.\n\n\n                                                This field is immutable once set.\n                                              type: string\n                                          type: object\n                                        succeed:\n                                          description: |-\n                                            Whether the action should succeed or fail.\n\n\n                                            This field is immutable once set.\n                                          type: boolean\n                                      type: object\n                                    or:\n                                      description: |-\n                                        Logical Or to combine multiple assertions.\n\n\n                                        This field is immutable once set.\n                                      items:\n                                        description: ActionAssertion defines the custom\n                                          assertions for evaluating the success or\n                                          failure of an action.\n                                        properties:\n                                          stderr:\n                                            description: |-\n                                              Specifies the stderr matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          stdout:\n                                            description: |-\n                                              Specifies the stdout matcher for the action.\n\n\n                                              This field is immutable once set.\n                                            properties:\n                                              contains:\n                                                description: |-\n                                                  The output of the action should contain the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                              equalTo:\n                                                description: |-\n                                                  The output of the action should be equal to the specified value.\n\n\n                                                  This field is immutable once set.\n                                                type: string\n                                            type: object\n                                          succeed:\n                                            description: |-\n                                              Whether the action should succeed or fail.\n\n\n                                              This field is immutable once set.\n                                            type: boolean\n                                        type: object\n                                      type: array\n                                    stderr:\n                                      description: |-\n                                        Specifies the stderr matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    stdout:\n                                      description: |-\n                                        Specifies the stdout matcher for the action.\n\n\n                                        This field is immutable once set.\n                                      properties:\n                                        contains:\n                                          description: |-\n                                            The output of the action should contain the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                        equalTo:\n                                          description: |-\n                                            The output of the action should be equal to the specified value.\n\n\n                                            This field is immutable once set.\n                                          type: string\n                                      type: object\n                                    strict:\n                                      description: |-\n                                        Specifies whether apply the assertions strictly to all replicas.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                    succeed:\n                                      description: |-\n                                        Whether the action should succeed or fail.\n\n\n                                        This field is immutable once set.\n                                      type: boolean\n                                  type: object\n                              type: object\n                            type: array\n                        type: object\n                      description:\n                        description: A brief description for the condition when the\n                          component is available.\n                        type: string\n                      timeWindowSeconds:\n                        description: This field is immutable once set.\n                        format: int32\n                        type: integer\n                    type: object\n                  withRole:\n                    description: |-\n                      Specifies the role that the component will go through to be considered available.\n\n\n                      This field is immutable once set.\n                    type: string\n                type: object\n              configs:\n                description: |-\n                  Specifies the config file templates and volume mount parameters used by the Component.\n\n\n                  This field specifies a list of templates that will be rendered into Component containers' config files.\n                  Each template is represented as a ConfigMap and may contain multiple config files, with each file being a key in the ConfigMap.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    defaultMode:\n                      description: |-\n                        The operator attempts to set default file permissions (0444).\n\n\n                        Must be specified as an octal value between 0000 and 0777 (inclusive),\n                        or as a decimal value between 0 and 511 (inclusive).\n                        YAML supports both octal and decimal values for file permissions.\n\n\n                        Please note that this setting only affects the permissions of the files themselves.\n                        Directories within the specified path are not impacted by this setting.\n                        It's important to be aware that this setting might conflict with other options\n                        that influence the file mode, such as fsGroup.\n                        In such cases, the resulting file mode may have additional bits set.\n                        Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                      format: int32\n                      type: integer\n                    externalManaged:\n                      description: |-\n                        ExternalManaged indicates whether the configuration is managed by an external system.\n                        When set to true, the controller will ignore the management of this configuration.\n                      type: boolean\n                    name:\n                      description: Specifies the name of the template.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    namespace:\n                      default: default\n                      description: Specifies the namespace of the referenced template\n                        ConfigMap object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    restartOnFileChange:\n                      description: Specifies whether to restart the pod when the file\n                        changes.\n                      type: boolean\n                    template:\n                      description: Specifies the name of the referenced template ConfigMap\n                        object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    volumeName:\n                      description: |-\n                        Refers to the volume name of PodTemplate. The file produced through the template will be mounted to\n                        the corresponding volume. Must be a DNS_LABEL name.\n                        The volume name must be defined in podSpec.containers[*].volumeMounts.\n                      maxLength: 63\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n              description:\n                description: |-\n                  Provides a brief and concise explanation of the Component's purpose, functionality, and any relevant details.\n                  It serves as a quick reference for users to understand the Component's role and characteristics.\n                maxLength: 256\n                type: string\n              exporter:\n                description: Defines the built-in metrics exporter container.\n                properties:\n                  containerName:\n                    description: Specifies the name of the built-in metrics exporter\n                      container.\n                    type: string\n                  scrapePath:\n                    description: |-\n                      Specifies the http/https url path to scrape for metrics.\n                      If empty, Prometheus uses the default value (e.g. `/metrics`).\n                    type: string\n                  scrapePort:\n                    description: Specifies the port name to scrape for metrics.\n                    type: string\n                  scrapeScheme:\n                    description: |-\n                      Specifies the schema to use for scraping.\n                      `http` and `https` are the expected values unless you rewrite the `__scheme__` label via relabeling.\n                      If empty, Prometheus uses the default value `http`.\n                    enum:\n                    - http\n                    - https\n                    type: string\n                type: object\n              hostNetwork:\n                description: |-\n                  Specifies the host network configuration for the Component.\n\n\n                  When `hostNetwork` option is enabled, the Pods share the host's network namespace and can directly access\n                  the host's network interfaces.\n                  This means that if multiple Pods need to use the same port, they cannot run on the same host simultaneously\n                  due to port conflicts.\n\n\n                  The DNSPolicy field in the Pod spec determines how containers within the Pod perform DNS resolution.\n                  When using hostNetwork, the operator will set the DNSPolicy to 'ClusterFirstWithHostNet'.\n                  With this policy, DNS queries will first go through the K8s cluster's DNS service.\n                  If the query fails, it will fall back to the host's DNS settings.\n\n\n                  If set, the DNS policy will be automatically set to \"ClusterFirstWithHostNet\".\n\n\n                  This field is immutable.\n                properties:\n                  containerPorts:\n                    description: The list of container ports that are required by\n                      the component.\n                    items:\n                      properties:\n                        container:\n                          description: Container specifies the target container within\n                            the Pod.\n                          type: string\n                        ports:\n                          description: |-\n                            Ports are named container ports within the specified container.\n                            These container ports must be defined in the container for proper port allocation.\n                          items:\n                            type: string\n                          minItems: 1\n                          type: array\n                      required:\n                      - container\n                      - ports\n                      type: object\n                    type: array\n                type: object\n              labels:\n                additionalProperties:\n                  type: string\n                description: |-\n                  Specifies static labels that will be patched to all Kubernetes resources created for the Component.\n\n\n                  Note: If a label key in the `labels` field conflicts with any system labels or user-specified labels,\n                  it will be silently ignored to avoid overriding higher-priority labels.\n\n\n                  This field is immutable.\n                type: object\n              lifecycleActions:\n                description: |-\n                  Defines a set of hooks and procedures that customize the behavior of a Component throughout its lifecycle.\n                  Actions are triggered at specific lifecycle stages:\n\n\n                    - `postProvision`: Defines the hook to be executed after the creation of a Component,\n                      with `preCondition` specifying when the action should be fired relative to the Component's lifecycle stages:\n                      `Immediately`, `RuntimeReady`, `ComponentReady`, and `ClusterReady`.\n                    - `preTerminate`: Defines the hook to be executed before terminating a Component.\n                    - `roleProbe`: Defines the procedure which is invoked regularly to assess the role of replicas.\n                    - `availableProbe`: Defines the procedure which is invoked regularly to assess the availability of the component.\n                    - `switchover`: Defines the procedure for a controlled transition of a role to a new replica.\n                      This approach aims to minimize downtime and maintain availability in systems with a leader-follower topology,\n                      such as before planned maintenance or upgrades on the current leader node.\n                    - `memberJoin`: Defines the procedure to add a new replica to the replication group.\n                    - `memberLeave`: Defines the method to remove a replica from the replication group.\n                    - `readOnly`: Defines the procedure to switch a replica into the read-only state.\n                    - `readWrite`: transition a replica from the read-only state back to the read-write state.\n                    - `dataDump`: Defines the procedure to export the data from a replica.\n                    - `dataLoad`: Defines the procedure to import data into a replica.\n                    - `reconfigure`: Defines the procedure that update a replica with new configuration file.\n                    - `accountProvision`: Defines the procedure to generate a new database account.\n\n\n                  This field is immutable.\n                properties:\n                  accountProvision:\n                    description: |-\n                      Defines the procedure to generate a new database account.\n\n\n                      Use Case:\n                      This action is designed to create system accounts that are utilized for replication, monitoring, backup,\n                      and other administrative tasks.\n\n\n                      The container executing this action has access to following variables:\n\n\n                      - KB_ACCOUNT_NAME: The name of the system account to be manipulated.\n                      - KB_ACCOUNT_PASSWORD: The password for the system account.\n                      - KB_ACCOUNT_STATEMENT: The statement used to manipulate the system account.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  availableProbe:\n                    description: |-\n                      Defines the procedure which is invoked regularly to assess the availability of the component.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      failureThreshold:\n                        description: |-\n                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                          Defaults to 3. Minimum value is 1.\n                        format: int32\n                        type: integer\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      initialDelaySeconds:\n                        description: |-\n                          Specifies the number of seconds to wait after the container has started before the RoleProbe\n                          begins to detect the container's role.\n                        format: int32\n                        type: integer\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      periodSeconds:\n                        description: |-\n                          Specifies the frequency at which the probe is conducted. This value is expressed in seconds.\n                          Default to 60 seconds. Minimum value is 1.\n                        format: int32\n                        type: integer\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      successThreshold:\n                        description: |-\n                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                          Defaults to 1. Minimum value is 1.\n                        format: int32\n                        type: integer\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  dataDump:\n                    description: |-\n                      Defines the procedure for exporting the data from a replica.\n\n\n                      Use Case:\n                      This action is intended for initializing a newly created replica with data. It involves exporting data\n                      from an existing replica and importing it into the new, empty replica. This is essential for synchronizing\n                      the state of replicas across the system.\n\n\n                      Applicability:\n                      Some database engines or associated sidecar applications (e.g., Patroni) may already provide this functionality.\n                      In such cases, this action may not be required.\n\n\n                      The output should be a valid data dump streamed to stdout. It must exclude any irrelevant information to ensure\n                      that only the necessary data is exported for import into the new replica.\n\n\n                      The container executing this action has access to following environment variables:\n\n\n                      - KB_TARGET_POD_NAME: The name of the replica pod into which the data will be loaded.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  dataLoad:\n                    description: |-\n                      Defines the procedure for importing data into a replica.\n\n\n                      Use Case:\n                      This action is intended for initializing a newly created replica with data. It involves exporting data\n                      from an existing replica and importing it into the new, empty replica. This is essential for synchronizing\n                      the state of replicas across the system.\n\n\n                      Some database engines or associated sidecar applications (e.g., Patroni) may already provide this functionality.\n                      In such cases, this action may not be required.\n\n\n                      Data should be received through stdin. If any error occurs during the process,\n                      the action must be able to guarantee idempotence to allow for retries from the beginning.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  memberJoin:\n                    description: \"Defines the procedure to add a new replica to the\n                      replication group.\\n\\n\\nThis action is initiated after a replica\n                      pod becomes ready.\\n\\n\\nThe role of the replica (e.g., primary,\n                      secondary) will be determined and assigned as part of the action\n                      command\\nimplementation, or automatically by the database kernel\n                      or a sidecar utility like Patroni that implements\\na consensus\n                      algorithm.\\n\\n\\nThe container executing this action has access\n                      to following variables:\\n\\n\\n- KB_JOIN_MEMBER_POD_FQDN: The\n                      pod FQDN of the replica being added to the group.\\n- KB_JOIN_MEMBER_POD_NAME:\n                      The pod name of the replica being added to the group.\\n\\n\\nExpected\n                      action output:\\n- On Failure: An error message detailing the\n                      reason for any failure encountered\\n  during the addition of\n                      the new member.\\n\\n\\nFor example, to add a new OBServer to an\n                      OceanBase Cluster in 'zone1', the following command may be used:\\n\\n\\n```yaml\\ncommand:\\n-\n                      bash\\n- -c\\n- |\\n   CLIENT=\\\"mysql -u $SERVICE_USER -p$SERVICE_PASSWORD\n                      -P $SERVICE_PORT -h $SERVICE_HOST -e\\\"\\n\\t  $CLIENT \\\"ALTER\n                      SYSTEM ADD SERVER '$POD_FQDN:$SERVICE_PORT' ZONE 'zone1'\\\"\\n```\\n\\n\\nNote:\n                      This field is immutable once it has been set.\"\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  memberLeave:\n                    description: \"Defines the procedure to remove a replica from the\n                      replication group.\\n\\n\\nThis action is initiated before remove\n                      a replica from the group.\\nThe operator will wait for MemberLeave\n                      to complete successfully before releasing the replica and cleaning\n                      up\\nrelated Kubernetes resources.\\n\\n\\nThe process typically\n                      includes updating configurations and informing other group members\n                      about the removal.\\nData migration is generally not part of\n                      this action and should be handled separately if needed.\\n\\n\\nThe\n                      container executing this action has access to following variables:\\n\\n\\n-\n                      KB_LEAVE_MEMBER_POD_FQDN: The pod name of the replica being\n                      removed from the group.\\n- KB_LEAVE_MEMBER_POD_NAME: The pod\n                      name of the replica being removed from the group.\\n\\n\\nExpected\n                      action output:\\n- On Failure: An error message, if applicable,\n                      indicating why the action failed.\\n\\n\\nFor example, to remove\n                      an OBServer from an OceanBase Cluster in 'zone1', the following\n                      command can be executed:\\n\\n\\n```yaml\\ncommand:\\n- bash\\n- -c\\n-\n                      |\\n   CLIENT=\\\"mysql -u $SERVICE_USER -p$SERVICE_PASSWORD -P\n                      $SERVICE_PORT -h $SERVICE_HOST -e\\\"\\n\\t  $CLIENT \\\"ALTER SYSTEM\n                      DELETE SERVER '$POD_FQDN:$SERVICE_PORT' ZONE 'zone1'\\\"\\n```\\n\\n\\nNote:\n                      This field is immutable once it has been set.\"\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  postProvision:\n                    description: |-\n                      Specifies the hook to be executed after a component's creation.\n\n\n                      By setting `postProvision.customHandler.preCondition`, you can determine the specific lifecycle stage\n                      at which the action should trigger: `Immediately`, `RuntimeReady`, `ComponentReady`, and `ClusterReady`.\n                      with `ComponentReady` being the default.\n\n\n                      The PostProvision Action is intended to run only once.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  preTerminate:\n                    description: |-\n                      Specifies the hook to be executed prior to terminating a component.\n\n\n                      The PreTerminate Action is intended to run only once.\n\n\n                      This action is executed immediately when a scale-down operation for the Component is initiated.\n                      The actual termination and cleanup of the Component and its associated resources will not proceed\n                      until the PreTerminate action has completed successfully.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  readonly:\n                    description: |-\n                      Defines the procedure to switch a replica into the read-only state.\n\n\n                      Use Case:\n                      This action is invoked when the database's volume capacity nears its upper limit and space is about to be exhausted.\n\n\n                      Expected action output:\n                      - On Failure: An error message, if applicable, indicating why the action failed.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  readwrite:\n                    description: |-\n                      Defines the procedure to transition a replica from the read-only state back to the read-write state.\n\n\n                      Use Case:\n                      This action is used to bring back a replica that was previously in a read-only state,\n                      which restricted write operations, to its normal operational state where it can handle\n                      both read and write operations.\n\n\n                      Expected action output:\n                      - On Failure: An error message, if applicable, indicating why the action failed.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  reconfigure:\n                    description: |-\n                      Defines the procedure that update a replica with new configuration.\n\n\n                      Note: This field is immutable once it has been set.\n\n\n                      This Action is reserved for future versions.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  roleProbe:\n                    description: |-\n                      Defines the procedure which is invoked regularly to assess the role of replicas.\n\n\n                      This action is periodically triggered at the specified interval to determine the role of each replica.\n                      Upon successful execution, the action's output designates the role of the replica,\n                      which should match one of the predefined role names within `componentDefinition.spec.roles`.\n                      The output is then compared with the previous successful execution result.\n                      If a role change is detected, an event is generated to inform the controller,\n                      which initiates an update of the replica's role.\n\n\n                      Defining a RoleProbe Action for a Component is required if roles are defined for the Component.\n                      It ensures replicas are correctly labeled with their respective roles.\n                      Without this, services that rely on roleSelectors might improperly direct traffic to wrong replicas.\n\n\n                      Expected output of this action:\n                      - On Success: The determined role of the replica, which must align with one of the roles specified\n                        in the component definition.\n                      - On Failure: An error message, if applicable, indicating why the action failed.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      failureThreshold:\n                        description: |-\n                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                          Defaults to 3. Minimum value is 1.\n                        format: int32\n                        type: integer\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      initialDelaySeconds:\n                        description: |-\n                          Specifies the number of seconds to wait after the container has started before the RoleProbe\n                          begins to detect the container's role.\n                        format: int32\n                        type: integer\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      periodSeconds:\n                        description: |-\n                          Specifies the frequency at which the probe is conducted. This value is expressed in seconds.\n                          Default to 60 seconds. Minimum value is 1.\n                        format: int32\n                        type: integer\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      successThreshold:\n                        description: |-\n                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                          Defaults to 1. Minimum value is 1.\n                        format: int32\n                        type: integer\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  switchover:\n                    description: |-\n                      Defines the procedure for a controlled transition of a role to a new replica.\n                      This approach aims to minimize downtime and maintain availability\n                      during events such as planned maintenance or when performing stop, shutdown, restart, or upgrade operations.\n                      In a typical consensus system, this action is used to transfer leader role to another replica.\n\n\n                      The container executing this action has access to following variables:\n\n\n                      - KB_SWITCHOVER_CANDIDATE_NAME: The name of the pod of the new role's candidate, which may not be specified (empty).\n                      - KB_SWITCHOVER_CANDIDATE_FQDN: The FQDN of the pod of the new role's candidate, which may not be specified (empty).\n                      - KB_SWITCHOVER_CURRENT_NAME: The name of the pod of the current role.\n                      - KB_SWITCHOVER_CURRENT_FQDN: The FQDN of the pod of the current role.\n                      - KB_SWITCHOVER_ROLE: The role that will be transferred to another replica.\n                        This variable can be empty if, for example, role probe does not succeed.\n                        It depends on the addon implementation what to do under such cases.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                type: object\n              logConfigs:\n                description: |-\n                  Defines the types of logs generated by instances of the Component and their corresponding file paths.\n                  These logs can be collected for further analysis and monitoring.\n\n\n                  The `logConfigs` field is an optional list of LogConfig objects, where each object represents\n                  a specific log type and its configuration.\n                  It allows you to specify multiple log types and their respective file paths for the Component.\n\n\n                  Examples:\n\n\n                  ```yaml\n                   logConfigs:\n                   - filePathPattern: /data/mysql/log/mysqld-error.log\n                     name: error\n                   - filePathPattern: /data/mysql/log/mysqld.log\n                     name: general\n                   - filePathPattern: /data/mysql/log/mysqld-slowquery.log\n                     name: slow\n                  ```\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    filePathPattern:\n                      description: |-\n                        Specifies the paths or patterns identifying where the log files are stored.\n                        This field allows the system to locate and manage log files effectively.\n\n\n                        Examples:\n\n\n                        - /home/postgres/pgdata/pgroot/data/log/postgresql-*\n                        - /data/mysql/log/mysqld-error.log\n                      maxLength: 4096\n                      type: string\n                    name:\n                      description: |-\n                        Specifies a descriptive label for the log type, such as 'slow' for a MySQL slow log file.\n                        It provides a clear identification of the log's purpose and content.\n                      maxLength: 128\n                      type: string\n                  required:\n                  - filePathPattern\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              minReadySeconds:\n                default: 0\n                description: |-\n                  `minReadySeconds` is the minimum duration in seconds that a new Pod should remain in the ready\n                  state without any of its containers crashing to be considered available.\n                  This ensures the Pod's stability and readiness to serve requests.\n\n\n                  A default value of 0 seconds means the Pod is considered available as soon as it enters the ready state.\n                format: int32\n                minimum: 0\n                type: integer\n              podManagementPolicy:\n                default: OrderedReady\n                description: |-\n                  InstanceSet controls the creation of pods during initial scale up, replacement of pods on nodes, and scaling down.\n\n\n                  - `OrderedReady`: Creates pods in increasing order (pod-0, then pod-1, etc). The controller waits until each pod\n                  is ready before continuing. Pods are removed in reverse order when scaling down.\n                  - `Parallel`: Creates pods in parallel to match the desired scale without waiting. All pods are deleted at once\n                  when scaling down.\n                type: string\n              policyRules:\n                description: |-\n                  Defines the namespaced policy rules required by the Component.\n\n\n                  The `policyRules` field is an array of `rbacv1.PolicyRule` objects that define the policy rules\n                  needed by the Component to operate within a namespace.\n                  These policy rules determine the permissions and verbs the Component is allowed to perform on\n                  Kubernetes resources within the namespace.\n\n\n                  The purpose of this field is to automatically generate the necessary RBAC roles\n                  for the Component based on the specified policy rules.\n                  This ensures that the Pods in the Component has appropriate permissions to function.\n\n\n                  To prevent privilege escalation, only permissions already owned by KubeBlocks can be added here.\n\n\n                  This field is immutable.\n                items:\n                  description: |-\n                    PolicyRule holds information that describes a policy rule, but does not contain information\n                    about who the rule applies to or which namespace the rule applies to.\n                  properties:\n                    apiGroups:\n                      description: |-\n                        APIGroups is the name of the APIGroup that contains the resources.  If multiple API groups are specified, any action requested against one of\n                        the enumerated resources in any API group will be allowed. \"\" represents the core API group and \"*\" represents all API groups.\n                      items:\n                        type: string\n                      type: array\n                    nonResourceURLs:\n                      description: |-\n                        NonResourceURLs is a set of partial urls that a user should have access to.  *s are allowed, but only as the full, final step in the path\n                        Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding.\n                        Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"),  but not both.\n                      items:\n                        type: string\n                      type: array\n                    resourceNames:\n                      description: ResourceNames is an optional white list of names\n                        that the rule applies to.  An empty set means that everything\n                        is allowed.\n                      items:\n                        type: string\n                      type: array\n                    resources:\n                      description: Resources is a list of resources this rule applies\n                        to. '*' represents all resources.\n                      items:\n                        type: string\n                      type: array\n                    verbs:\n                      description: Verbs is a list of Verbs that apply to ALL the\n                        ResourceKinds contained in this rule. '*' represents all verbs.\n                      items:\n                        type: string\n                      type: array\n                  required:\n                  - verbs\n                  type: object\n                type: array\n              provider:\n                description: |-\n                  Specifies the name of the Component provider, typically the vendor or developer name.\n                  It identifies the entity responsible for creating and maintaining the Component.\n\n\n                  When specifying the provider name, consider the following guidelines:\n\n\n                  - Keep the name concise and relevant to the Component.\n                  - Use a consistent naming convention across Components from the same provider.\n                  - Avoid using trademarked or copyrighted names without proper permission.\n                maxLength: 32\n                type: string\n              replicasLimit:\n                description: |-\n                  Defines the upper limit of the number of replicas supported by the Component.\n\n\n                  It defines the maximum number of replicas that can be created for the Component.\n                  This field allows you to set a limit on the scalability of the Component, preventing it from exceeding a certain number of replicas.\n\n\n                  This field is immutable.\n                properties:\n                  maxReplicas:\n                    description: The maximum limit of replicas.\n                    format: int32\n                    type: integer\n                  minReplicas:\n                    description: The minimum limit of replicas.\n                    format: int32\n                    type: integer\n                required:\n                - maxReplicas\n                - minReplicas\n                type: object\n                x-kubernetes-validations:\n                - message: the minimum and maximum limit of replicas should be in\n                    the range of [0, 16384]\n                  rule: self.minReplicas >= 0 && self.maxReplicas <= 16384\n                - message: the minimum replicas limit should be no greater than the\n                    maximum\n                  rule: self.minReplicas <= self.maxReplicas\n              roles:\n                description: |-\n                  Enumerate all possible roles assigned to each replica of the Component, influencing its behavior.\n\n\n                  A replica can have zero or one role.\n                  KubeBlocks operator determines the role of each replica by invoking the `lifecycleActions.roleProbe` method.\n                  This action returns the role for each replica, and the returned role must be predefined here.\n\n\n                  The roles assigned to a replica can influence various aspects of the Component's behavior, such as:\n\n\n                  - Service selection: The Component's exposed Services may target replicas based on their roles using `roleSelector`.\n                  - Update order: The roles can determine the order in which replicas are updated during a Component update.\n                    For instance, replicas with a \"follower\" role can be updated first, while the replica with the \"leader\"\n                    role is updated last. This helps minimize the number of leader changes during the update process.\n\n\n                  This field is immutable.\n                items:\n                  description: ReplicaRole represents a role that can be assigned\n                    to a component instance, defining its behavior and responsibilities.\n                  properties:\n                    name:\n                      description: |-\n                        Name defines the role's unique identifier. This value is used to set the \"apps.kubeblocks.io/role\" label\n                        on the corresponding object to identify its role.\n\n\n                        For example, common role names include:\n                        - \"leader\": The primary/master instance that handles write operations\n                        - \"follower\": Secondary/replica instances that replicate data from the leader\n                        - \"learner\": Read-only instances that don't participate in elections\n\n\n                        This field is immutable once set.\n                      maxLength: 32\n                      pattern: ^.*[^\\s]+.*$\n                      type: string\n                    participatesInQuorum:\n                      default: false\n                      description: |-\n                        ParticipatesInQuorum indicates if pods with this role are counted when determining quorum.\n                        This affects update strategies that need to maintain quorum for availability. Roles participate\n                        in quorum should have higher update priority than roles do not participate in quorum.\n                        The default value is false.\n\n\n                        For example, in a 5-pod component where:\n                        - 2 learner pods (participatesInQuorum=false)\n                        - 2 follower pods (participatesInQuorum=true)\n                        - 1 leader pod (participatesInQuorum=true)\n                        The quorum size would be 3 (based on the 3 participating pods), allowing parallel updates\n                        of 2 learners and 1 follower while maintaining quorum.\n\n\n                        This field is immutable once set.\n                      type: boolean\n                    updatePriority:\n                      default: 0\n                      description: |-\n                        UpdatePriority determines the order in which pods with different roles are updated.\n                        Pods are sorted by this priority (higher numbers = higher priority) and updated accordingly.\n                        Roles with the highest priority will be updated last.\n                        The default priority is 0.\n\n\n                        For example:\n                        - Leader role may have priority 2 (updated last)\n                        - Follower role may have priority 1 (updated before leader)\n                        - Learner role may have priority 0 (updated first)\n\n\n                        This field is immutable once set.\n                      type: integer\n                  required:\n                  - name\n                  type: object\n                maxItems: 128\n                type: array\n              runtime:\n                description: |-\n                  Specifies the PodSpec template used in the Component.\n                  It includes the following elements:\n\n\n                  - Init containers\n                  - Containers\n                      - Image\n                      - Commands\n                      - Args\n                      - Envs\n                      - Mounts\n                      - Ports\n                      - Security context\n                      - Probes\n                      - Lifecycle\n                  - Volumes\n\n\n                  This field is intended to define static settings that remain consistent across all instantiated Components.\n                  Dynamic settings such as CPU and memory resource limits, as well as scheduling settings (affinity,\n                  toleration, priority), may vary among different instantiated Components.\n                  They should be specified in the `cluster.spec.componentSpecs` (ClusterComponentSpec).\n\n\n                  Specific instances of a Component may override settings defined here, such as using a different container image\n                  or modifying environment variable values.\n                  These instance-specific overrides can be specified in `cluster.spec.componentSpecs[*].instances`.\n\n\n                  This field is immutable and cannot be updated once set.\n                properties:\n                  activeDeadlineSeconds:\n                    description: |-\n                      Optional duration in seconds the pod may be active on the node relative to\n                      StartTime before the system will actively try to mark it failed and kill associated containers.\n                      Value must be a positive integer.\n                    format: int64\n                    type: integer\n                  affinity:\n                    description: If specified, the pod's scheduling constraints\n                    properties:\n                      nodeAffinity:\n                        description: Describes node affinity scheduling rules for\n                          the pod.\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: |-\n                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                              properties:\n                                preference:\n                                  description: A node selector term, associated with\n                                    the corresponding weight.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                weight:\n                                  description: Weight associated with matching the\n                                    corresponding nodeSelectorTerm, in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - preference\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to an update), the system\n                              may or may not try to eventually evict the pod from its node.\n                            properties:\n                              nodeSelectorTerms:\n                                description: Required. A list of node selector terms.\n                                  The terms are ORed.\n                                items:\n                                  description: |-\n                                    A null or empty node selector term matches no objects. The requirements of\n                                    them are ANDed.\n                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                type: array\n                            required:\n                            - nodeSelectorTerms\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                      podAffinity:\n                        description: Describes pod affinity scheduling rules (e.g.\n                          co-locate this pod in the same node, zone, etc. as some\n                          other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                      podAntiAffinity:\n                        description: Describes pod anti-affinity scheduling rules\n                          (e.g. avoid putting this pod in the same node, zone, etc.\n                          as some other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the anti-affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the anti-affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the anti-affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                    type: object\n                  automountServiceAccountToken:\n                    description: AutomountServiceAccountToken indicates whether a\n                      service account token should be automatically mounted.\n                    type: boolean\n                  containers:\n                    description: |-\n                      List of containers belonging to the pod.\n                      Containers cannot currently be added or removed.\n                      There must be at least one container in a Pod.\n                      Cannot be updated.\n                    items:\n                      description: A single application container that you want to\n                        run within a pod.\n                      properties:\n                        args:\n                          description: |-\n                            Arguments to the entrypoint.\n                            The container image's CMD is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        command:\n                          description: |-\n                            Entrypoint array. Not executed within a shell.\n                            The container image's ENTRYPOINT is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        env:\n                          description: |-\n                            List of environment variables to set in the container.\n                            Cannot be updated.\n                          items:\n                            description: EnvVar represents an environment variable\n                              present in a Container.\n                            properties:\n                              name:\n                                description: Name of the environment variable. Must\n                                  be a C_IDENTIFIER.\n                                type: string\n                              value:\n                                description: |-\n                                  Variable references $(VAR_NAME) are expanded\n                                  using the previously defined environment variables in the container and\n                                  any service environment variables. If a variable cannot be resolved,\n                                  the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                  \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                  Escaped references will never be expanded, regardless of whether the variable\n                                  exists or not.\n                                  Defaults to \"\".\n                                type: string\n                              valueFrom:\n                                description: Source for the environment variable's\n                                  value. Cannot be used if value is not empty.\n                                properties:\n                                  configMapKeyRef:\n                                    description: Selects a key of a ConfigMap.\n                                    properties:\n                                      key:\n                                        description: The key to select.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          or its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  fieldRef:\n                                    description: |-\n                                      Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                      spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  secretKeyRef:\n                                    description: Selects a key of a secret in the\n                                      pod's namespace\n                                    properties:\n                                      key:\n                                        description: The key of the secret to select\n                                          from.  Must be a valid secret key.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret or\n                                          its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        envFrom:\n                          description: |-\n                            List of sources to populate environment variables in the container.\n                            The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                            will be reported as an event when the container is starting. When a key exists in multiple\n                            sources, the value associated with the last source will take precedence.\n                            Values defined by an Env with a duplicate key will take precedence.\n                            Cannot be updated.\n                          items:\n                            description: EnvFromSource represents the source of a\n                              set of ConfigMaps\n                            properties:\n                              configMapRef:\n                                description: The ConfigMap to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap must\n                                      be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              prefix:\n                                description: An optional identifier to prepend to\n                                  each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                type: string\n                              secretRef:\n                                description: The Secret to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret must be\n                                      defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          type: array\n                        image:\n                          description: |-\n                            Container image name.\n                            More info: https://kubernetes.io/docs/concepts/containers/images\n                            This field is optional to allow higher level config management to default or override\n                            container images in workload controllers like Deployments and StatefulSets.\n                          type: string\n                        imagePullPolicy:\n                          description: |-\n                            Image pull policy.\n                            One of Always, Never, IfNotPresent.\n                            Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                          type: string\n                        lifecycle:\n                          description: |-\n                            Actions that the management system should take in response to container lifecycle events.\n                            Cannot be updated.\n                          properties:\n                            postStart:\n                              description: |-\n                                PostStart is called immediately after a container is created. If the handler fails,\n                                the container is terminated and restarted according to its restart policy.\n                                Other management of the container blocks until the hook completes.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                            preStop:\n                              description: |-\n                                PreStop is called immediately before a container is terminated due to an\n                                API request or management event such as liveness/startup probe failure,\n                                preemption, resource contention, etc. The handler is not called if the\n                                container crashes or exits. The Pod's termination grace period countdown begins before the\n                                PreStop hook is executed. Regardless of the outcome of the handler, the\n                                container will eventually terminate within the Pod's termination grace\n                                period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                or until the termination grace period is reached.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                          type: object\n                        livenessProbe:\n                          description: |-\n                            Periodic probe of container liveness.\n                            Container will be restarted if the probe fails.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        name:\n                          description: |-\n                            Name of the container specified as a DNS_LABEL.\n                            Each container in a pod must have a unique name (DNS_LABEL).\n                            Cannot be updated.\n                          type: string\n                        ports:\n                          description: |-\n                            List of ports to expose from the container. Not specifying a port here\n                            DOES NOT prevent that port from being exposed. Any port which is\n                            listening on the default \"0.0.0.0\" address inside a container will be\n                            accessible from the network.\n                            Modifying this array with strategic merge patch may corrupt the data.\n                            For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                            Cannot be updated.\n                          items:\n                            description: ContainerPort represents a network port in\n                              a single container.\n                            properties:\n                              containerPort:\n                                description: |-\n                                  Number of port to expose on the pod's IP address.\n                                  This must be a valid port number, 0 < x < 65536.\n                                format: int32\n                                type: integer\n                              hostIP:\n                                description: What host IP to bind the external port\n                                  to.\n                                type: string\n                              hostPort:\n                                description: |-\n                                  Number of port to expose on the host.\n                                  If specified, this must be a valid port number, 0 < x < 65536.\n                                  If HostNetwork is specified, this must match ContainerPort.\n                                  Most containers do not need this.\n                                format: int32\n                                type: integer\n                              name:\n                                description: |-\n                                  If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                  named port in a pod must have a unique name. Name for the port that can be\n                                  referred to by services.\n                                type: string\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  Protocol for port. Must be UDP, TCP, or SCTP.\n                                  Defaults to \"TCP\".\n                                type: string\n                            required:\n                            - containerPort\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - containerPort\n                          - protocol\n                          x-kubernetes-list-type: map\n                        readinessProbe:\n                          description: |-\n                            Periodic probe of container service readiness.\n                            Container will be removed from service endpoints if the probe fails.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        resizePolicy:\n                          description: Resources resize policy for the container.\n                          items:\n                            description: ContainerResizePolicy represents resource\n                              resize policy for the container.\n                            properties:\n                              resourceName:\n                                description: |-\n                                  Name of the resource to which this resource resize policy applies.\n                                  Supported values: cpu, memory.\n                                type: string\n                              restartPolicy:\n                                description: |-\n                                  Restart policy to apply when specified resource is resized.\n                                  If not specified, it defaults to NotRequired.\n                                type: string\n                            required:\n                            - resourceName\n                            - restartPolicy\n                            type: object\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        resources:\n                          description: |-\n                            Compute Resources required by this container.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                        restartPolicy:\n                          description: |-\n                            RestartPolicy defines the restart behavior of individual containers in a pod.\n                            This field may only be set for init containers, and the only allowed value is \"Always\".\n                            For non-init containers or when this field is not specified,\n                            the restart behavior is defined by the Pod's restart policy and the container type.\n                            Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                            this init container will be continually restarted on\n                            exit until all regular containers have terminated. Once all regular\n                            containers have completed, all init containers with restartPolicy \"Always\"\n                            will be shut down. This lifecycle differs from normal init containers and\n                            is often referred to as a \"sidecar\" container. Although this init\n                            container still starts in the init container sequence, it does not wait\n                            for the container to complete before proceeding to the next init\n                            container. Instead, the next init container starts immediately after this\n                            init container is started, or after any startupProbe has successfully\n                            completed.\n                          type: string\n                        securityContext:\n                          description: |-\n                            SecurityContext defines the security options the container should be run with.\n                            If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                            More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                          properties:\n                            allowPrivilegeEscalation:\n                              description: |-\n                                AllowPrivilegeEscalation controls whether a process can gain more\n                                privileges than its parent process. This bool directly controls if\n                                the no_new_privs flag will be set on the container process.\n                                AllowPrivilegeEscalation is true always when the container is:\n                                1) run as Privileged\n                                2) has CAP_SYS_ADMIN\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            capabilities:\n                              description: |-\n                                The capabilities to add/drop when running containers.\n                                Defaults to the default set of capabilities granted by the container runtime.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                add:\n                                  description: Added capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                                drop:\n                                  description: Removed capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                              type: object\n                            privileged:\n                              description: |-\n                                Run container in privileged mode.\n                                Processes in privileged containers are essentially equivalent to root on the host.\n                                Defaults to false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            procMount:\n                              description: |-\n                                procMount denotes the type of proc mount to use for the containers.\n                                The default is DefaultProcMount which uses the container runtime defaults for\n                                readonly paths and masked paths.\n                                This requires the ProcMountType feature flag to be enabled.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: string\n                            readOnlyRootFilesystem:\n                              description: |-\n                                Whether this container has a read-only root filesystem.\n                                Default is false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            runAsGroup:\n                              description: |-\n                                The GID to run the entrypoint of the container process.\n                                Uses runtime default if unset.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            runAsNonRoot:\n                              description: |-\n                                Indicates that the container must run as a non-root user.\n                                If true, the Kubelet will validate the image at runtime to ensure that it\n                                does not run as UID 0 (root) and fail to start the container if it does.\n                                If unset or false, no such validation will be performed.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              type: boolean\n                            runAsUser:\n                              description: |-\n                                The UID to run the entrypoint of the container process.\n                                Defaults to user specified in image metadata if unspecified.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            seLinuxOptions:\n                              description: |-\n                                The SELinux context to be applied to the container.\n                                If unspecified, the container runtime will allocate a random SELinux context for each\n                                container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                level:\n                                  description: Level is SELinux level label that applies\n                                    to the container.\n                                  type: string\n                                role:\n                                  description: Role is a SELinux role label that applies\n                                    to the container.\n                                  type: string\n                                type:\n                                  description: Type is a SELinux type label that applies\n                                    to the container.\n                                  type: string\n                                user:\n                                  description: User is a SELinux user label that applies\n                                    to the container.\n                                  type: string\n                              type: object\n                            seccompProfile:\n                              description: |-\n                                The seccomp options to use by this container. If seccomp options are\n                                provided at both the pod & container level, the container options\n                                override the pod options.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                localhostProfile:\n                                  description: |-\n                                    localhostProfile indicates a profile defined in a file on the node should be used.\n                                    The profile must be preconfigured on the node to work.\n                                    Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                    Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                  type: string\n                                type:\n                                  description: |-\n                                    type indicates which kind of seccomp profile will be applied.\n                                    Valid options are:\n\n\n                                    Localhost - a profile defined in a file on the node should be used.\n                                    RuntimeDefault - the container runtime default profile should be used.\n                                    Unconfined - no profile should be applied.\n                                  type: string\n                              required:\n                              - type\n                              type: object\n                            windowsOptions:\n                              description: |-\n                                The Windows specific settings applied to all containers.\n                                If unspecified, the options from the PodSecurityContext will be used.\n                                If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is linux.\n                              properties:\n                                gmsaCredentialSpec:\n                                  description: |-\n                                    GMSACredentialSpec is where the GMSA admission webhook\n                                    (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                    GMSA credential spec named by the GMSACredentialSpecName field.\n                                  type: string\n                                gmsaCredentialSpecName:\n                                  description: GMSACredentialSpecName is the name\n                                    of the GMSA credential spec to use.\n                                  type: string\n                                hostProcess:\n                                  description: |-\n                                    HostProcess determines if a container should be run as a 'Host Process' container.\n                                    All of a Pod's containers must have the same effective HostProcess value\n                                    (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                    In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                  type: boolean\n                                runAsUserName:\n                                  description: |-\n                                    The UserName in Windows to run the entrypoint of the container process.\n                                    Defaults to the user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext. If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: string\n                              type: object\n                          type: object\n                        startupProbe:\n                          description: |-\n                            StartupProbe indicates that the Pod has successfully initialized.\n                            If specified, no other probes are executed until this completes successfully.\n                            If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                            This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                            when it might take a long time to load data or warm a cache, than during steady-state operation.\n                            This cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        stdin:\n                          description: |-\n                            Whether this container should allocate a buffer for stdin in the container runtime. If this\n                            is not set, reads from stdin in the container will always result in EOF.\n                            Default is false.\n                          type: boolean\n                        stdinOnce:\n                          description: |-\n                            Whether the container runtime should close the stdin channel after it has been opened by\n                            a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                            sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                            first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                            at which time stdin is closed and remains closed until the container is restarted. If this\n                            flag is false, a container processes that reads from stdin will never receive an EOF.\n                            Default is false\n                          type: boolean\n                        terminationMessagePath:\n                          description: |-\n                            Optional: Path at which the file to which the container's termination message\n                            will be written is mounted into the container's filesystem.\n                            Message written is intended to be brief final status, such as an assertion failure message.\n                            Will be truncated by the node if greater than 4096 bytes. The total message length across\n                            all containers will be limited to 12kb.\n                            Defaults to /dev/termination-log.\n                            Cannot be updated.\n                          type: string\n                        terminationMessagePolicy:\n                          description: |-\n                            Indicate how the termination message should be populated. File will use the contents of\n                            terminationMessagePath to populate the container status message on both success and failure.\n                            FallbackToLogsOnError will use the last chunk of container log output if the termination\n                            message file is empty and the container exited with an error.\n                            The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                            Defaults to File.\n                            Cannot be updated.\n                          type: string\n                        tty:\n                          description: |-\n                            Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                            Default is false.\n                          type: boolean\n                        volumeDevices:\n                          description: volumeDevices is the list of block devices\n                            to be used by the container.\n                          items:\n                            description: volumeDevice describes a mapping of a raw\n                              block device within a container.\n                            properties:\n                              devicePath:\n                                description: devicePath is the path inside of the\n                                  container that the device will be mapped to.\n                                type: string\n                              name:\n                                description: name must match the name of a persistentVolumeClaim\n                                  in the pod\n                                type: string\n                            required:\n                            - devicePath\n                            - name\n                            type: object\n                          type: array\n                        volumeMounts:\n                          description: |-\n                            Pod volumes to mount into the container's filesystem.\n                            Cannot be updated.\n                          items:\n                            description: VolumeMount describes a mounting of a Volume\n                              within a container.\n                            properties:\n                              mountPath:\n                                description: |-\n                                  Path within the container at which the volume should be mounted.  Must\n                                  not contain ':'.\n                                type: string\n                              mountPropagation:\n                                description: |-\n                                  mountPropagation determines how mounts are propagated from the host\n                                  to container and the other way around.\n                                  When not set, MountPropagationNone is used.\n                                  This field is beta in 1.10.\n                                type: string\n                              name:\n                                description: This must match the Name of a Volume.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  Mounted read-only if true, read-write otherwise (false or unspecified).\n                                  Defaults to false.\n                                type: boolean\n                              subPath:\n                                description: |-\n                                  Path within the volume from which the container's volume should be mounted.\n                                  Defaults to \"\" (volume's root).\n                                type: string\n                              subPathExpr:\n                                description: |-\n                                  Expanded path within the volume from which the container's volume should be mounted.\n                                  Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                  Defaults to \"\" (volume's root).\n                                  SubPathExpr and SubPath are mutually exclusive.\n                                type: string\n                            required:\n                            - mountPath\n                            - name\n                            type: object\n                          type: array\n                        workingDir:\n                          description: |-\n                            Container's working directory.\n                            If not specified, the container runtime's default will be used, which\n                            might be configured in the container image.\n                            Cannot be updated.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                  dnsConfig:\n                    description: |-\n                      Specifies the DNS parameters of a pod.\n                      Parameters specified here will be merged to the generated DNS\n                      configuration based on DNSPolicy.\n                    properties:\n                      nameservers:\n                        description: |-\n                          A list of DNS name server IP addresses.\n                          This will be appended to the base nameservers generated from DNSPolicy.\n                          Duplicated nameservers will be removed.\n                        items:\n                          type: string\n                        type: array\n                      options:\n                        description: |-\n                          A list of DNS resolver options.\n                          This will be merged with the base options generated from DNSPolicy.\n                          Duplicated entries will be removed. Resolution options given in Options\n                          will override those that appear in the base DNSPolicy.\n                        items:\n                          description: PodDNSConfigOption defines DNS resolver options\n                            of a pod.\n                          properties:\n                            name:\n                              description: Required.\n                              type: string\n                            value:\n                              type: string\n                          type: object\n                        type: array\n                      searches:\n                        description: |-\n                          A list of DNS search domains for host-name lookup.\n                          This will be appended to the base search paths generated from DNSPolicy.\n                          Duplicated search paths will be removed.\n                        items:\n                          type: string\n                        type: array\n                    type: object\n                  dnsPolicy:\n                    description: |-\n                      Set DNS policy for the pod.\n                      Defaults to \"ClusterFirst\".\n                      Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.\n                      DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy.\n                      To have DNS options set along with hostNetwork, you have to specify DNS policy\n                      explicitly to 'ClusterFirstWithHostNet'.\n                    type: string\n                  enableServiceLinks:\n                    description: |-\n                      EnableServiceLinks indicates whether information about services should be injected into pod's\n                      environment variables, matching the syntax of Docker links.\n                      Optional: Defaults to true.\n                    type: boolean\n                  ephemeralContainers:\n                    description: |-\n                      List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing\n                      pod to perform user-initiated actions such as debugging. This list cannot be specified when\n                      creating a pod, and it cannot be modified by updating the pod spec. In order to add an\n                      ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.\n                    items:\n                      description: |-\n                        An EphemeralContainer is a temporary container that you may add to an existing Pod for\n                        user-initiated activities such as debugging. Ephemeral containers have no resource or\n                        scheduling guarantees, and they will not be restarted when they exit or when a Pod is\n                        removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the\n                        Pod to exceed its resource allocation.\n\n\n                        To add an ephemeral container, use the ephemeralcontainers subresource of an existing\n                        Pod. Ephemeral containers may not be removed or restarted.\n                      properties:\n                        args:\n                          description: |-\n                            Arguments to the entrypoint.\n                            The image's CMD is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        command:\n                          description: |-\n                            Entrypoint array. Not executed within a shell.\n                            The image's ENTRYPOINT is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        env:\n                          description: |-\n                            List of environment variables to set in the container.\n                            Cannot be updated.\n                          items:\n                            description: EnvVar represents an environment variable\n                              present in a Container.\n                            properties:\n                              name:\n                                description: Name of the environment variable. Must\n                                  be a C_IDENTIFIER.\n                                type: string\n                              value:\n                                description: |-\n                                  Variable references $(VAR_NAME) are expanded\n                                  using the previously defined environment variables in the container and\n                                  any service environment variables. If a variable cannot be resolved,\n                                  the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                  \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                  Escaped references will never be expanded, regardless of whether the variable\n                                  exists or not.\n                                  Defaults to \"\".\n                                type: string\n                              valueFrom:\n                                description: Source for the environment variable's\n                                  value. Cannot be used if value is not empty.\n                                properties:\n                                  configMapKeyRef:\n                                    description: Selects a key of a ConfigMap.\n                                    properties:\n                                      key:\n                                        description: The key to select.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          or its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  fieldRef:\n                                    description: |-\n                                      Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                      spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  secretKeyRef:\n                                    description: Selects a key of a secret in the\n                                      pod's namespace\n                                    properties:\n                                      key:\n                                        description: The key of the secret to select\n                                          from.  Must be a valid secret key.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret or\n                                          its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        envFrom:\n                          description: |-\n                            List of sources to populate environment variables in the container.\n                            The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                            will be reported as an event when the container is starting. When a key exists in multiple\n                            sources, the value associated with the last source will take precedence.\n                            Values defined by an Env with a duplicate key will take precedence.\n                            Cannot be updated.\n                          items:\n                            description: EnvFromSource represents the source of a\n                              set of ConfigMaps\n                            properties:\n                              configMapRef:\n                                description: The ConfigMap to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap must\n                                      be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              prefix:\n                                description: An optional identifier to prepend to\n                                  each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                type: string\n                              secretRef:\n                                description: The Secret to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret must be\n                                      defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          type: array\n                        image:\n                          description: |-\n                            Container image name.\n                            More info: https://kubernetes.io/docs/concepts/containers/images\n                          type: string\n                        imagePullPolicy:\n                          description: |-\n                            Image pull policy.\n                            One of Always, Never, IfNotPresent.\n                            Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                          type: string\n                        lifecycle:\n                          description: Lifecycle is not allowed for ephemeral containers.\n                          properties:\n                            postStart:\n                              description: |-\n                                PostStart is called immediately after a container is created. If the handler fails,\n                                the container is terminated and restarted according to its restart policy.\n                                Other management of the container blocks until the hook completes.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                            preStop:\n                              description: |-\n                                PreStop is called immediately before a container is terminated due to an\n                                API request or management event such as liveness/startup probe failure,\n                                preemption, resource contention, etc. The handler is not called if the\n                                container crashes or exits. The Pod's termination grace period countdown begins before the\n                                PreStop hook is executed. Regardless of the outcome of the handler, the\n                                container will eventually terminate within the Pod's termination grace\n                                period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                or until the termination grace period is reached.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                          type: object\n                        livenessProbe:\n                          description: Probes are not allowed for ephemeral containers.\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        name:\n                          description: |-\n                            Name of the ephemeral container specified as a DNS_LABEL.\n                            This name must be unique among all containers, init containers and ephemeral containers.\n                          type: string\n                        ports:\n                          description: Ports are not allowed for ephemeral containers.\n                          items:\n                            description: ContainerPort represents a network port in\n                              a single container.\n                            properties:\n                              containerPort:\n                                description: |-\n                                  Number of port to expose on the pod's IP address.\n                                  This must be a valid port number, 0 < x < 65536.\n                                format: int32\n                                type: integer\n                              hostIP:\n                                description: What host IP to bind the external port\n                                  to.\n                                type: string\n                              hostPort:\n                                description: |-\n                                  Number of port to expose on the host.\n                                  If specified, this must be a valid port number, 0 < x < 65536.\n                                  If HostNetwork is specified, this must match ContainerPort.\n                                  Most containers do not need this.\n                                format: int32\n                                type: integer\n                              name:\n                                description: |-\n                                  If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                  named port in a pod must have a unique name. Name for the port that can be\n                                  referred to by services.\n                                type: string\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  Protocol for port. Must be UDP, TCP, or SCTP.\n                                  Defaults to \"TCP\".\n                                type: string\n                            required:\n                            - containerPort\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - containerPort\n                          - protocol\n                          x-kubernetes-list-type: map\n                        readinessProbe:\n                          description: Probes are not allowed for ephemeral containers.\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        resizePolicy:\n                          description: Resources resize policy for the container.\n                          items:\n                            description: ContainerResizePolicy represents resource\n                              resize policy for the container.\n                            properties:\n                              resourceName:\n                                description: |-\n                                  Name of the resource to which this resource resize policy applies.\n                                  Supported values: cpu, memory.\n                                type: string\n                              restartPolicy:\n                                description: |-\n                                  Restart policy to apply when specified resource is resized.\n                                  If not specified, it defaults to NotRequired.\n                                type: string\n                            required:\n                            - resourceName\n                            - restartPolicy\n                            type: object\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        resources:\n                          description: |-\n                            Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources\n                            already allocated to the pod.\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                        restartPolicy:\n                          description: |-\n                            Restart policy for the container to manage the restart behavior of each\n                            container within a pod.\n                            This may only be set for init containers. You cannot set this field on\n                            ephemeral containers.\n                          type: string\n                        securityContext:\n                          description: |-\n                            Optional: SecurityContext defines the security options the ephemeral container should be run with.\n                            If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                          properties:\n                            allowPrivilegeEscalation:\n                              description: |-\n                                AllowPrivilegeEscalation controls whether a process can gain more\n                                privileges than its parent process. This bool directly controls if\n                                the no_new_privs flag will be set on the container process.\n                                AllowPrivilegeEscalation is true always when the container is:\n                                1) run as Privileged\n                                2) has CAP_SYS_ADMIN\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            capabilities:\n                              description: |-\n                                The capabilities to add/drop when running containers.\n                                Defaults to the default set of capabilities granted by the container runtime.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                add:\n                                  description: Added capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                                drop:\n                                  description: Removed capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                              type: object\n                            privileged:\n                              description: |-\n                                Run container in privileged mode.\n                                Processes in privileged containers are essentially equivalent to root on the host.\n                                Defaults to false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            procMount:\n                              description: |-\n                                procMount denotes the type of proc mount to use for the containers.\n                                The default is DefaultProcMount which uses the container runtime defaults for\n                                readonly paths and masked paths.\n                                This requires the ProcMountType feature flag to be enabled.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: string\n                            readOnlyRootFilesystem:\n                              description: |-\n                                Whether this container has a read-only root filesystem.\n                                Default is false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            runAsGroup:\n                              description: |-\n                                The GID to run the entrypoint of the container process.\n                                Uses runtime default if unset.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            runAsNonRoot:\n                              description: |-\n                                Indicates that the container must run as a non-root user.\n                                If true, the Kubelet will validate the image at runtime to ensure that it\n                                does not run as UID 0 (root) and fail to start the container if it does.\n                                If unset or false, no such validation will be performed.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              type: boolean\n                            runAsUser:\n                              description: |-\n                                The UID to run the entrypoint of the container process.\n                                Defaults to user specified in image metadata if unspecified.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            seLinuxOptions:\n                              description: |-\n                                The SELinux context to be applied to the container.\n                                If unspecified, the container runtime will allocate a random SELinux context for each\n                                container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                level:\n                                  description: Level is SELinux level label that applies\n                                    to the container.\n                                  type: string\n                                role:\n                                  description: Role is a SELinux role label that applies\n                                    to the container.\n                                  type: string\n                                type:\n                                  description: Type is a SELinux type label that applies\n                                    to the container.\n                                  type: string\n                                user:\n                                  description: User is a SELinux user label that applies\n                                    to the container.\n                                  type: string\n                              type: object\n                            seccompProfile:\n                              description: |-\n                                The seccomp options to use by this container. If seccomp options are\n                                provided at both the pod & container level, the container options\n                                override the pod options.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                localhostProfile:\n                                  description: |-\n                                    localhostProfile indicates a profile defined in a file on the node should be used.\n                                    The profile must be preconfigured on the node to work.\n                                    Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                    Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                  type: string\n                                type:\n                                  description: |-\n                                    type indicates which kind of seccomp profile will be applied.\n                                    Valid options are:\n\n\n                                    Localhost - a profile defined in a file on the node should be used.\n                                    RuntimeDefault - the container runtime default profile should be used.\n                                    Unconfined - no profile should be applied.\n                                  type: string\n                              required:\n                              - type\n                              type: object\n                            windowsOptions:\n                              description: |-\n                                The Windows specific settings applied to all containers.\n                                If unspecified, the options from the PodSecurityContext will be used.\n                                If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is linux.\n                              properties:\n                                gmsaCredentialSpec:\n                                  description: |-\n                                    GMSACredentialSpec is where the GMSA admission webhook\n                                    (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                    GMSA credential spec named by the GMSACredentialSpecName field.\n                                  type: string\n                                gmsaCredentialSpecName:\n                                  description: GMSACredentialSpecName is the name\n                                    of the GMSA credential spec to use.\n                                  type: string\n                                hostProcess:\n                                  description: |-\n                                    HostProcess determines if a container should be run as a 'Host Process' container.\n                                    All of a Pod's containers must have the same effective HostProcess value\n                                    (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                    In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                  type: boolean\n                                runAsUserName:\n                                  description: |-\n                                    The UserName in Windows to run the entrypoint of the container process.\n                                    Defaults to the user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext. If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: string\n                              type: object\n                          type: object\n                        startupProbe:\n                          description: Probes are not allowed for ephemeral containers.\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        stdin:\n                          description: |-\n                            Whether this container should allocate a buffer for stdin in the container runtime. If this\n                            is not set, reads from stdin in the container will always result in EOF.\n                            Default is false.\n                          type: boolean\n                        stdinOnce:\n                          description: |-\n                            Whether the container runtime should close the stdin channel after it has been opened by\n                            a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                            sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                            first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                            at which time stdin is closed and remains closed until the container is restarted. If this\n                            flag is false, a container processes that reads from stdin will never receive an EOF.\n                            Default is false\n                          type: boolean\n                        targetContainerName:\n                          description: |-\n                            If set, the name of the container from PodSpec that this ephemeral container targets.\n                            The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container.\n                            If not set then the ephemeral container uses the namespaces configured in the Pod spec.\n\n\n                            The container runtime must implement support for this feature. If the runtime does not\n                            support namespace targeting then the result of setting this field is undefined.\n                          type: string\n                        terminationMessagePath:\n                          description: |-\n                            Optional: Path at which the file to which the container's termination message\n                            will be written is mounted into the container's filesystem.\n                            Message written is intended to be brief final status, such as an assertion failure message.\n                            Will be truncated by the node if greater than 4096 bytes. The total message length across\n                            all containers will be limited to 12kb.\n                            Defaults to /dev/termination-log.\n                            Cannot be updated.\n                          type: string\n                        terminationMessagePolicy:\n                          description: |-\n                            Indicate how the termination message should be populated. File will use the contents of\n                            terminationMessagePath to populate the container status message on both success and failure.\n                            FallbackToLogsOnError will use the last chunk of container log output if the termination\n                            message file is empty and the container exited with an error.\n                            The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                            Defaults to File.\n                            Cannot be updated.\n                          type: string\n                        tty:\n                          description: |-\n                            Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                            Default is false.\n                          type: boolean\n                        volumeDevices:\n                          description: volumeDevices is the list of block devices\n                            to be used by the container.\n                          items:\n                            description: volumeDevice describes a mapping of a raw\n                              block device within a container.\n                            properties:\n                              devicePath:\n                                description: devicePath is the path inside of the\n                                  container that the device will be mapped to.\n                                type: string\n                              name:\n                                description: name must match the name of a persistentVolumeClaim\n                                  in the pod\n                                type: string\n                            required:\n                            - devicePath\n                            - name\n                            type: object\n                          type: array\n                        volumeMounts:\n                          description: |-\n                            Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers.\n                            Cannot be updated.\n                          items:\n                            description: VolumeMount describes a mounting of a Volume\n                              within a container.\n                            properties:\n                              mountPath:\n                                description: |-\n                                  Path within the container at which the volume should be mounted.  Must\n                                  not contain ':'.\n                                type: string\n                              mountPropagation:\n                                description: |-\n                                  mountPropagation determines how mounts are propagated from the host\n                                  to container and the other way around.\n                                  When not set, MountPropagationNone is used.\n                                  This field is beta in 1.10.\n                                type: string\n                              name:\n                                description: This must match the Name of a Volume.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  Mounted read-only if true, read-write otherwise (false or unspecified).\n                                  Defaults to false.\n                                type: boolean\n                              subPath:\n                                description: |-\n                                  Path within the volume from which the container's volume should be mounted.\n                                  Defaults to \"\" (volume's root).\n                                type: string\n                              subPathExpr:\n                                description: |-\n                                  Expanded path within the volume from which the container's volume should be mounted.\n                                  Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                  Defaults to \"\" (volume's root).\n                                  SubPathExpr and SubPath are mutually exclusive.\n                                type: string\n                            required:\n                            - mountPath\n                            - name\n                            type: object\n                          type: array\n                        workingDir:\n                          description: |-\n                            Container's working directory.\n                            If not specified, the container runtime's default will be used, which\n                            might be configured in the container image.\n                            Cannot be updated.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                  hostAliases:\n                    description: |-\n                      HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts\n                      file if specified. This is only valid for non-hostNetwork pods.\n                    items:\n                      description: |-\n                        HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the\n                        pod's hosts file.\n                      properties:\n                        hostnames:\n                          description: Hostnames for the above IP address.\n                          items:\n                            type: string\n                          type: array\n                        ip:\n                          description: IP address of the host file entry.\n                          type: string\n                      type: object\n                    type: array\n                  hostIPC:\n                    description: |-\n                      Use the host's ipc namespace.\n                      Optional: Default to false.\n                    type: boolean\n                  hostNetwork:\n                    description: |-\n                      Host networking requested for this pod. Use the host's network namespace.\n                      If this option is set, the ports that will be used must be specified.\n                      Default to false.\n                    type: boolean\n                  hostPID:\n                    description: |-\n                      Use the host's pid namespace.\n                      Optional: Default to false.\n                    type: boolean\n                  hostUsers:\n                    description: |-\n                      Use the host's user namespace.\n                      Optional: Default to true.\n                      If set to true or not present, the pod will be run in the host user namespace, useful\n                      for when the pod needs a feature only available to the host user namespace, such as\n                      loading a kernel module with CAP_SYS_MODULE.\n                      When set to false, a new userns is created for the pod. Setting false is useful for\n                      mitigating container breakout vulnerabilities even allowing users to run their\n                      containers as root without actually having root privileges on the host.\n                      This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.\n                    type: boolean\n                  hostname:\n                    description: |-\n                      Specifies the hostname of the Pod\n                      If not specified, the pod's hostname will be set to a system-defined value.\n                    type: string\n                  imagePullSecrets:\n                    description: |-\n                      ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec.\n                      If specified, these secrets will be passed to individual puller implementations for them to use.\n                      More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod\n                    items:\n                      description: |-\n                        LocalObjectReference contains enough information to let you locate the\n                        referenced object inside the same namespace.\n                      properties:\n                        name:\n                          description: |-\n                            Name of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            TODO: Add other useful fields. apiVersion, kind, uid?\n                          type: string\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    type: array\n                  initContainers:\n                    description: |-\n                      List of initialization containers belonging to the pod.\n                      Init containers are executed in order prior to containers being started. If any\n                      init container fails, the pod is considered to have failed and is handled according\n                      to its restartPolicy. The name for an init container or normal container must be\n                      unique among all containers.\n                      Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes.\n                      The resourceRequirements of an init container are taken into account during scheduling\n                      by finding the highest request/limit for each resource type, and then using the max of\n                      of that value or the sum of the normal containers. Limits are applied to init containers\n                      in a similar fashion.\n                      Init containers cannot currently be added or removed.\n                      Cannot be updated.\n                      More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n                    items:\n                      description: A single application container that you want to\n                        run within a pod.\n                      properties:\n                        args:\n                          description: |-\n                            Arguments to the entrypoint.\n                            The container image's CMD is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        command:\n                          description: |-\n                            Entrypoint array. Not executed within a shell.\n                            The container image's ENTRYPOINT is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        env:\n                          description: |-\n                            List of environment variables to set in the container.\n                            Cannot be updated.\n                          items:\n                            description: EnvVar represents an environment variable\n                              present in a Container.\n                            properties:\n                              name:\n                                description: Name of the environment variable. Must\n                                  be a C_IDENTIFIER.\n                                type: string\n                              value:\n                                description: |-\n                                  Variable references $(VAR_NAME) are expanded\n                                  using the previously defined environment variables in the container and\n                                  any service environment variables. If a variable cannot be resolved,\n                                  the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                  \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                  Escaped references will never be expanded, regardless of whether the variable\n                                  exists or not.\n                                  Defaults to \"\".\n                                type: string\n                              valueFrom:\n                                description: Source for the environment variable's\n                                  value. Cannot be used if value is not empty.\n                                properties:\n                                  configMapKeyRef:\n                                    description: Selects a key of a ConfigMap.\n                                    properties:\n                                      key:\n                                        description: The key to select.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          or its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  fieldRef:\n                                    description: |-\n                                      Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                      spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  secretKeyRef:\n                                    description: Selects a key of a secret in the\n                                      pod's namespace\n                                    properties:\n                                      key:\n                                        description: The key of the secret to select\n                                          from.  Must be a valid secret key.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret or\n                                          its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        envFrom:\n                          description: |-\n                            List of sources to populate environment variables in the container.\n                            The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                            will be reported as an event when the container is starting. When a key exists in multiple\n                            sources, the value associated with the last source will take precedence.\n                            Values defined by an Env with a duplicate key will take precedence.\n                            Cannot be updated.\n                          items:\n                            description: EnvFromSource represents the source of a\n                              set of ConfigMaps\n                            properties:\n                              configMapRef:\n                                description: The ConfigMap to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap must\n                                      be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              prefix:\n                                description: An optional identifier to prepend to\n                                  each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                type: string\n                              secretRef:\n                                description: The Secret to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret must be\n                                      defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          type: array\n                        image:\n                          description: |-\n                            Container image name.\n                            More info: https://kubernetes.io/docs/concepts/containers/images\n                            This field is optional to allow higher level config management to default or override\n                            container images in workload controllers like Deployments and StatefulSets.\n                          type: string\n                        imagePullPolicy:\n                          description: |-\n                            Image pull policy.\n                            One of Always, Never, IfNotPresent.\n                            Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                          type: string\n                        lifecycle:\n                          description: |-\n                            Actions that the management system should take in response to container lifecycle events.\n                            Cannot be updated.\n                          properties:\n                            postStart:\n                              description: |-\n                                PostStart is called immediately after a container is created. If the handler fails,\n                                the container is terminated and restarted according to its restart policy.\n                                Other management of the container blocks until the hook completes.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                            preStop:\n                              description: |-\n                                PreStop is called immediately before a container is terminated due to an\n                                API request or management event such as liveness/startup probe failure,\n                                preemption, resource contention, etc. The handler is not called if the\n                                container crashes or exits. The Pod's termination grace period countdown begins before the\n                                PreStop hook is executed. Regardless of the outcome of the handler, the\n                                container will eventually terminate within the Pod's termination grace\n                                period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                or until the termination grace period is reached.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                          type: object\n                        livenessProbe:\n                          description: |-\n                            Periodic probe of container liveness.\n                            Container will be restarted if the probe fails.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        name:\n                          description: |-\n                            Name of the container specified as a DNS_LABEL.\n                            Each container in a pod must have a unique name (DNS_LABEL).\n                            Cannot be updated.\n                          type: string\n                        ports:\n                          description: |-\n                            List of ports to expose from the container. Not specifying a port here\n                            DOES NOT prevent that port from being exposed. Any port which is\n                            listening on the default \"0.0.0.0\" address inside a container will be\n                            accessible from the network.\n                            Modifying this array with strategic merge patch may corrupt the data.\n                            For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                            Cannot be updated.\n                          items:\n                            description: ContainerPort represents a network port in\n                              a single container.\n                            properties:\n                              containerPort:\n                                description: |-\n                                  Number of port to expose on the pod's IP address.\n                                  This must be a valid port number, 0 < x < 65536.\n                                format: int32\n                                type: integer\n                              hostIP:\n                                description: What host IP to bind the external port\n                                  to.\n                                type: string\n                              hostPort:\n                                description: |-\n                                  Number of port to expose on the host.\n                                  If specified, this must be a valid port number, 0 < x < 65536.\n                                  If HostNetwork is specified, this must match ContainerPort.\n                                  Most containers do not need this.\n                                format: int32\n                                type: integer\n                              name:\n                                description: |-\n                                  If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                  named port in a pod must have a unique name. Name for the port that can be\n                                  referred to by services.\n                                type: string\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  Protocol for port. Must be UDP, TCP, or SCTP.\n                                  Defaults to \"TCP\".\n                                type: string\n                            required:\n                            - containerPort\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - containerPort\n                          - protocol\n                          x-kubernetes-list-type: map\n                        readinessProbe:\n                          description: |-\n                            Periodic probe of container service readiness.\n                            Container will be removed from service endpoints if the probe fails.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        resizePolicy:\n                          description: Resources resize policy for the container.\n                          items:\n                            description: ContainerResizePolicy represents resource\n                              resize policy for the container.\n                            properties:\n                              resourceName:\n                                description: |-\n                                  Name of the resource to which this resource resize policy applies.\n                                  Supported values: cpu, memory.\n                                type: string\n                              restartPolicy:\n                                description: |-\n                                  Restart policy to apply when specified resource is resized.\n                                  If not specified, it defaults to NotRequired.\n                                type: string\n                            required:\n                            - resourceName\n                            - restartPolicy\n                            type: object\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        resources:\n                          description: |-\n                            Compute Resources required by this container.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                        restartPolicy:\n                          description: |-\n                            RestartPolicy defines the restart behavior of individual containers in a pod.\n                            This field may only be set for init containers, and the only allowed value is \"Always\".\n                            For non-init containers or when this field is not specified,\n                            the restart behavior is defined by the Pod's restart policy and the container type.\n                            Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                            this init container will be continually restarted on\n                            exit until all regular containers have terminated. Once all regular\n                            containers have completed, all init containers with restartPolicy \"Always\"\n                            will be shut down. This lifecycle differs from normal init containers and\n                            is often referred to as a \"sidecar\" container. Although this init\n                            container still starts in the init container sequence, it does not wait\n                            for the container to complete before proceeding to the next init\n                            container. Instead, the next init container starts immediately after this\n                            init container is started, or after any startupProbe has successfully\n                            completed.\n                          type: string\n                        securityContext:\n                          description: |-\n                            SecurityContext defines the security options the container should be run with.\n                            If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                            More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                          properties:\n                            allowPrivilegeEscalation:\n                              description: |-\n                                AllowPrivilegeEscalation controls whether a process can gain more\n                                privileges than its parent process. This bool directly controls if\n                                the no_new_privs flag will be set on the container process.\n                                AllowPrivilegeEscalation is true always when the container is:\n                                1) run as Privileged\n                                2) has CAP_SYS_ADMIN\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            capabilities:\n                              description: |-\n                                The capabilities to add/drop when running containers.\n                                Defaults to the default set of capabilities granted by the container runtime.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                add:\n                                  description: Added capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                                drop:\n                                  description: Removed capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                              type: object\n                            privileged:\n                              description: |-\n                                Run container in privileged mode.\n                                Processes in privileged containers are essentially equivalent to root on the host.\n                                Defaults to false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            procMount:\n                              description: |-\n                                procMount denotes the type of proc mount to use for the containers.\n                                The default is DefaultProcMount which uses the container runtime defaults for\n                                readonly paths and masked paths.\n                                This requires the ProcMountType feature flag to be enabled.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: string\n                            readOnlyRootFilesystem:\n                              description: |-\n                                Whether this container has a read-only root filesystem.\n                                Default is false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            runAsGroup:\n                              description: |-\n                                The GID to run the entrypoint of the container process.\n                                Uses runtime default if unset.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            runAsNonRoot:\n                              description: |-\n                                Indicates that the container must run as a non-root user.\n                                If true, the Kubelet will validate the image at runtime to ensure that it\n                                does not run as UID 0 (root) and fail to start the container if it does.\n                                If unset or false, no such validation will be performed.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              type: boolean\n                            runAsUser:\n                              description: |-\n                                The UID to run the entrypoint of the container process.\n                                Defaults to user specified in image metadata if unspecified.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            seLinuxOptions:\n                              description: |-\n                                The SELinux context to be applied to the container.\n                                If unspecified, the container runtime will allocate a random SELinux context for each\n                                container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                level:\n                                  description: Level is SELinux level label that applies\n                                    to the container.\n                                  type: string\n                                role:\n                                  description: Role is a SELinux role label that applies\n                                    to the container.\n                                  type: string\n                                type:\n                                  description: Type is a SELinux type label that applies\n                                    to the container.\n                                  type: string\n                                user:\n                                  description: User is a SELinux user label that applies\n                                    to the container.\n                                  type: string\n                              type: object\n                            seccompProfile:\n                              description: |-\n                                The seccomp options to use by this container. If seccomp options are\n                                provided at both the pod & container level, the container options\n                                override the pod options.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                localhostProfile:\n                                  description: |-\n                                    localhostProfile indicates a profile defined in a file on the node should be used.\n                                    The profile must be preconfigured on the node to work.\n                                    Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                    Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                  type: string\n                                type:\n                                  description: |-\n                                    type indicates which kind of seccomp profile will be applied.\n                                    Valid options are:\n\n\n                                    Localhost - a profile defined in a file on the node should be used.\n                                    RuntimeDefault - the container runtime default profile should be used.\n                                    Unconfined - no profile should be applied.\n                                  type: string\n                              required:\n                              - type\n                              type: object\n                            windowsOptions:\n                              description: |-\n                                The Windows specific settings applied to all containers.\n                                If unspecified, the options from the PodSecurityContext will be used.\n                                If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is linux.\n                              properties:\n                                gmsaCredentialSpec:\n                                  description: |-\n                                    GMSACredentialSpec is where the GMSA admission webhook\n                                    (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                    GMSA credential spec named by the GMSACredentialSpecName field.\n                                  type: string\n                                gmsaCredentialSpecName:\n                                  description: GMSACredentialSpecName is the name\n                                    of the GMSA credential spec to use.\n                                  type: string\n                                hostProcess:\n                                  description: |-\n                                    HostProcess determines if a container should be run as a 'Host Process' container.\n                                    All of a Pod's containers must have the same effective HostProcess value\n                                    (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                    In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                  type: boolean\n                                runAsUserName:\n                                  description: |-\n                                    The UserName in Windows to run the entrypoint of the container process.\n                                    Defaults to the user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext. If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: string\n                              type: object\n                          type: object\n                        startupProbe:\n                          description: |-\n                            StartupProbe indicates that the Pod has successfully initialized.\n                            If specified, no other probes are executed until this completes successfully.\n                            If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                            This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                            when it might take a long time to load data or warm a cache, than during steady-state operation.\n                            This cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        stdin:\n                          description: |-\n                            Whether this container should allocate a buffer for stdin in the container runtime. If this\n                            is not set, reads from stdin in the container will always result in EOF.\n                            Default is false.\n                          type: boolean\n                        stdinOnce:\n                          description: |-\n                            Whether the container runtime should close the stdin channel after it has been opened by\n                            a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                            sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                            first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                            at which time stdin is closed and remains closed until the container is restarted. If this\n                            flag is false, a container processes that reads from stdin will never receive an EOF.\n                            Default is false\n                          type: boolean\n                        terminationMessagePath:\n                          description: |-\n                            Optional: Path at which the file to which the container's termination message\n                            will be written is mounted into the container's filesystem.\n                            Message written is intended to be brief final status, such as an assertion failure message.\n                            Will be truncated by the node if greater than 4096 bytes. The total message length across\n                            all containers will be limited to 12kb.\n                            Defaults to /dev/termination-log.\n                            Cannot be updated.\n                          type: string\n                        terminationMessagePolicy:\n                          description: |-\n                            Indicate how the termination message should be populated. File will use the contents of\n                            terminationMessagePath to populate the container status message on both success and failure.\n                            FallbackToLogsOnError will use the last chunk of container log output if the termination\n                            message file is empty and the container exited with an error.\n                            The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                            Defaults to File.\n                            Cannot be updated.\n                          type: string\n                        tty:\n                          description: |-\n                            Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                            Default is false.\n                          type: boolean\n                        volumeDevices:\n                          description: volumeDevices is the list of block devices\n                            to be used by the container.\n                          items:\n                            description: volumeDevice describes a mapping of a raw\n                              block device within a container.\n                            properties:\n                              devicePath:\n                                description: devicePath is the path inside of the\n                                  container that the device will be mapped to.\n                                type: string\n                              name:\n                                description: name must match the name of a persistentVolumeClaim\n                                  in the pod\n                                type: string\n                            required:\n                            - devicePath\n                            - name\n                            type: object\n                          type: array\n                        volumeMounts:\n                          description: |-\n                            Pod volumes to mount into the container's filesystem.\n                            Cannot be updated.\n                          items:\n                            description: VolumeMount describes a mounting of a Volume\n                              within a container.\n                            properties:\n                              mountPath:\n                                description: |-\n                                  Path within the container at which the volume should be mounted.  Must\n                                  not contain ':'.\n                                type: string\n                              mountPropagation:\n                                description: |-\n                                  mountPropagation determines how mounts are propagated from the host\n                                  to container and the other way around.\n                                  When not set, MountPropagationNone is used.\n                                  This field is beta in 1.10.\n                                type: string\n                              name:\n                                description: This must match the Name of a Volume.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  Mounted read-only if true, read-write otherwise (false or unspecified).\n                                  Defaults to false.\n                                type: boolean\n                              subPath:\n                                description: |-\n                                  Path within the volume from which the container's volume should be mounted.\n                                  Defaults to \"\" (volume's root).\n                                type: string\n                              subPathExpr:\n                                description: |-\n                                  Expanded path within the volume from which the container's volume should be mounted.\n                                  Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                  Defaults to \"\" (volume's root).\n                                  SubPathExpr and SubPath are mutually exclusive.\n                                type: string\n                            required:\n                            - mountPath\n                            - name\n                            type: object\n                          type: array\n                        workingDir:\n                          description: |-\n                            Container's working directory.\n                            If not specified, the container runtime's default will be used, which\n                            might be configured in the container image.\n                            Cannot be updated.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                  nodeName:\n                    description: |-\n                      NodeName is a request to schedule this pod onto a specific node. If it is non-empty,\n                      the scheduler simply schedules this pod onto that node, assuming that it fits resource\n                      requirements.\n                    type: string\n                  nodeSelector:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      NodeSelector is a selector which must be true for the pod to fit on a node.\n                      Selector which must match a node's labels for the pod to be scheduled on that node.\n                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  os:\n                    description: |-\n                      Specifies the OS of the containers in the pod.\n                      Some pod and container fields are restricted if this is set.\n\n\n                      If the OS field is set to linux, the following fields must be unset:\n                      -securityContext.windowsOptions\n\n\n                      If the OS field is set to windows, following fields must be unset:\n                      - spec.hostPID\n                      - spec.hostIPC\n                      - spec.hostUsers\n                      - spec.securityContext.seLinuxOptions\n                      - spec.securityContext.seccompProfile\n                      - spec.securityContext.fsGroup\n                      - spec.securityContext.fsGroupChangePolicy\n                      - spec.securityContext.sysctls\n                      - spec.shareProcessNamespace\n                      - spec.securityContext.runAsUser\n                      - spec.securityContext.runAsGroup\n                      - spec.securityContext.supplementalGroups\n                      - spec.containers[*].securityContext.seLinuxOptions\n                      - spec.containers[*].securityContext.seccompProfile\n                      - spec.containers[*].securityContext.capabilities\n                      - spec.containers[*].securityContext.readOnlyRootFilesystem\n                      - spec.containers[*].securityContext.privileged\n                      - spec.containers[*].securityContext.allowPrivilegeEscalation\n                      - spec.containers[*].securityContext.procMount\n                      - spec.containers[*].securityContext.runAsUser\n                      - spec.containers[*].securityContext.runAsGroup\n                    properties:\n                      name:\n                        description: |-\n                          Name is the name of the operating system. The currently supported values are linux and windows.\n                          Additional value may be defined in future and can be one of:\n                          https://github.com/opencontainers/runtime-spec/blob/master/config.md#platform-specific-configuration\n                          Clients should expect to handle additional values and treat unrecognized values in this field as os: null\n                        type: string\n                    required:\n                    - name\n                    type: object\n                  overhead:\n                    additionalProperties:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                      x-kubernetes-int-or-string: true\n                    description: |-\n                      Overhead represents the resource overhead associated with running a pod for a given RuntimeClass.\n                      This field will be autopopulated at admission time by the RuntimeClass admission controller. If\n                      the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests.\n                      The RuntimeClass admission controller will reject Pod create requests which have the overhead already\n                      set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value\n                      defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero.\n                      More info: https://git.k8s.io/enhancements/keps/sig-node/688-pod-overhead/README.md\n                    type: object\n                  preemptionPolicy:\n                    description: |-\n                      PreemptionPolicy is the Policy for preempting pods with lower priority.\n                      One of Never, PreemptLowerPriority.\n                      Defaults to PreemptLowerPriority if unset.\n                    type: string\n                  priority:\n                    description: |-\n                      The priority value. Various system components use this field to find the\n                      priority of the pod. When Priority Admission Controller is enabled, it\n                      prevents users from setting this field. The admission controller populates\n                      this field from PriorityClassName.\n                      The higher the value, the higher the priority.\n                    format: int32\n                    type: integer\n                  priorityClassName:\n                    description: |-\n                      If specified, indicates the pod's priority. \"system-node-critical\" and\n                      \"system-cluster-critical\" are two special keywords which indicate the\n                      highest priorities with the former being the highest priority. Any other\n                      name must be defined by creating a PriorityClass object with that name.\n                      If not specified, the pod priority will be default or zero if there is no\n                      default.\n                    type: string\n                  readinessGates:\n                    description: |-\n                      If specified, all readiness gates will be evaluated for pod readiness.\n                      A pod is ready when all its containers are ready AND\n                      all conditions specified in the readiness gates have status equal to \"True\"\n                      More info: https://git.k8s.io/enhancements/keps/sig-network/580-pod-readiness-gates\n                    items:\n                      description: PodReadinessGate contains the reference to a pod\n                        condition\n                      properties:\n                        conditionType:\n                          description: ConditionType refers to a condition in the\n                            pod's condition list with matching type.\n                          type: string\n                      required:\n                      - conditionType\n                      type: object\n                    type: array\n                  resourceClaims:\n                    description: |-\n                      ResourceClaims defines which ResourceClaims must be allocated\n                      and reserved before the Pod is allowed to start. The resources\n                      will be made available to those containers which consume them\n                      by name.\n\n\n                      This is an alpha field and requires enabling the\n                      DynamicResourceAllocation feature gate.\n\n\n                      This field is immutable.\n                    items:\n                      description: |-\n                        PodResourceClaim references exactly one ResourceClaim through a ClaimSource.\n                        It adds a name to it that uniquely identifies the ResourceClaim inside the Pod.\n                        Containers that need access to the ResourceClaim reference it with this name.\n                      properties:\n                        name:\n                          description: |-\n                            Name uniquely identifies this resource claim inside the pod.\n                            This must be a DNS_LABEL.\n                          type: string\n                        source:\n                          description: Source describes where to find the ResourceClaim.\n                          properties:\n                            resourceClaimName:\n                              description: |-\n                                ResourceClaimName is the name of a ResourceClaim object in the same\n                                namespace as this pod.\n                              type: string\n                            resourceClaimTemplateName:\n                              description: |-\n                                ResourceClaimTemplateName is the name of a ResourceClaimTemplate\n                                object in the same namespace as this pod.\n\n\n                                The template will be used to create a new ResourceClaim, which will\n                                be bound to this pod. When this pod is deleted, the ResourceClaim\n                                will also be deleted. The pod name and resource name, along with a\n                                generated component, will be used to form a unique name for the\n                                ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses.\n\n\n                                This field is immutable and no changes will be made to the\n                                corresponding ResourceClaim by the control plane after creating the\n                                ResourceClaim.\n                              type: string\n                          type: object\n                      required:\n                      - name\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                  restartPolicy:\n                    description: |-\n                      Restart policy for all containers within the pod.\n                      One of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted.\n                      Default to Always.\n                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy\n                    type: string\n                  runtimeClassName:\n                    description: |-\n                      RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used\n                      to run this pod.  If no RuntimeClass resource matches the named class, the pod will not be run.\n                      If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an\n                      empty definition that uses the default runtime handler.\n                      More info: https://git.k8s.io/enhancements/keps/sig-node/585-runtime-class\n                    type: string\n                  schedulerName:\n                    description: |-\n                      If specified, the pod will be dispatched by specified scheduler.\n                      If not specified, the pod will be dispatched by default scheduler.\n                    type: string\n                  schedulingGates:\n                    description: |-\n                      SchedulingGates is an opaque list of values that if specified will block scheduling the pod.\n                      If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the\n                      scheduler will not attempt to schedule the pod.\n\n\n                      SchedulingGates can only be set at pod creation time, and be removed only afterwards.\n\n\n                      This is a beta feature enabled by the PodSchedulingReadiness feature gate.\n                    items:\n                      description: PodSchedulingGate is associated to a Pod to guard\n                        its scheduling.\n                      properties:\n                        name:\n                          description: |-\n                            Name of the scheduling gate.\n                            Each scheduling gate must have a unique name field.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                  securityContext:\n                    description: |-\n                      SecurityContext holds pod-level security attributes and common container settings.\n                      Optional: Defaults to empty.  See type description for default values of each field.\n                    properties:\n                      fsGroup:\n                        description: |-\n                          A special supplemental group that applies to all containers in a pod.\n                          Some volume types allow the Kubelet to change the ownership of that volume\n                          to be owned by the pod:\n\n\n                          1. The owning GID will be the FSGroup\n                          2. The setgid bit is set (new files created in the volume will be owned by FSGroup)\n                          3. The permission bits are OR'd with rw-rw----\n\n\n                          If unset, the Kubelet will not modify the ownership and permissions of any volume.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        format: int64\n                        type: integer\n                      fsGroupChangePolicy:\n                        description: |-\n                          fsGroupChangePolicy defines behavior of changing ownership and permission of the volume\n                          before being exposed inside Pod. This field will only apply to\n                          volume types which support fsGroup based ownership(and permissions).\n                          It will have no effect on ephemeral volume types such as: secret, configmaps\n                          and emptydir.\n                          Valid values are \"OnRootMismatch\" and \"Always\". If not specified, \"Always\" is used.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        type: string\n                      runAsGroup:\n                        description: |-\n                          The GID to run the entrypoint of the container process.\n                          Uses runtime default if unset.\n                          May also be set in SecurityContext.  If set in both SecurityContext and\n                          PodSecurityContext, the value specified in SecurityContext takes precedence\n                          for that container.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        format: int64\n                        type: integer\n                      runAsNonRoot:\n                        description: |-\n                          Indicates that the container must run as a non-root user.\n                          If true, the Kubelet will validate the image at runtime to ensure that it\n                          does not run as UID 0 (root) and fail to start the container if it does.\n                          If unset or false, no such validation will be performed.\n                          May also be set in SecurityContext.  If set in both SecurityContext and\n                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                        type: boolean\n                      runAsUser:\n                        description: |-\n                          The UID to run the entrypoint of the container process.\n                          Defaults to user specified in image metadata if unspecified.\n                          May also be set in SecurityContext.  If set in both SecurityContext and\n                          PodSecurityContext, the value specified in SecurityContext takes precedence\n                          for that container.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        format: int64\n                        type: integer\n                      seLinuxOptions:\n                        description: |-\n                          The SELinux context to be applied to all containers.\n                          If unspecified, the container runtime will allocate a random SELinux context for each\n                          container.  May also be set in SecurityContext.  If set in\n                          both SecurityContext and PodSecurityContext, the value specified in SecurityContext\n                          takes precedence for that container.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        properties:\n                          level:\n                            description: Level is SELinux level label that applies\n                              to the container.\n                            type: string\n                          role:\n                            description: Role is a SELinux role label that applies\n                              to the container.\n                            type: string\n                          type:\n                            description: Type is a SELinux type label that applies\n                              to the container.\n                            type: string\n                          user:\n                            description: User is a SELinux user label that applies\n                              to the container.\n                            type: string\n                        type: object\n                      seccompProfile:\n                        description: |-\n                          The seccomp options to use by the containers in this pod.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        properties:\n                          localhostProfile:\n                            description: |-\n                              localhostProfile indicates a profile defined in a file on the node should be used.\n                              The profile must be preconfigured on the node to work.\n                              Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                              Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                            type: string\n                          type:\n                            description: |-\n                              type indicates which kind of seccomp profile will be applied.\n                              Valid options are:\n\n\n                              Localhost - a profile defined in a file on the node should be used.\n                              RuntimeDefault - the container runtime default profile should be used.\n                              Unconfined - no profile should be applied.\n                            type: string\n                        required:\n                        - type\n                        type: object\n                      supplementalGroups:\n                        description: |-\n                          A list of groups applied to the first process run in each container, in addition\n                          to the container's primary GID, the fsGroup (if specified), and group memberships\n                          defined in the container image for the uid of the container process. If unspecified,\n                          no additional groups are added to any container. Note that group memberships\n                          defined in the container image for the uid of the container process are still effective,\n                          even if they are not included in this list.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        items:\n                          format: int64\n                          type: integer\n                        type: array\n                      sysctls:\n                        description: |-\n                          Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported\n                          sysctls (by the container runtime) might fail to launch.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        items:\n                          description: Sysctl defines a kernel parameter to be set\n                          properties:\n                            name:\n                              description: Name of a property to set\n                              type: string\n                            value:\n                              description: Value of a property to set\n                              type: string\n                          required:\n                          - name\n                          - value\n                          type: object\n                        type: array\n                      windowsOptions:\n                        description: |-\n                          The Windows specific settings applied to all containers.\n                          If unspecified, the options within a container's SecurityContext will be used.\n                          If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                          Note that this field cannot be set when spec.os.name is linux.\n                        properties:\n                          gmsaCredentialSpec:\n                            description: |-\n                              GMSACredentialSpec is where the GMSA admission webhook\n                              (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                              GMSA credential spec named by the GMSACredentialSpecName field.\n                            type: string\n                          gmsaCredentialSpecName:\n                            description: GMSACredentialSpecName is the name of the\n                              GMSA credential spec to use.\n                            type: string\n                          hostProcess:\n                            description: |-\n                              HostProcess determines if a container should be run as a 'Host Process' container.\n                              All of a Pod's containers must have the same effective HostProcess value\n                              (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                              In addition, if HostProcess is true then HostNetwork must also be set to true.\n                            type: boolean\n                          runAsUserName:\n                            description: |-\n                              The UserName in Windows to run the entrypoint of the container process.\n                              Defaults to the user specified in image metadata if unspecified.\n                              May also be set in PodSecurityContext. If set in both SecurityContext and\n                              PodSecurityContext, the value specified in SecurityContext takes precedence.\n                            type: string\n                        type: object\n                    type: object\n                  serviceAccount:\n                    description: |-\n                      DeprecatedServiceAccount is a depreciated alias for ServiceAccountName.\n                      Deprecated: Use serviceAccountName instead.\n                    type: string\n                  serviceAccountName:\n                    description: |-\n                      ServiceAccountName is the name of the ServiceAccount to use to run this pod.\n                      More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n                    type: string\n                  setHostnameAsFQDN:\n                    description: |-\n                      If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default).\n                      In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname).\n                      In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip\\\\Parameters to FQDN.\n                      If a pod does not have FQDN, this has no effect.\n                      Default to false.\n                    type: boolean\n                  shareProcessNamespace:\n                    description: |-\n                      Share a single process namespace between all of the containers in a pod.\n                      When this is set containers will be able to view and signal processes from other containers\n                      in the same pod, and the first process in each container will not be assigned PID 1.\n                      HostPID and ShareProcessNamespace cannot both be set.\n                      Optional: Default to false.\n                    type: boolean\n                  subdomain:\n                    description: |-\n                      If specified, the fully qualified Pod hostname will be \"<hostname>.<subdomain>.<pod namespace>.svc.<cluster domain>\".\n                      If not specified, the pod will not have a domainname at all.\n                    type: string\n                  terminationGracePeriodSeconds:\n                    description: |-\n                      Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request.\n                      Value must be non-negative integer. The value zero indicates stop immediately via\n                      the kill signal (no opportunity to shut down).\n                      If this value is nil, the default grace period will be used instead.\n                      The grace period is the duration in seconds after the processes running in the pod are sent\n                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                      Set this value longer than the expected cleanup time for your process.\n                      Defaults to 30 seconds.\n                    format: int64\n                    type: integer\n                  tolerations:\n                    description: If specified, the pod's tolerations.\n                    items:\n                      description: |-\n                        The pod this Toleration is attached to tolerates any taint that matches\n                        the triple <key,value,effect> using the matching operator <operator>.\n                      properties:\n                        effect:\n                          description: |-\n                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                          type: string\n                        key:\n                          description: |-\n                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                          type: string\n                        operator:\n                          description: |-\n                            Operator represents a key's relationship to the value.\n                            Valid operators are Exists and Equal. Defaults to Equal.\n                            Exists is equivalent to wildcard for value, so that a pod can\n                            tolerate all taints of a particular category.\n                          type: string\n                        tolerationSeconds:\n                          description: |-\n                            TolerationSeconds represents the period of time the toleration (which must be\n                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                            negative values will be treated as 0 (evict immediately) by the system.\n                          format: int64\n                          type: integer\n                        value:\n                          description: |-\n                            Value is the taint value the toleration matches to.\n                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                          type: string\n                      type: object\n                    type: array\n                  topologySpreadConstraints:\n                    description: |-\n                      TopologySpreadConstraints describes how a group of pods ought to spread across topology\n                      domains. Scheduler will schedule pods in a way which abides by the constraints.\n                      All topologySpreadConstraints are ANDed.\n                    items:\n                      description: TopologySpreadConstraint specifies how to spread\n                        matching pods among the given topology.\n                      properties:\n                        labelSelector:\n                          description: |-\n                            LabelSelector is used to find matching pods.\n                            Pods that match this label selector are counted to determine the number of pods\n                            in their corresponding topology domain.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        matchLabelKeys:\n                          description: |-\n                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                            spreading will be calculated. The keys are used to lookup values from the\n                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                            to select the group of existing pods over which spreading will be calculated\n                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                            Keys that don't exist in the incoming pod labels will\n                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        maxSkew:\n                          description: |-\n                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                            between the number of matching pods in the target topology and the global minimum.\n                            The global minimum is the minimum number of matching pods in an eligible domain\n                            or zero if the number of eligible domains is less than MinDomains.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 2/2/1:\n                            In this case, the global minimum is 1.\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |   P   |\n                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                            violate MaxSkew(1).\n                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                            to topologies that satisfy it.\n                            It's a required field. Default value is 1 and 0 is not allowed.\n                          format: int32\n                          type: integer\n                        minDomains:\n                          description: |-\n                            MinDomains indicates a minimum number of eligible domains.\n                            When the number of eligible domains with matching topology keys is less than minDomains,\n                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                            this value has no effect on scheduling.\n                            As a result, when the number of eligible domains is less than minDomains,\n                            scheduler won't schedule more than maxSkew Pods to those domains.\n                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                            Valid values are integers greater than 0.\n                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                            labelSelector spread as 2/2/2:\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |  P P  |\n                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                            it will violate MaxSkew.\n\n\n                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                          format: int32\n                          type: integer\n                        nodeAffinityPolicy:\n                          description: |-\n                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                            when calculating pod topology spread skew. Options are:\n                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                            If this value is nil, the behavior is equivalent to the Honor policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        nodeTaintsPolicy:\n                          description: |-\n                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                            pod topology spread skew. Options are:\n                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                            has a toleration, are included.\n                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        topologyKey:\n                          description: |-\n                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                            and identical values are considered to be in the same topology.\n                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                            of pods into each bucket.\n                            We define a domain as a particular instance of a topology.\n                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                            nodeAffinityPolicy and nodeTaintsPolicy.\n                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                            It's a required field.\n                          type: string\n                        whenUnsatisfiable:\n                          description: |-\n                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                            the spread constraint.\n                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                              but giving higher precedence to topologies that would help reduce the\n                              skew.\n                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                            if and only if every possible node assignment for that pod would violate\n                            \"MaxSkew\" on some topology.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 3/1/1:\n                            | zone1 | zone2 | zone3 |\n                            | P P P |   P   |   P   |\n                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                            won't make it *more* imbalanced.\n                            It's a required field.\n                          type: string\n                      required:\n                      - maxSkew\n                      - topologyKey\n                      - whenUnsatisfiable\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - topologyKey\n                    - whenUnsatisfiable\n                    x-kubernetes-list-type: map\n                  volumes:\n                    description: |-\n                      List of volumes that can be mounted by containers belonging to the pod.\n                      More info: https://kubernetes.io/docs/concepts/storage/volumes\n                    items:\n                      description: Volume represents a named volume in a pod that\n                        may be accessed by any container in the pod.\n                      properties:\n                        awsElasticBlockStore:\n                          description: |-\n                            awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                            kubelet's host machine and then exposed to the pod.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type of the volume that you want to mount.\n                                Tip: Ensure that the filesystem type is supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            partition:\n                              description: |-\n                                partition is the partition in the volume that you want to mount.\n                                If omitted, the default is to mount by volume name.\n                                Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                              format: int32\n                              type: integer\n                            readOnly:\n                              description: |-\n                                readOnly value true will force the readOnly setting in VolumeMounts.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                              type: boolean\n                            volumeID:\n                              description: |-\n                                volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                              type: string\n                          required:\n                          - volumeID\n                          type: object\n                        azureDisk:\n                          description: azureDisk represents an Azure Data Disk mount\n                            on the host and bind mount to the pod.\n                          properties:\n                            cachingMode:\n                              description: 'cachingMode is the Host Caching mode:\n                                None, Read Only, Read Write.'\n                              type: string\n                            diskName:\n                              description: diskName is the Name of the data disk in\n                                the blob storage\n                              type: string\n                            diskURI:\n                              description: diskURI is the URI of data disk in the\n                                blob storage\n                              type: string\n                            fsType:\n                              description: |-\n                                fsType is Filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            kind:\n                              description: 'kind expected values are Shared: multiple\n                                blob disks per storage account  Dedicated: single\n                                blob disk per storage account  Managed: azure managed\n                                data disk (only in managed availability set). defaults\n                                to shared'\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly Defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                          required:\n                          - diskName\n                          - diskURI\n                          type: object\n                        azureFile:\n                          description: azureFile represents an Azure File Service\n                            mount on the host and bind mount to the pod.\n                          properties:\n                            readOnly:\n                              description: |-\n                                readOnly defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            secretName:\n                              description: secretName is the  name of secret that\n                                contains Azure Storage Account Name and Key\n                              type: string\n                            shareName:\n                              description: shareName is the azure share Name\n                              type: string\n                          required:\n                          - secretName\n                          - shareName\n                          type: object\n                        cephfs:\n                          description: cephFS represents a Ceph FS mount on the host\n                            that shares a pod's lifetime\n                          properties:\n                            monitors:\n                              description: |-\n                                monitors is Required: Monitors is a collection of Ceph monitors\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              items:\n                                type: string\n                              type: array\n                            path:\n                              description: 'path is Optional: Used as the mounted\n                                root, rather than the full Ceph tree, default is /'\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              type: boolean\n                            secretFile:\n                              description: |-\n                                secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              type: string\n                            secretRef:\n                              description: |-\n                                secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            user:\n                              description: |-\n                                user is optional: User is the rados user name, default is admin\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              type: string\n                          required:\n                          - monitors\n                          type: object\n                        cinder:\n                          description: |-\n                            cinder represents a cinder volume attached and mounted on kubelets host machine.\n                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                                More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef is optional: points to a secret object containing parameters used to connect\n                                to OpenStack.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            volumeID:\n                              description: |-\n                                volumeID used to identify the volume in cinder.\n                                More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                              type: string\n                          required:\n                          - volumeID\n                          type: object\n                        configMap:\n                          description: configMap represents a configMap that should\n                            populate this volume\n                          properties:\n                            defaultMode:\n                              description: |-\n                                defaultMode is optional: mode bits used to set permissions on created files by default.\n                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                Defaults to 0644.\n                                Directories within the path are not affected by this setting.\n                                This might be in conflict with other options that affect the file\n                                mode, like fsGroup, and the result can be other mode bits set.\n                              format: int32\n                              type: integer\n                            items:\n                              description: |-\n                                items if unspecified, each key-value pair in the Data field of the referenced\n                                ConfigMap will be projected into the volume as a file whose name is the\n                                key and content is the value. If specified, the listed keys will be\n                                projected into the specified paths, and unlisted keys will not be\n                                present. If a key is specified which is not present in the ConfigMap,\n                                the volume setup will error unless it is marked optional. Paths must be\n                                relative and may not contain the '..' path or start with '..'.\n                              items:\n                                description: Maps a string key to a path within a\n                                  volume.\n                                properties:\n                                  key:\n                                    description: key is the key to project.\n                                    type: string\n                                  mode:\n                                    description: |-\n                                      mode is Optional: mode bits used to set permissions on this file.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      If not specified, the volume defaultMode will be used.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  path:\n                                    description: |-\n                                      path is the relative path of the file to map the key to.\n                                      May not be an absolute path.\n                                      May not contain the path element '..'.\n                                      May not start with the string '..'.\n                                    type: string\n                                required:\n                                - key\n                                - path\n                                type: object\n                              type: array\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: optional specify whether the ConfigMap\n                                or its keys must be defined\n                              type: boolean\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        csi:\n                          description: csi (Container Storage Interface) represents\n                            ephemeral storage that is handled by certain external\n                            CSI drivers (Beta feature).\n                          properties:\n                            driver:\n                              description: |-\n                                driver is the name of the CSI driver that handles this volume.\n                                Consult with your admin for the correct name as registered in the cluster.\n                              type: string\n                            fsType:\n                              description: |-\n                                fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                If not provided, the empty value is passed to the associated CSI driver\n                                which will determine the default filesystem to apply.\n                              type: string\n                            nodePublishSecretRef:\n                              description: |-\n                                nodePublishSecretRef is a reference to the secret object containing\n                                sensitive information to pass to the CSI driver to complete the CSI\n                                NodePublishVolume and NodeUnpublishVolume calls.\n                                This field is optional, and  may be empty if no secret is required. If the\n                                secret object contains more than one secret, all secret references are passed.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            readOnly:\n                              description: |-\n                                readOnly specifies a read-only configuration for the volume.\n                                Defaults to false (read/write).\n                              type: boolean\n                            volumeAttributes:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                volumeAttributes stores driver-specific properties that are passed to the CSI\n                                driver. Consult your driver's documentation for supported values.\n                              type: object\n                          required:\n                          - driver\n                          type: object\n                        downwardAPI:\n                          description: downwardAPI represents downward API about the\n                            pod that should populate this volume\n                          properties:\n                            defaultMode:\n                              description: |-\n                                Optional: mode bits to use on created files by default. Must be a\n                                Optional: mode bits used to set permissions on created files by default.\n                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                Defaults to 0644.\n                                Directories within the path are not affected by this setting.\n                                This might be in conflict with other options that affect the file\n                                mode, like fsGroup, and the result can be other mode bits set.\n                              format: int32\n                              type: integer\n                            items:\n                              description: Items is a list of downward API volume\n                                file\n                              items:\n                                description: DownwardAPIVolumeFile represents information\n                                  to create the file containing the pod field\n                                properties:\n                                  fieldRef:\n                                    description: 'Required: Selects a field of the\n                                      pod: only annotations, labels, name and namespace\n                                      are supported.'\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  mode:\n                                    description: |-\n                                      Optional: mode bits used to set permissions on this file, must be an octal value\n                                      between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      If not specified, the volume defaultMode will be used.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  path:\n                                    description: 'Required: Path is  the relative\n                                      path name of the file to be created. Must not\n                                      be absolute or contain the ''..'' path. Must\n                                      be utf-8 encoded. The first item of the relative\n                                      path must not start with ''..'''\n                                    type: string\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                required:\n                                - path\n                                type: object\n                              type: array\n                          type: object\n                        emptyDir:\n                          description: |-\n                            emptyDir represents a temporary directory that shares a pod's lifetime.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                          properties:\n                            medium:\n                              description: |-\n                                medium represents what type of storage medium should back this directory.\n                                The default is \"\" which means to use the node's default medium.\n                                Must be an empty string (default) or Memory.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                              type: string\n                            sizeLimit:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                The size limit is also applicable for memory medium.\n                                The maximum usage on memory medium EmptyDir would be the minimum value between\n                                the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                The default is nil which means that the limit is undefined.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                          type: object\n                        ephemeral:\n                          description: |-\n                            ephemeral represents a volume that is handled by a cluster storage driver.\n                            The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                            and deleted when the pod is removed.\n\n\n                            Use this if:\n                            a) the volume is only needed while the pod runs,\n                            b) features of normal volumes like restoring from snapshot or capacity\n                               tracking are needed,\n                            c) the storage driver is specified through a storage class, and\n                            d) the storage driver supports dynamic volume provisioning through\n                               a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                               information on the connection between this volume type\n                               and PersistentVolumeClaim).\n\n\n                            Use PersistentVolumeClaim or one of the vendor-specific\n                            APIs for volumes that persist for longer than the lifecycle\n                            of an individual pod.\n\n\n                            Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                            be used that way - see the documentation of the driver for\n                            more information.\n\n\n                            A pod can use both types of ephemeral volumes and\n                            persistent volumes at the same time.\n                          properties:\n                            volumeClaimTemplate:\n                              description: |-\n                                Will be used to create a stand-alone PVC to provision the volume.\n                                The pod in which this EphemeralVolumeSource is embedded will be the\n                                owner of the PVC, i.e. the PVC will be deleted together with the\n                                pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                `<volume name>` is the name from the `PodSpec.Volumes` array\n                                entry. Pod validation will reject the pod if the concatenated name\n                                is not valid for a PVC (for example, too long).\n\n\n                                An existing PVC with that name that is not owned by the pod\n                                will *not* be used for the pod to avoid using an unrelated\n                                volume by mistake. Starting the pod is then blocked until\n                                the unrelated PVC is removed. If such a pre-created PVC is\n                                meant to be used by the pod, the PVC has to updated with an\n                                owner reference to the pod once the pod exists. Normally\n                                this should not be necessary, but it may be useful when\n                                manually reconstructing a broken cluster.\n\n\n                                This field is read-only and no changes will be made by Kubernetes\n                                to the PVC after it has been created.\n\n\n                                Required, must not be nil.\n                              properties:\n                                metadata:\n                                  description: |-\n                                    May contain labels and annotations that will be copied into the PVC\n                                    when creating it. No other fields are allowed and will be rejected during\n                                    validation.\n                                  properties:\n                                    annotations:\n                                      additionalProperties:\n                                        type: string\n                                      type: object\n                                    finalizers:\n                                      items:\n                                        type: string\n                                      type: array\n                                    labels:\n                                      additionalProperties:\n                                        type: string\n                                      type: object\n                                    name:\n                                      type: string\n                                    namespace:\n                                      type: string\n                                  type: object\n                                spec:\n                                  description: |-\n                                    The specification for the PersistentVolumeClaim. The entire content is\n                                    copied unchanged into the PVC that gets created from this\n                                    template. The same fields as in a PersistentVolumeClaim\n                                    are also valid here.\n                                  properties:\n                                    accessModes:\n                                      description: |-\n                                        accessModes contains the desired access modes the volume should have.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                      items:\n                                        type: string\n                                      type: array\n                                    dataSource:\n                                      description: |-\n                                        dataSource field can be used to specify either:\n                                        * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                        * An existing PVC (PersistentVolumeClaim)\n                                        If the provisioner or an external controller can support the specified data source,\n                                        it will create a new volume based on the contents of the specified data source.\n                                        When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                        and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                        If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                      properties:\n                                        apiGroup:\n                                          description: |-\n                                            APIGroup is the group for the resource being referenced.\n                                            If APIGroup is not specified, the specified Kind must be in the core API group.\n                                            For any other third-party types, APIGroup is required.\n                                          type: string\n                                        kind:\n                                          description: Kind is the type of resource\n                                            being referenced\n                                          type: string\n                                        name:\n                                          description: Name is the name of resource\n                                            being referenced\n                                          type: string\n                                      required:\n                                      - kind\n                                      - name\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    dataSourceRef:\n                                      description: |-\n                                        dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                        volume is desired. This may be any object from a non-empty API group (non\n                                        core object) or a PersistentVolumeClaim object.\n                                        When this field is specified, volume binding will only succeed if the type of\n                                        the specified object matches some installed volume populator or dynamic\n                                        provisioner.\n                                        This field will replace the functionality of the dataSource field and as such\n                                        if both fields are non-empty, they must have the same value. For backwards\n                                        compatibility, when namespace isn't specified in dataSourceRef,\n                                        both fields (dataSource and dataSourceRef) will be set to the same\n                                        value automatically if one of them is empty and the other is non-empty.\n                                        When namespace is specified in dataSourceRef,\n                                        dataSource isn't set to the same value and must be empty.\n                                        There are three important differences between dataSource and dataSourceRef:\n                                        * While dataSource only allows two specific types of objects, dataSourceRef\n                                          allows any non-core object, as well as PersistentVolumeClaim objects.\n                                        * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                          preserves all values, and generates an error if a disallowed value is\n                                          specified.\n                                        * While dataSource only allows local objects, dataSourceRef allows objects\n                                          in any namespaces.\n                                        (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                        (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                      properties:\n                                        apiGroup:\n                                          description: |-\n                                            APIGroup is the group for the resource being referenced.\n                                            If APIGroup is not specified, the specified Kind must be in the core API group.\n                                            For any other third-party types, APIGroup is required.\n                                          type: string\n                                        kind:\n                                          description: Kind is the type of resource\n                                            being referenced\n                                          type: string\n                                        name:\n                                          description: Name is the name of resource\n                                            being referenced\n                                          type: string\n                                        namespace:\n                                          description: |-\n                                            Namespace is the namespace of resource being referenced\n                                            Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                            (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                          type: string\n                                      required:\n                                      - kind\n                                      - name\n                                      type: object\n                                    resources:\n                                      description: |-\n                                        resources represents the minimum resources the volume should have.\n                                        If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                        that are lower than previous value but must still be higher than capacity recorded in the\n                                        status field of the claim.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                      properties:\n                                        limits:\n                                          additionalProperties:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          description: |-\n                                            Limits describes the maximum amount of compute resources allowed.\n                                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                          type: object\n                                        requests:\n                                          additionalProperties:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          description: |-\n                                            Requests describes the minimum amount of compute resources required.\n                                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                          type: object\n                                      type: object\n                                    selector:\n                                      description: selector is a label query over\n                                        volumes to consider for binding.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    storageClassName:\n                                      description: |-\n                                        storageClassName is the name of the StorageClass required by the claim.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                      type: string\n                                    volumeAttributesClassName:\n                                      description: |-\n                                        volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                        If specified, the CSI driver will create or update the volume with the attributes defined\n                                        in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                        it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                        will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                        If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                        will be set by the persistentvolume controller if it exists.\n                                        If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                        set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                        exists.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                        (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                      type: string\n                                    volumeMode:\n                                      description: |-\n                                        volumeMode defines what type of volume is required by the claim.\n                                        Value of Filesystem is implied when not included in claim spec.\n                                      type: string\n                                    volumeName:\n                                      description: volumeName is the binding reference\n                                        to the PersistentVolume backing this claim.\n                                      type: string\n                                  type: object\n                              required:\n                              - spec\n                              type: object\n                          type: object\n                        fc:\n                          description: fc represents a Fibre Channel resource that\n                            is attached to a kubelet's host machine and then exposed\n                            to the pod.\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            lun:\n                              description: 'lun is Optional: FC target lun number'\n                              format: int32\n                              type: integer\n                            readOnly:\n                              description: |-\n                                readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            targetWWNs:\n                              description: 'targetWWNs is Optional: FC target worldwide\n                                names (WWNs)'\n                              items:\n                                type: string\n                              type: array\n                            wwids:\n                              description: |-\n                                wwids Optional: FC volume world wide identifiers (wwids)\n                                Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                              items:\n                                type: string\n                              type: array\n                          type: object\n                        flexVolume:\n                          description: |-\n                            flexVolume represents a generic volume resource that is\n                            provisioned/attached using an exec based plugin.\n                          properties:\n                            driver:\n                              description: driver is the name of the driver to use\n                                for this volume.\n                              type: string\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                              type: string\n                            options:\n                              additionalProperties:\n                                type: string\n                              description: 'options is Optional: this field holds\n                                extra command options if any.'\n                              type: object\n                            readOnly:\n                              description: |-\n                                readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef is Optional: secretRef is reference to the secret object containing\n                                sensitive information to pass to the plugin scripts. This may be\n                                empty if no secret object is specified. If the secret object\n                                contains more than one secret, all secrets are passed to the plugin\n                                scripts.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                          required:\n                          - driver\n                          type: object\n                        flocker:\n                          description: flocker represents a Flocker volume attached\n                            to a kubelet's host machine. This depends on the Flocker\n                            control service being running\n                          properties:\n                            datasetName:\n                              description: |-\n                                datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                should be considered as deprecated\n                              type: string\n                            datasetUUID:\n                              description: datasetUUID is the UUID of the dataset.\n                                This is unique identifier of a Flocker dataset\n                              type: string\n                          type: object\n                        gcePersistentDisk:\n                          description: |-\n                            gcePersistentDisk represents a GCE Disk resource that is attached to a\n                            kubelet's host machine and then exposed to the pod.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is filesystem type of the volume that you want to mount.\n                                Tip: Ensure that the filesystem type is supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            partition:\n                              description: |-\n                                partition is the partition in the volume that you want to mount.\n                                If omitted, the default is to mount by volume name.\n                                Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                              format: int32\n                              type: integer\n                            pdName:\n                              description: |-\n                                pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the ReadOnly setting in VolumeMounts.\n                                Defaults to false.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                              type: boolean\n                          required:\n                          - pdName\n                          type: object\n                        gitRepo:\n                          description: |-\n                            gitRepo represents a git repository at a particular revision.\n                            DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                            EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                            into the Pod's container.\n                          properties:\n                            directory:\n                              description: |-\n                                directory is the target directory name.\n                                Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                the subdirectory with the given name.\n                              type: string\n                            repository:\n                              description: repository is the URL\n                              type: string\n                            revision:\n                              description: revision is the commit hash for the specified\n                                revision.\n                              type: string\n                          required:\n                          - repository\n                          type: object\n                        glusterfs:\n                          description: |-\n                            glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                            More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                          properties:\n                            endpoints:\n                              description: |-\n                                endpoints is the endpoint name that details Glusterfs topology.\n                                More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                              type: string\n                            path:\n                              description: |-\n                                path is the Glusterfs volume path.\n                                More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                Defaults to false.\n                                More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                              type: boolean\n                          required:\n                          - endpoints\n                          - path\n                          type: object\n                        hostPath:\n                          description: |-\n                            hostPath represents a pre-existing file or directory on the host\n                            machine that is directly exposed to the container. This is generally\n                            used for system agents or other privileged things that are allowed\n                            to see the host machine. Most containers will NOT need this.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                            ---\n                            TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                            mount host directories as read/write.\n                          properties:\n                            path:\n                              description: |-\n                                path of the directory on the host.\n                                If the path is a symlink, it will follow the link to the real path.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                              type: string\n                            type:\n                              description: |-\n                                type for HostPath Volume\n                                Defaults to \"\"\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                              type: string\n                          required:\n                          - path\n                          type: object\n                        iscsi:\n                          description: |-\n                            iscsi represents an ISCSI Disk resource that is attached to a\n                            kubelet's host machine and then exposed to the pod.\n                            More info: https://examples.k8s.io/volumes/iscsi/README.md\n                          properties:\n                            chapAuthDiscovery:\n                              description: chapAuthDiscovery defines whether support\n                                iSCSI Discovery CHAP authentication\n                              type: boolean\n                            chapAuthSession:\n                              description: chapAuthSession defines whether support\n                                iSCSI Session CHAP authentication\n                              type: boolean\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type of the volume that you want to mount.\n                                Tip: Ensure that the filesystem type is supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            initiatorName:\n                              description: |-\n                                initiatorName is the custom iSCSI Initiator Name.\n                                If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                <target portal>:<volume name> will be created for the connection.\n                              type: string\n                            iqn:\n                              description: iqn is the target iSCSI Qualified Name.\n                              type: string\n                            iscsiInterface:\n                              description: |-\n                                iscsiInterface is the interface Name that uses an iSCSI transport.\n                                Defaults to 'default' (tcp).\n                              type: string\n                            lun:\n                              description: lun represents iSCSI Target Lun number.\n                              format: int32\n                              type: integer\n                            portals:\n                              description: |-\n                                portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                is other than default (typically TCP ports 860 and 3260).\n                              items:\n                                type: string\n                              type: array\n                            readOnly:\n                              description: |-\n                                readOnly here will force the ReadOnly setting in VolumeMounts.\n                                Defaults to false.\n                              type: boolean\n                            secretRef:\n                              description: secretRef is the CHAP Secret for iSCSI\n                                target and initiator authentication\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            targetPortal:\n                              description: |-\n                                targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                is other than default (typically TCP ports 860 and 3260).\n                              type: string\n                          required:\n                          - iqn\n                          - lun\n                          - targetPortal\n                          type: object\n                        name:\n                          description: |-\n                            name of the volume.\n                            Must be a DNS_LABEL and unique within the pod.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                          type: string\n                        nfs:\n                          description: |-\n                            nfs represents an NFS mount on the host that shares a pod's lifetime\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                          properties:\n                            path:\n                              description: |-\n                                path that is exported by the NFS server.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the NFS export to be mounted with read-only permissions.\n                                Defaults to false.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                              type: boolean\n                            server:\n                              description: |-\n                                server is the hostname or IP address of the NFS server.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                              type: string\n                          required:\n                          - path\n                          - server\n                          type: object\n                        persistentVolumeClaim:\n                          description: |-\n                            persistentVolumeClaimVolumeSource represents a reference to a\n                            PersistentVolumeClaim in the same namespace.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                          properties:\n                            claimName:\n                              description: |-\n                                claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly Will force the ReadOnly setting in VolumeMounts.\n                                Default false.\n                              type: boolean\n                          required:\n                          - claimName\n                          type: object\n                        photonPersistentDisk:\n                          description: photonPersistentDisk represents a PhotonController\n                            persistent disk attached and mounted on kubelets host\n                            machine\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            pdID:\n                              description: pdID is the ID that identifies Photon Controller\n                                persistent disk\n                              type: string\n                          required:\n                          - pdID\n                          type: object\n                        portworxVolume:\n                          description: portworxVolume represents a portworx volume\n                            attached and mounted on kubelets host machine\n                          properties:\n                            fsType:\n                              description: |-\n                                fSType represents the filesystem type to mount\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            volumeID:\n                              description: volumeID uniquely identifies a Portworx\n                                volume\n                              type: string\n                          required:\n                          - volumeID\n                          type: object\n                        projected:\n                          description: projected items for all in one resources secrets,\n                            configmaps, and downward API\n                          properties:\n                            defaultMode:\n                              description: |-\n                                defaultMode are the mode bits used to set permissions on created files by default.\n                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                Directories within the path are not affected by this setting.\n                                This might be in conflict with other options that affect the file\n                                mode, like fsGroup, and the result can be other mode bits set.\n                              format: int32\n                              type: integer\n                            sources:\n                              description: sources is the list of volume projections\n                              items:\n                                description: Projection that may be projected along\n                                  with other supported volume types\n                                properties:\n                                  clusterTrustBundle:\n                                    description: |-\n                                      ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                      of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                      Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                      ClusterTrustBundle objects can either be selected by name, or by the\n                                      combination of signer name and a label selector.\n\n\n                                      Kubelet performs aggressive normalization of the PEM contents written\n                                      into the pod filesystem.  Esoteric PEM features such as inter-block\n                                      comments and block headers are stripped.  Certificates are deduplicated.\n                                      The ordering of certificates within the file is arbitrary, and Kubelet\n                                      may change the order over time.\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          Select all ClusterTrustBundles that match this label selector.  Only has\n                                          effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                          interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                          everything\".\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      name:\n                                        description: |-\n                                          Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                          with signerName and labelSelector.\n                                        type: string\n                                      optional:\n                                        description: |-\n                                          If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                          aren't available.  If using name, then the named ClusterTrustBundle is\n                                          allowed not to exist.  If using signerName, then the combination of\n                                          signerName and labelSelector is allowed to match zero\n                                          ClusterTrustBundles.\n                                        type: boolean\n                                      path:\n                                        description: Relative path from the volume\n                                          root to write the bundle.\n                                        type: string\n                                      signerName:\n                                        description: |-\n                                          Select all ClusterTrustBundles that match this signer name.\n                                          Mutually-exclusive with name.  The contents of all selected\n                                          ClusterTrustBundles will be unified and deduplicated.\n                                        type: string\n                                    required:\n                                    - path\n                                    type: object\n                                  configMap:\n                                    description: configMap information about the configMap\n                                      data to project\n                                    properties:\n                                      items:\n                                        description: |-\n                                          items if unspecified, each key-value pair in the Data field of the referenced\n                                          ConfigMap will be projected into the volume as a file whose name is the\n                                          key and content is the value. If specified, the listed keys will be\n                                          projected into the specified paths, and unlisted keys will not be\n                                          present. If a key is specified which is not present in the ConfigMap,\n                                          the volume setup will error unless it is marked optional. Paths must be\n                                          relative and may not contain the '..' path or start with '..'.\n                                        items:\n                                          description: Maps a string key to a path\n                                            within a volume.\n                                          properties:\n                                            key:\n                                              description: key is the key to project.\n                                              type: string\n                                            mode:\n                                              description: |-\n                                                mode is Optional: mode bits used to set permissions on this file.\n                                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the relative path of the file to map the key to.\n                                                May not be an absolute path.\n                                                May not contain the path element '..'.\n                                                May not start with the string '..'.\n                                              type: string\n                                          required:\n                                          - key\n                                          - path\n                                          type: object\n                                        type: array\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: optional specify whether the\n                                          ConfigMap or its keys must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  downwardAPI:\n                                    description: downwardAPI information about the\n                                      downwardAPI data to project\n                                    properties:\n                                      items:\n                                        description: Items is a list of DownwardAPIVolume\n                                          file\n                                        items:\n                                          description: DownwardAPIVolumeFile represents\n                                            information to create the file containing\n                                            the pod field\n                                          properties:\n                                            fieldRef:\n                                              description: 'Required: Selects a field\n                                                of the pod: only annotations, labels,\n                                                name and namespace are supported.'\n                                              properties:\n                                                apiVersion:\n                                                  description: Version of the schema\n                                                    the FieldPath is written in terms\n                                                    of, defaults to \"v1\".\n                                                  type: string\n                                                fieldPath:\n                                                  description: Path of the field to\n                                                    select in the specified API version.\n                                                  type: string\n                                              required:\n                                              - fieldPath\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            mode:\n                                              description: |-\n                                                Optional: mode bits used to set permissions on this file, must be an octal value\n                                                between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: 'Required: Path is  the\n                                                relative path name of the file to\n                                                be created. Must not be absolute or\n                                                contain the ''..'' path. Must be utf-8\n                                                encoded. The first item of the relative\n                                                path must not start with ''..'''\n                                              type: string\n                                            resourceFieldRef:\n                                              description: |-\n                                                Selects a resource of the container: only resources limits and requests\n                                                (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                              properties:\n                                                containerName:\n                                                  description: 'Container name: required\n                                                    for volumes, optional for env\n                                                    vars'\n                                                  type: string\n                                                divisor:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  description: Specifies the output\n                                                    format of the exposed resources,\n                                                    defaults to \"1\"\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                resource:\n                                                  description: 'Required: resource\n                                                    to select'\n                                                  type: string\n                                              required:\n                                              - resource\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                          required:\n                                          - path\n                                          type: object\n                                        type: array\n                                    type: object\n                                  secret:\n                                    description: secret information about the secret\n                                      data to project\n                                    properties:\n                                      items:\n                                        description: |-\n                                          items if unspecified, each key-value pair in the Data field of the referenced\n                                          Secret will be projected into the volume as a file whose name is the\n                                          key and content is the value. If specified, the listed keys will be\n                                          projected into the specified paths, and unlisted keys will not be\n                                          present. If a key is specified which is not present in the Secret,\n                                          the volume setup will error unless it is marked optional. Paths must be\n                                          relative and may not contain the '..' path or start with '..'.\n                                        items:\n                                          description: Maps a string key to a path\n                                            within a volume.\n                                          properties:\n                                            key:\n                                              description: key is the key to project.\n                                              type: string\n                                            mode:\n                                              description: |-\n                                                mode is Optional: mode bits used to set permissions on this file.\n                                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the relative path of the file to map the key to.\n                                                May not be an absolute path.\n                                                May not contain the path element '..'.\n                                                May not start with the string '..'.\n                                              type: string\n                                          required:\n                                          - key\n                                          - path\n                                          type: object\n                                        type: array\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: optional field specify whether\n                                          the Secret or its key must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  serviceAccountToken:\n                                    description: serviceAccountToken is information\n                                      about the serviceAccountToken data to project\n                                    properties:\n                                      audience:\n                                        description: |-\n                                          audience is the intended audience of the token. A recipient of a token\n                                          must identify itself with an identifier specified in the audience of the\n                                          token, and otherwise should reject the token. The audience defaults to the\n                                          identifier of the apiserver.\n                                        type: string\n                                      expirationSeconds:\n                                        description: |-\n                                          expirationSeconds is the requested duration of validity of the service\n                                          account token. As the token approaches expiration, the kubelet volume\n                                          plugin will proactively rotate the service account token. The kubelet will\n                                          start trying to rotate the token if the token is older than 80 percent of\n                                          its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                          and must be at least 10 minutes.\n                                        format: int64\n                                        type: integer\n                                      path:\n                                        description: |-\n                                          path is the path relative to the mount point of the file to project the\n                                          token into.\n                                        type: string\n                                    required:\n                                    - path\n                                    type: object\n                                type: object\n                              type: array\n                          type: object\n                        quobyte:\n                          description: quobyte represents a Quobyte mount on the host\n                            that shares a pod's lifetime\n                          properties:\n                            group:\n                              description: |-\n                                group to map volume access to\n                                Default is no group\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                Defaults to false.\n                              type: boolean\n                            registry:\n                              description: |-\n                                registry represents a single or multiple Quobyte Registry services\n                                specified as a string as host:port pair (multiple entries are separated with commas)\n                                which acts as the central registry for volumes\n                              type: string\n                            tenant:\n                              description: |-\n                                tenant owning the given Quobyte volume in the Backend\n                                Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                              type: string\n                            user:\n                              description: |-\n                                user to map volume access to\n                                Defaults to serivceaccount user\n                              type: string\n                            volume:\n                              description: volume is a string that references an already\n                                created Quobyte volume by name.\n                              type: string\n                          required:\n                          - registry\n                          - volume\n                          type: object\n                        rbd:\n                          description: |-\n                            rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type of the volume that you want to mount.\n                                Tip: Ensure that the filesystem type is supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            image:\n                              description: |-\n                                image is the rados image name.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: string\n                            keyring:\n                              description: |-\n                                keyring is the path to key ring for RBDUser.\n                                Default is /etc/ceph/keyring.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: string\n                            monitors:\n                              description: |-\n                                monitors is a collection of Ceph monitors.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              items:\n                                type: string\n                              type: array\n                            pool:\n                              description: |-\n                                pool is the rados pool name.\n                                Default is rbd.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the ReadOnly setting in VolumeMounts.\n                                Defaults to false.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef is name of the authentication secret for RBDUser. If provided\n                                overrides keyring.\n                                Default is nil.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            user:\n                              description: |-\n                                user is the rados user name.\n                                Default is admin.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: string\n                          required:\n                          - image\n                          - monitors\n                          type: object\n                        scaleIO:\n                          description: scaleIO represents a ScaleIO persistent volume\n                            attached and mounted on Kubernetes nodes.\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                Default is \"xfs\".\n                              type: string\n                            gateway:\n                              description: gateway is the host address of the ScaleIO\n                                API Gateway.\n                              type: string\n                            protectionDomain:\n                              description: protectionDomain is the name of the ScaleIO\n                                Protection Domain for the configured storage.\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly Defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef references to the secret for ScaleIO user and other\n                                sensitive information. If this is not provided, Login operation will fail.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            sslEnabled:\n                              description: sslEnabled Flag enable/disable SSL communication\n                                with Gateway, default false\n                              type: boolean\n                            storageMode:\n                              description: |-\n                                storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                Default is ThinProvisioned.\n                              type: string\n                            storagePool:\n                              description: storagePool is the ScaleIO Storage Pool\n                                associated with the protection domain.\n                              type: string\n                            system:\n                              description: system is the name of the storage system\n                                as configured in ScaleIO.\n                              type: string\n                            volumeName:\n                              description: |-\n                                volumeName is the name of a volume already created in the ScaleIO system\n                                that is associated with this volume source.\n                              type: string\n                          required:\n                          - gateway\n                          - secretRef\n                          - system\n                          type: object\n                        secret:\n                          description: |-\n                            secret represents a secret that should populate this volume.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                          properties:\n                            defaultMode:\n                              description: |-\n                                defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                YAML accepts both octal and decimal values, JSON requires decimal values\n                                for mode bits. Defaults to 0644.\n                                Directories within the path are not affected by this setting.\n                                This might be in conflict with other options that affect the file\n                                mode, like fsGroup, and the result can be other mode bits set.\n                              format: int32\n                              type: integer\n                            items:\n                              description: |-\n                                items If unspecified, each key-value pair in the Data field of the referenced\n                                Secret will be projected into the volume as a file whose name is the\n                                key and content is the value. If specified, the listed keys will be\n                                projected into the specified paths, and unlisted keys will not be\n                                present. If a key is specified which is not present in the Secret,\n                                the volume setup will error unless it is marked optional. Paths must be\n                                relative and may not contain the '..' path or start with '..'.\n                              items:\n                                description: Maps a string key to a path within a\n                                  volume.\n                                properties:\n                                  key:\n                                    description: key is the key to project.\n                                    type: string\n                                  mode:\n                                    description: |-\n                                      mode is Optional: mode bits used to set permissions on this file.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      If not specified, the volume defaultMode will be used.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  path:\n                                    description: |-\n                                      path is the relative path of the file to map the key to.\n                                      May not be an absolute path.\n                                      May not contain the path element '..'.\n                                      May not start with the string '..'.\n                                    type: string\n                                required:\n                                - key\n                                - path\n                                type: object\n                              type: array\n                            optional:\n                              description: optional field specify whether the Secret\n                                or its keys must be defined\n                              type: boolean\n                            secretName:\n                              description: |-\n                                secretName is the name of the secret in the pod's namespace to use.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                              type: string\n                          type: object\n                        storageos:\n                          description: storageOS represents a StorageOS volume attached\n                            and mounted on Kubernetes nodes.\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef specifies the secret to use for obtaining the StorageOS API\n                                credentials.  If not specified, default values will be attempted.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            volumeName:\n                              description: |-\n                                volumeName is the human-readable name of the StorageOS volume.  Volume\n                                names are only unique within a namespace.\n                              type: string\n                            volumeNamespace:\n                              description: |-\n                                volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                namespace is specified then the Pod's namespace will be used.  This allows the\n                                Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                Set VolumeName to any name to override the default behaviour.\n                                Set to \"default\" if you are not using namespaces within StorageOS.\n                                Namespaces that do not pre-exist within StorageOS will be created.\n                              type: string\n                          type: object\n                        vsphereVolume:\n                          description: vsphereVolume represents a vSphere volume attached\n                            and mounted on kubelets host machine\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            storagePolicyID:\n                              description: storagePolicyID is the storage Policy Based\n                                Management (SPBM) profile ID associated with the StoragePolicyName.\n                              type: string\n                            storagePolicyName:\n                              description: storagePolicyName is the storage Policy\n                                Based Management (SPBM) profile name.\n                              type: string\n                            volumePath:\n                              description: volumePath is the path that identifies\n                                vSphere volume vmdk\n                              type: string\n                          required:\n                          - volumePath\n                          type: object\n                      required:\n                      - name\n                      type: object\n                    type: array\n                required:\n                - containers\n                type: object\n                x-kubernetes-preserve-unknown-fields: true\n              scripts:\n                description: |-\n                  Specifies groups of scripts, each provided via a ConfigMap, to be mounted as volumes in the container.\n                  These scripts can be executed during container startup or via specific actions.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    defaultMode:\n                      description: |-\n                        The operator attempts to set default file permissions (0444).\n\n\n                        Must be specified as an octal value between 0000 and 0777 (inclusive),\n                        or as a decimal value between 0 and 511 (inclusive).\n                        YAML supports both octal and decimal values for file permissions.\n\n\n                        Please note that this setting only affects the permissions of the files themselves.\n                        Directories within the specified path are not impacted by this setting.\n                        It's important to be aware that this setting might conflict with other options\n                        that influence the file mode, such as fsGroup.\n                        In such cases, the resulting file mode may have additional bits set.\n                        Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                      format: int32\n                      type: integer\n                    externalManaged:\n                      description: |-\n                        ExternalManaged indicates whether the configuration is managed by an external system.\n                        When set to true, the controller will ignore the management of this configuration.\n                      type: boolean\n                    name:\n                      description: Specifies the name of the template.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    namespace:\n                      default: default\n                      description: Specifies the namespace of the referenced template\n                        ConfigMap object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    restartOnFileChange:\n                      description: Specifies whether to restart the pod when the file\n                        changes.\n                      type: boolean\n                    template:\n                      description: Specifies the name of the referenced template ConfigMap\n                        object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    volumeName:\n                      description: |-\n                        Refers to the volume name of PodTemplate. The file produced through the template will be mounted to\n                        the corresponding volume. Must be a DNS_LABEL name.\n                        The volume name must be defined in podSpec.containers[*].volumeMounts.\n                      maxLength: 63\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n              serviceKind:\n                description: |-\n                  Defines the type of well-known service protocol that the Component provides.\n                  It specifies the standard or widely recognized protocol used by the Component to offer its Services.\n\n\n                  The `serviceKind` field allows users to quickly identify the type of Service provided by the Component\n                  based on common protocols or service types. This information helps in understanding the compatibility,\n                  interoperability, and usage of the Component within a system.\n\n\n                  Some examples of well-known service protocols include:\n\n\n                  - \"MySQL\": Indicates that the Component provides a MySQL database service.\n                  - \"PostgreSQL\": Indicates that the Component offers a PostgreSQL database service.\n                  - \"Redis\": Signifies that the Component functions as a Redis key-value store.\n                  - \"ETCD\": Denotes that the Component serves as an ETCD distributed key-value store.\n\n\n                  The `serviceKind` value is case-insensitive, allowing for flexibility in specifying the protocol name.\n\n\n                  When specifying the `serviceKind`, consider the following guidelines:\n\n\n                  - Use well-established and widely recognized protocol names or service types.\n                  - Ensure that the `serviceKind` accurately represents the primary service type offered by the Component.\n                  - If the Component provides multiple services, choose the most prominent or commonly used protocol.\n                  - Limit the `serviceKind` to a maximum of 32 characters for conciseness and readability.\n\n\n                  Note: The `serviceKind` field is optional and can be left empty if the Component does not fit into a well-known\n                  service category or if the protocol is not widely recognized. It is primarily used to convey information about\n                  the Component's service type to users and facilitate discovery and integration.\n\n\n                  The `serviceKind` field is immutable and cannot be updated.\n                maxLength: 32\n                type: string\n              serviceRefDeclarations:\n                description: |-\n                  Lists external service dependencies of the Component, including services from other Clusters or outside the K8s environment.\n\n\n                  This field is immutable.\n                items:\n                  description: |-\n                    ServiceRefDeclaration represents a reference to a service that can be either provided by a KubeBlocks Cluster\n                    or an external service.\n                    It acts as a placeholder for the actual service reference, which is determined later when a Cluster is created.\n\n\n                    The purpose of ServiceRefDeclaration is to declare a service dependency without specifying the concrete details\n                    of the service.\n                    It allows for flexibility and abstraction in defining service references within a Component.\n                    By using ServiceRefDeclaration, you can define service dependencies in a declarative manner, enabling loose coupling\n                    and easier management of service references across different components and clusters.\n\n\n                    Upon Cluster creation, the ServiceRefDeclaration is bound to an actual service through the ServiceRef field,\n                    effectively resolving and connecting to the specified service.\n                  properties:\n                    name:\n                      description: Specifies the name of the ServiceRefDeclaration.\n                      type: string\n                    optional:\n                      description: |-\n                        Specifies whether the service reference can be optional.\n\n\n                        For an optional service-ref, the component can still be created even if the service-ref is not provided.\n                      type: boolean\n                    serviceRefDeclarationSpecs:\n                      description: |-\n                        Defines a list of constraints and requirements for services that can be bound to this ServiceRefDeclaration\n                        upon Cluster creation.\n                        Each ServiceRefDeclarationSpec defines a ServiceKind and ServiceVersion,\n                        outlining the acceptable service types and versions that are compatible.\n\n\n                        This flexibility allows a ServiceRefDeclaration to be fulfilled by any one of the provided specs.\n                        For example, if it requires an OLTP database, specs for both MySQL and PostgreSQL are listed,\n                        either MySQL or PostgreSQL services can be used when binding.\n                      items:\n                        properties:\n                          serviceKind:\n                            description: |-\n                              Specifies the type or nature of the service. This should be a well-known application cluster type, such as\n                              {mysql, redis, mongodb}.\n                              The field is case-insensitive and supports abbreviations for some well-known databases.\n                              For instance, both `zk` and `zookeeper` are considered as a ZooKeeper cluster, while `pg`, `postgres`, `postgresql`\n                              are all recognized as a PostgreSQL cluster.\n                            type: string\n                          serviceVersion:\n                            description: |-\n                              Defines the service version of the service reference. This is a regular expression that matches a version number pattern.\n                              For instance, `^8.0.8$`, `8.0.\\d{1,2}$`, `^[v\\-]*?(\\d{1,2}\\.){0,3}\\d{1,2}$` are all valid patterns.\n                            type: string\n                        required:\n                        - serviceKind\n                        - serviceVersion\n                        type: object\n                      type: array\n                  required:\n                  - name\n                  - serviceRefDeclarationSpecs\n                  type: object\n                type: array\n              serviceVersion:\n                description: |-\n                  Specifies the version of the Service provided by the Component.\n                  It follows the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n\n\n                  The Semantic Versioning specification defines a version number format of X.Y.Z (MAJOR.MINOR.PATCH), where:\n\n\n                  - X represents the major version and indicates incompatible API changes.\n                  - Y represents the minor version and indicates added functionality in a backward-compatible manner.\n                  - Z represents the patch version and indicates backward-compatible bug fixes.\n\n\n                  Additional labels for pre-release and build metadata are available as extensions to the X.Y.Z format:\n\n\n                  - Use pre-release labels (e.g., -alpha, -beta) for versions that are not yet stable or ready for production use.\n                  - Use build metadata (e.g., +build.1) for additional version information if needed.\n\n\n                  Examples of valid ServiceVersion values:\n\n\n                  - \"1.0.0\"\n                  - \"2.3.1\"\n                  - \"3.0.0-alpha.1\"\n                  - \"4.5.2+build.1\"\n\n\n                  The `serviceVersion` field is immutable and cannot be updated.\n                maxLength: 32\n                type: string\n              services:\n                description: |-\n                  Defines additional Services to expose the Component's endpoints.\n\n\n                  A default headless Service, named `{cluster.name}-{component.name}-headless`, is automatically created\n                  for internal Cluster communication.\n\n\n                  This field enables customization of additional Services to expose the Component's endpoints to\n                  other Components within the same or different Clusters, and to external applications.\n                  Each Service entry in this list can include properties such as ports, type, and selectors.\n\n\n                  - For intra-Cluster access, Components can reference Services using variables declared in\n                    `componentDefinition.spec.vars[*].valueFrom.serviceVarRef`.\n                  - For inter-Cluster access, reference Services use variables declared in\n                    `componentDefinition.spec.vars[*].valueFrom.serviceRefVarRef`,\n                    and bind Services at Cluster creation time with `clusterComponentSpec.ServiceRef[*].clusterServiceSelector`.\n\n\n                  This field is immutable.\n                items:\n                  description: |-\n                    ComponentService defines a service that would be exposed as an inter-component service within a Cluster.\n                    A Service defined in the ComponentService is expected to be accessed by other Components within the same Cluster.\n\n\n                    When a Component needs to use a ComponentService provided by another Component within the same Cluster,\n                    it can declare a variable in the `componentDefinition.spec.vars` section and bind it to the specific exposed address\n                    of the ComponentService using the `serviceVarRef` field.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        If ServiceType is LoadBalancer, cloud provider related parameters can be put here\n                        More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                      type: object\n                    disableAutoProvision:\n                      description: |-\n                        Indicates whether the automatic provisioning of the service should be disabled.\n\n\n                        If set to true, the service will not be automatically created at the component provisioning.\n                        Instead, you can enable the creation of this service by specifying it explicitly in the cluster API.\n                      type: boolean\n                    name:\n                      description: |-\n                        Name defines the name of the service.\n                        otherwise, it indicates the name of the service.\n                        Others can refer to this service by its name. (e.g., connection credential)\n                        Cannot be updated.\n                      maxLength: 25\n                      type: string\n                    podService:\n                      default: false\n                      description: |-\n                        Indicates whether to create a corresponding Service for each Pod of the selected Component.\n                        When set to true, a set of Services will be automatically generated for each Pod,\n                        and the `roleSelector` field will be ignored.\n\n\n                        The names of the generated Services will follow the same suffix naming pattern: `$(serviceName)-$(podOrdinal)`.\n                        The total number of generated Services will be equal to the number of replicas specified for the Component.\n\n\n                        Example usage:\n\n\n                        ```yaml\n                        name: my-service\n                        serviceName: my-service\n                        podService: true\n                        disableAutoProvision: true\n                        spec:\n                          type: NodePort\n                          ports:\n                          - name: http\n                            port: 80\n                            targetPort: 8080\n                        ```\n\n\n                        In this example, if the Component has 3 replicas, three Services will be generated:\n                        - my-service-0: Points to the first Pod (podOrdinal: 0)\n                        - my-service-1: Points to the second Pod (podOrdinal: 1)\n                        - my-service-2: Points to the third Pod (podOrdinal: 2)\n\n\n                        Each generated Service will have the specified spec configuration and will target its respective Pod.\n\n\n                        This feature is useful when you need to expose each Pod of a Component individually, allowing external access\n                        to specific instances of the Component.\n                      type: boolean\n                    roleSelector:\n                      description: \"Extends the above `serviceSpec.selector` by allowing\n                        you to specify defined role as selector for the service.\\nWhen\n                        `roleSelector` is set, it adds a label selector \\\"kubeblocks.io/role:\n                        {roleSelector}\\\"\\nto the `serviceSpec.selector`.\\nExample\n                        usage:\\n\\n\\n\\t  roleSelector: \\\"leader\\\"\\n\\n\\nIn this example,\n                        setting `roleSelector` to \\\"leader\\\" will add a label selector\\n\\\"kubeblocks.io/role:\n                        leader\\\" to the `serviceSpec.selector`.\\nThis means that the\n                        service will select and route traffic to Pods with the label\\n\\\"kubeblocks.io/role\\\"\n                        set to \\\"leader\\\".\\n\\n\\nNote that if `podService` sets to\n                        true, RoleSelector will be ignored.\\nThe `podService` flag\n                        takes precedence over `roleSelector` and generates a service\n                        for each Pod.\"\n                      type: string\n                    serviceName:\n                      description: |-\n                        ServiceName defines the name of the underlying service object.\n                        If not specified, the default service name with different patterns will be used:\n\n\n                        - CLUSTER_NAME: for cluster-level services\n                        - CLUSTER_NAME-COMPONENT_NAME: for component-level services\n\n\n                        Only one default service name is allowed.\n                        Cannot be updated.\n                      maxLength: 25\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    spec:\n                      description: |-\n                        Spec defines the behavior of a service.\n                        https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                      properties:\n                        allocateLoadBalancerNodePorts:\n                          description: |-\n                            allocateLoadBalancerNodePorts defines if NodePorts will be automatically\n                            allocated for services with type LoadBalancer.  Default is \"true\". It\n                            may be set to \"false\" if the cluster load-balancer does not rely on\n                            NodePorts.  If the caller requests specific NodePorts (by specifying a\n                            value), those requests will be respected, regardless of this field.\n                            This field may only be set for services with type LoadBalancer and will\n                            be cleared if the type is changed to any other type.\n                          type: boolean\n                        clusterIP:\n                          description: |-\n                            clusterIP is the IP address of the service and is usually assigned\n                            randomly. If an address is specified manually, is in-range (as per\n                            system configuration), and is not in use, it will be allocated to the\n                            service; otherwise creation of the service will fail. This field may not\n                            be changed through updates unless the type field is also being changed\n                            to ExternalName (which requires this field to be blank) or the type\n                            field is being changed from ExternalName (in which case this field may\n                            optionally be specified, as describe above).  Valid values are \"None\",\n                            empty string (\"\"), or a valid IP address. Setting this to \"None\" makes a\n                            \"headless service\" (no virtual IP), which is useful when direct endpoint\n                            connections are preferred and proxying is not required.  Only applies to\n                            types ClusterIP, NodePort, and LoadBalancer. If this field is specified\n                            when creating a Service of type ExternalName, creation will fail. This\n                            field will be wiped when updating a Service to type ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        clusterIPs:\n                          description: |-\n                            ClusterIPs is a list of IP addresses assigned to this service, and are\n                            usually assigned randomly.  If an address is specified manually, is\n                            in-range (as per system configuration), and is not in use, it will be\n                            allocated to the service; otherwise creation of the service will fail.\n                            This field may not be changed through updates unless the type field is\n                            also being changed to ExternalName (which requires this field to be\n                            empty) or the type field is being changed from ExternalName (in which\n                            case this field may optionally be specified, as describe above).  Valid\n                            values are \"None\", empty string (\"\"), or a valid IP address.  Setting\n                            this to \"None\" makes a \"headless service\" (no virtual IP), which is\n                            useful when direct endpoint connections are preferred and proxying is\n                            not required.  Only applies to types ClusterIP, NodePort, and\n                            LoadBalancer. If this field is specified when creating a Service of type\n                            ExternalName, creation will fail. This field will be wiped when updating\n                            a Service to type ExternalName.  If this field is not specified, it will\n                            be initialized from the clusterIP field.  If this field is specified,\n                            clients must ensure that clusterIPs[0] and clusterIP have the same\n                            value.\n\n\n                            This field may hold a maximum of two entries (dual-stack IPs, in either order).\n                            These IPs must correspond to the values of the ipFamilies field. Both\n                            clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        externalIPs:\n                          description: |-\n                            externalIPs is a list of IP addresses for which nodes in the cluster\n                            will also accept traffic for this service.  These IPs are not managed by\n                            Kubernetes.  The user is responsible for ensuring that traffic arrives\n                            at a node with this IP.  A common example is external load-balancers\n                            that are not part of the Kubernetes system.\n                          items:\n                            type: string\n                          type: array\n                        externalName:\n                          description: |-\n                            externalName is the external reference that discovery mechanisms will\n                            return as an alias for this service (e.g. a DNS CNAME record). No\n                            proxying will be involved.  Must be a lowercase RFC-1123 hostname\n                            (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".\n                          type: string\n                        externalTrafficPolicy:\n                          description: |-\n                            externalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on one of the Service's \"externally-facing\" addresses (NodePorts,\n                            ExternalIPs, and LoadBalancer IPs). If set to \"Local\", the proxy will configure\n                            the service in a way that assumes that external load balancers will take care\n                            of balancing the service traffic between nodes, and so each node will deliver\n                            traffic only to the node-local endpoints of the service, without masquerading\n                            the client source IP. (Traffic mistakenly sent to a node with no endpoints will\n                            be dropped.) The default value, \"Cluster\", uses the standard behavior of\n                            routing to all endpoints evenly (possibly modified by topology and other\n                            features). Note that traffic sent to an External IP or LoadBalancer IP from\n                            within the cluster will always get \"Cluster\" semantics, but clients sending to\n                            a NodePort from within the cluster may need to take traffic policy into account\n                            when picking a node.\n                          type: string\n                        healthCheckNodePort:\n                          description: |-\n                            healthCheckNodePort specifies the healthcheck nodePort for the service.\n                            This only applies when type is set to LoadBalancer and\n                            externalTrafficPolicy is set to Local. If a value is specified, is\n                            in-range, and is not in use, it will be used.  If not specified, a value\n                            will be automatically allocated.  External systems (e.g. load-balancers)\n                            can use this port to determine if a given node holds endpoints for this\n                            service or not.  If this field is specified when creating a Service\n                            which does not need it, creation will fail. This field will be wiped\n                            when updating a Service to no longer need it (e.g. changing type).\n                            This field cannot be updated once set.\n                          format: int32\n                          type: integer\n                        internalTrafficPolicy:\n                          description: |-\n                            InternalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on the ClusterIP. If set to \"Local\", the proxy will assume that pods\n                            only want to talk to endpoints of the service on the same node as the pod,\n                            dropping the traffic if there are no local endpoints. The default value,\n                            \"Cluster\", uses the standard behavior of routing to all endpoints evenly\n                            (possibly modified by topology and other features).\n                          type: string\n                        ipFamilies:\n                          description: |-\n                            IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this\n                            service. This field is usually assigned automatically based on cluster\n                            configuration and the ipFamilyPolicy field. If this field is specified\n                            manually, the requested family is available in the cluster,\n                            and ipFamilyPolicy allows it, it will be used; otherwise creation of\n                            the service will fail. This field is conditionally mutable: it allows\n                            for adding or removing a secondary IP family, but it does not allow\n                            changing the primary IP family of the Service. Valid values are \"IPv4\"\n                            and \"IPv6\".  This field only applies to Services of types ClusterIP,\n                            NodePort, and LoadBalancer, and does apply to \"headless\" services.\n                            This field will be wiped when updating a Service to type ExternalName.\n\n\n                            This field may hold a maximum of two entries (dual-stack families, in\n                            either order).  These families must correspond to the values of the\n                            clusterIPs field, if specified. Both clusterIPs and ipFamilies are\n                            governed by the ipFamilyPolicy field.\n                          items:\n                            description: |-\n                              IPFamily represents the IP Family (IPv4 or IPv6). This type is used\n                              to express the family of an IP expressed by a type (e.g. service.spec.ipFamilies).\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        ipFamilyPolicy:\n                          description: |-\n                            IPFamilyPolicy represents the dual-stack-ness requested or required by\n                            this Service. If there is no value provided, then this field will be set\n                            to SingleStack. Services can be \"SingleStack\" (a single IP family),\n                            \"PreferDualStack\" (two IP families on dual-stack configured clusters or\n                            a single IP family on single-stack clusters), or \"RequireDualStack\"\n                            (two IP families on dual-stack configured clusters, otherwise fail). The\n                            ipFamilies and clusterIPs fields depend on the value of this field. This\n                            field will be wiped when updating a service to type ExternalName.\n                          type: string\n                        loadBalancerClass:\n                          description: |-\n                            loadBalancerClass is the class of the load balancer implementation this Service belongs to.\n                            If specified, the value of this field must be a label-style identifier, with an optional prefix,\n                            e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users.\n                            This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load\n                            balancer implementation is used, today this is typically done through the cloud provider integration,\n                            but should apply for any default implementation. If set, it is assumed that a load balancer\n                            implementation is watching for Services with a matching class. Any default load balancer\n                            implementation (e.g. cloud providers) should ignore Services that set this field.\n                            This field can only be set when creating or updating a Service to type 'LoadBalancer'.\n                            Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.\n                          type: string\n                        loadBalancerIP:\n                          description: |-\n                            Only applies to Service Type: LoadBalancer.\n                            This feature depends on whether the underlying cloud-provider supports specifying\n                            the loadBalancerIP when a load balancer is created.\n                            This field will be ignored if the cloud-provider does not support the feature.\n                            Deprecated: This field was under-specified and its meaning varies across implementations.\n                            Using it is non-portable and it may not support dual-stack.\n                            Users are encouraged to use implementation-specific annotations when available.\n                          type: string\n                        loadBalancerSourceRanges:\n                          description: |-\n                            If specified and supported by the platform, this will restrict traffic through the cloud-provider\n                            load-balancer will be restricted to the specified client IPs. This field will be ignored if the\n                            cloud-provider does not support the feature.\"\n                            More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/\n                          items:\n                            type: string\n                          type: array\n                        ports:\n                          description: |-\n                            The list of ports that are exposed by this service.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            description: ServicePort contains information on service's\n                              port.\n                            properties:\n                              appProtocol:\n                                description: |-\n                                  The application protocol for this port.\n                                  This is used as a hint for implementations to offer richer behavior for protocols that they understand.\n                                  This field follows standard Kubernetes label syntax.\n                                  Valid values are either:\n\n\n                                  * Un-prefixed protocol names - reserved for IANA standard service names (as per\n                                  RFC-6335 and https://www.iana.org/assignments/service-names).\n\n\n                                  * Kubernetes-defined prefixed names:\n                                    * 'kubernetes.io/h2c' - HTTP/2 prior knowledge over cleartext as described in https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior-\n                                    * 'kubernetes.io/ws'  - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n                                    * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n\n                                  * Other protocols should use implementation-defined prefixed names such as\n                                  mycompany.com/my-custom-protocol.\n                                type: string\n                              name:\n                                description: |-\n                                  The name of this port within the service. This must be a DNS_LABEL.\n                                  All ports within a ServiceSpec must have unique names. When considering\n                                  the endpoints for a Service, this must match the 'name' field in the\n                                  EndpointPort.\n                                  Optional if only one ServicePort is defined on this service.\n                                type: string\n                              nodePort:\n                                description: |-\n                                  The port on each node on which this service is exposed when type is\n                                  NodePort or LoadBalancer.  Usually assigned by the system. If a value is\n                                  specified, in-range, and not in use it will be used, otherwise the\n                                  operation will fail.  If not specified, a port will be allocated if this\n                                  Service requires one.  If this field is specified when creating a\n                                  Service which does not need it, creation will fail. This field will be\n                                  wiped when updating a Service to no longer need it (e.g. changing type\n                                  from NodePort to ClusterIP).\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n                                format: int32\n                                type: integer\n                              port:\n                                description: The port that will be exposed by this\n                                  service.\n                                format: int32\n                                type: integer\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\".\n                                  Default is TCP.\n                                type: string\n                              targetPort:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Number or name of the port to access on the pods targeted by the service.\n                                  Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.\n                                  If this is a string, it will be looked up as a named port in the\n                                  target Pod's container ports. If this is not specified, the value\n                                  of the 'port' field is used (an identity map).\n                                  This field is ignored for services with clusterIP=None, and should be\n                                  omitted or set equal to the 'port' field.\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service\n                                x-kubernetes-int-or-string: true\n                            required:\n                            - port\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - port\n                          - protocol\n                          x-kubernetes-list-type: map\n                        publishNotReadyAddresses:\n                          description: |-\n                            publishNotReadyAddresses indicates that any agent which deals with endpoints for this\n                            Service should disregard any indications of ready/not-ready.\n                            The primary use case for setting this field is for a StatefulSet's Headless Service to\n                            propagate SRV DNS records for its Pods for the purpose of peer discovery.\n                            The Kubernetes controllers that generate Endpoints and EndpointSlice resources for\n                            Services interpret this to mean that all endpoints are considered \"ready\" even if the\n                            Pods themselves are not. Agents which consume only Kubernetes generated endpoints\n                            through the Endpoints or EndpointSlice resources can safely assume this behavior.\n                          type: boolean\n                        selector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            Route service traffic to pods with label keys and values matching this\n                            selector. If empty or not present, the service is assumed to have an\n                            external process managing its endpoints, which Kubernetes will not\n                            modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.\n                            Ignored if type is ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        sessionAffinity:\n                          description: |-\n                            Supports \"ClientIP\" and \"None\". Used to maintain session affinity.\n                            Enable client IP based session affinity.\n                            Must be ClientIP or None.\n                            Defaults to None.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        sessionAffinityConfig:\n                          description: sessionAffinityConfig contains the configurations\n                            of session affinity.\n                          properties:\n                            clientIP:\n                              description: clientIP contains the configurations of\n                                Client IP based session affinity.\n                              properties:\n                                timeoutSeconds:\n                                  description: |-\n                                    timeoutSeconds specifies the seconds of ClientIP type session sticky time.\n                                    The value must be >0 && <=86400(for 1 day) if ServiceAffinity == \"ClientIP\".\n                                    Default value is 10800(for 3 hours).\n                                  format: int32\n                                  type: integer\n                              type: object\n                          type: object\n                        type:\n                          description: |-\n                            type determines how the Service is exposed. Defaults to ClusterIP. Valid\n                            options are ExternalName, ClusterIP, NodePort, and LoadBalancer.\n                            \"ClusterIP\" allocates a cluster-internal IP address for load-balancing\n                            to endpoints. Endpoints are determined by the selector or if that is not\n                            specified, by manual construction of an Endpoints object or\n                            EndpointSlice objects. If clusterIP is \"None\", no virtual IP is\n                            allocated and the endpoints are published as a set of endpoints rather\n                            than a virtual IP.\n                            \"NodePort\" builds on ClusterIP and allocates a port on every node which\n                            routes to the same endpoints as the clusterIP.\n                            \"LoadBalancer\" builds on NodePort and creates an external load-balancer\n                            (if supported in the current cloud) which routes to the same endpoints\n                            as the clusterIP.\n                            \"ExternalName\" aliases this service to the specified externalName.\n                            Several other fields do not apply to ExternalName services.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types\n                          type: string\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              systemAccounts:\n                description: |-\n                  An array of `SystemAccount` objects that define the system accounts needed\n                  for the management operations of the Component.\n\n\n                  Each `SystemAccount` includes:\n\n\n                  - Account name.\n                  - The SQL statement template: Used to create the system account.\n                  - Password Source: Either generated based on certain rules or retrieved from a Secret.\n\n\n                   Use cases for system accounts typically involve tasks like system initialization, backups, monitoring,\n                   health checks, replication, and other system-level operations.\n\n\n                  System accounts are distinct from user accounts, although both are database accounts.\n\n\n                  - **System Accounts**: Created during Cluster setup by the KubeBlocks operator,\n                    these accounts have higher privileges for system management and are fully managed\n                    through a declarative API by the operator.\n                  - **User Accounts**: Managed by users or administrator.\n                    User account permissions should follow the principle of least privilege,\n                    granting only the necessary access rights to complete their required tasks.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    initAccount:\n                      default: false\n                      description: |-\n                        Indicates if this account is a system initialization account (e.g., MySQL root).\n\n\n                        This field is immutable once set.\n                      type: boolean\n                    name:\n                      description: |-\n                        Specifies the unique identifier for the account. This name is used by other entities to reference the account.\n\n\n                        This field is immutable once set.\n                      type: string\n                    passwordGenerationPolicy:\n                      description: |-\n                        Specifies the policy for generating the account's password.\n\n\n                        This field is immutable once set.\n                      properties:\n                        length:\n                          default: 16\n                          description: The length of the password.\n                          format: int32\n                          maximum: 32\n                          minimum: 8\n                          type: integer\n                        letterCase:\n                          default: MixedCases\n                          description: The case of the letters in the password.\n                          enum:\n                          - LowerCases\n                          - UpperCases\n                          - MixedCases\n                          type: string\n                        numDigits:\n                          default: 4\n                          description: The number of digits in the password.\n                          format: int32\n                          maximum: 8\n                          minimum: 0\n                          type: integer\n                        numSymbols:\n                          default: 0\n                          description: The number of symbols in the password.\n                          format: int32\n                          maximum: 8\n                          minimum: 0\n                          type: integer\n                        seed:\n                          description: |-\n                            Seed to generate the account's password.\n                            Cannot be updated.\n                          type: string\n                        symbolCharacters:\n                          description: |-\n                            The set of symbols allowed when generating password. If empty, kubeblocks will\n                            use a default symbol set, which is \"!@#&*\".\n                          type: string\n                      type: object\n                    statement:\n                      description: |-\n                        Defines the statements used to create, delete, and update the account.\n\n\n                        This field is immutable once set.\n                      properties:\n                        create:\n                          description: |-\n                            The statement to create a new account with the necessary privileges.\n\n\n                            This field is immutable once set.\n                          type: string\n                        delete:\n                          description: |-\n                            The statement to delete a account.\n\n\n                            This field is immutable once set.\n                          type: string\n                        update:\n                          description: |-\n                            The statement to update an existing account.\n\n\n                            This field is immutable once set.\n                          type: string\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              tls:\n                description: |-\n                  Specifies the TLS configuration for the Component.\n\n\n                  This field is immutable.\n                properties:\n                  caFile:\n                    description: |-\n                      The CA file of the TLS.\n\n\n                      This field is immutable once set.\n                    type: string\n                  certFile:\n                    description: |-\n                      The certificate file of the TLS.\n\n\n                      This field is immutable once set.\n                    type: string\n                  defaultMode:\n                    description: |-\n                      The permissions for the mounted path. Defaults to 0600.\n\n\n                      This field is immutable once set.\n                    format: int32\n                    type: integer\n                  keyFile:\n                    description: |-\n                      The key file of the TLS.\n\n\n                      This field is immutable once set.\n                    type: string\n                  mountPath:\n                    description: |-\n                      Specifies the mount path for the TLS secret to be mounted.\n                      Similar to the volume, the controller will mount the created volume to the specified path within containers when the TLS is enabled.\n\n\n                      This field is immutable once set.\n                    type: string\n                  volumeName:\n                    description: |-\n                      Specifies the volume name for the TLS secret.\n                      The controller will create a volume object with the specified name and add it to the pod when the TLS is enabled.\n\n\n                      This field is immutable once set.\n                    type: string\n                required:\n                - mountPath\n                - volumeName\n                type: object\n              updateStrategy:\n                default: Serial\n                description: \"Specifies the concurrency strategy for updating multiple\n                  instances of the Component.\\nAvailable strategies:\\n\\n\\n- `Serial`:\n                  Updates replicas one at a time, ensuring minimal downtime by waiting\n                  for each replica to become ready\\n  before updating the next.\\n-\n                  `Parallel`: Updates all replicas simultaneously, optimizing for\n                  speed but potentially reducing availability\\n  during the update.\\n-\n                  `BestEffortParallel`: Updates replicas concurrently with a limit\n                  on simultaneous updates to ensure a minimum\\n  number of operational\n                  replicas for maintaining quorum.\\n\\t For example, in a 5-replica\n                  component, updating a maximum of 2 replicas simultaneously keeps\\n\\t\n                  at least 3 operational for quorum.\\n\\n\\nThis field is immutable\n                  and defaults to 'Serial'.\"\n                enum:\n                - Serial\n                - BestEffortParallel\n                - Parallel\n                type: string\n              vars:\n                description: |-\n                  Defines variables which are determined after Cluster instantiation and reflect\n                  dynamic or runtime attributes of instantiated Clusters.\n                  These variables serve as placeholders for setting environment variables in Pods and Actions,\n                  or for rendering configuration and script templates before actual values are finalized.\n\n\n                  These variables are placed in front of the environment variables declared in the Pod if used as\n                  environment variables.\n\n\n                  Variable values can be sourced from:\n\n\n                  - ConfigMap: Select and extract a value from a specific key within a ConfigMap.\n                  - Secret: Select and extract a value from a specific key within a Secret.\n                  - HostNetwork: Retrieves values (including ports) from host-network resources.\n                  - Service: Retrieves values (including address, port, NodePort) from a selected Service.\n                    Intended to obtain the address of a ComponentService within the same Cluster.\n                  - Credential: Retrieves account name and password from a SystemAccount variable.\n                  - ServiceRef: Retrieves address, port, account name and password from a selected ServiceRefDeclaration.\n                    Designed to obtain the address bound to a ServiceRef, such as a ClusterService or\n                    ComponentService of another cluster or an external service.\n                  - Component: Retrieves values from a selected Component, including replicas and instance name list.\n\n\n                  This field is immutable.\n                items:\n                  description: EnvVar represents a variable present in the env of\n                    Pod/Action or the template of config/script.\n                  properties:\n                    expression:\n                      description: |-\n                        A Go template expression that will be applied to the resolved value of the var.\n\n\n                        The expression will only be evaluated if the var is successfully resolved to a non-credential value.\n\n\n                        The resolved value can be accessed by its name within the expression, system vars and other user-defined\n                        non-credential vars can be used within the expression in the same way.\n                        Notice that, when accessing vars by its name, you should replace all the \"-\" in the name with \"_\", because of\n                        that \"-\" is not a valid identifier in Go.\n\n\n                        All expressions are evaluated in the order the vars are defined. If a var depends on any vars that also\n                        have expressions defined, be careful about the evaluation order as it may use intermediate values.\n\n\n                        The result of evaluation will be used as the final value of the var. If the expression fails to evaluate,\n                        the resolving of var will also be considered failed.\n                      type: string\n                    name:\n                      description: Name of the variable. Must be a C_IDENTIFIER.\n                      type: string\n                    value:\n                      description: |-\n                        Variable references `$(VAR_NAME)` are expanded using the previously defined variables in the current context.\n\n\n                        If a variable cannot be resolved, the reference in the input string will be unchanged.\n                        Double `$$` are reduced to a single `$`, which allows for escaping the `$(VAR_NAME)` syntax: i.e.\n\n\n                        - `$$(VAR_NAME)` will produce the string literal `$(VAR_NAME)`.\n\n\n                        Escaped references will never be expanded, regardless of whether the variable exists or not.\n                        Defaults to \"\".\n                      type: string\n                    valueFrom:\n                      description: Source for the variable's value. Cannot be used\n                        if value is not empty.\n                      properties:\n                        clusterVarRef:\n                          description: Selects a defined var of a Cluster.\n                          properties:\n                            clusterName:\n                              description: Reference to the name of the Cluster object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            clusterUID:\n                              description: Reference to the UID of the Cluster object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            namespace:\n                              description: Reference to the namespace of the Cluster\n                                object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        componentVarRef:\n                          description: Selects a defined var of a Component.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            componentName:\n                              description: Reference to the name of the Component\n                                object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            podFQDNs:\n                              description: |-\n                                Reference to the pod FQDN list of the component.\n                                The value will be presented in the following format: FQDN1,FQDN2,...\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            podFQDNsForRole:\n                              description: |-\n                                Reference to the pod FQDN list of the component that have a specific role.\n                                The value will be presented in the following format: FQDN1,FQDN2,...\n                              properties:\n                                option:\n                                  description: VarOption defines whether a variable\n                                    is required or optional.\n                                  enum:\n                                  - Required\n                                  - Optional\n                                  type: string\n                                role:\n                                  type: string\n                              type: object\n                            podNames:\n                              description: |-\n                                Reference to the pod name list of the component.\n                                and the value will be presented in the following format: name1,name2,...\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            podNamesForRole:\n                              description: |-\n                                Reference to the pod name list of the component that have a specific role.\n                                The value will be presented in the following format: name1,name2,...\n                              properties:\n                                option:\n                                  description: VarOption defines whether a variable\n                                    is required or optional.\n                                  enum:\n                                  - Required\n                                  - Optional\n                                  type: string\n                                role:\n                                  type: string\n                              type: object\n                            replicas:\n                              description: Reference to the replicas of the component.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            shortName:\n                              description: Reference to the short name of the Component\n                                object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        configMapKeyRef:\n                          description: Selects a key of a ConfigMap.\n                          properties:\n                            key:\n                              description: The key to select.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the ConfigMap or its key\n                                must be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        credentialVarRef:\n                          description: Selects a defined var of a Credential (SystemAccount).\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            password:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            username:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        hostNetworkVarRef:\n                          description: Selects a defined var of host-network resources.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            container:\n                              description: ContainerVars defines the vars that can\n                                be referenced from a Container.\n                              properties:\n                                name:\n                                  description: The name of the container.\n                                  type: string\n                                port:\n                                  description: Container port to reference.\n                                  properties:\n                                    name:\n                                      type: string\n                                    option:\n                                      description: VarOption defines whether a variable\n                                        is required or optional.\n                                      enum:\n                                      - Required\n                                      - Optional\n                                      type: string\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                          type: object\n                        resourceVarRef:\n                          description: Selects a defined var of a kind of resource.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            cpu:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            cpuLimit:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            memory:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            memoryLimit:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            storage:\n                              properties:\n                                name:\n                                  type: string\n                                option:\n                                  description: VarOption defines whether a variable\n                                    is required or optional.\n                                  enum:\n                                  - Required\n                                  - Optional\n                                  type: string\n                              type: object\n                          type: object\n                        secretKeyRef:\n                          description: Selects a key of a Secret.\n                          properties:\n                            key:\n                              description: The key of the secret to select from.  Must\n                                be a valid secret key.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the Secret or its key must\n                                be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        serviceRefVarRef:\n                          description: Selects a defined var of a ServiceRef.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            endpoint:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            host:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            password:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            podFQDNs:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            port:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            username:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        serviceVarRef:\n                          description: Selects a defined var of a Service.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            host:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            loadBalancer:\n                              description: |-\n                                LoadBalancer represents the LoadBalancer ingress point of the service.\n\n\n                                If multiple ingress points are available, the first one will be used automatically, choosing between IP and Hostname.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            port:\n                              description: |-\n                                Port references a port or node-port defined in the service.\n\n\n                                If the referenced service is a pod-service, there will be multiple service objects matched,\n                                and the value will be presented in the following format: service1.name:port1,service2.name:port2...\n                              properties:\n                                name:\n                                  type: string\n                                option:\n                                  description: VarOption defines whether a variable\n                                    is required or optional.\n                                  enum:\n                                  - Required\n                                  - Optional\n                                  type: string\n                              type: object\n                            serviceType:\n                              description: ServiceType references the type of the\n                                service.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        tlsVarRef:\n                          description: Selects a defined var of the TLS.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            enabled:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                          type: object\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              volumes:\n                description: |-\n                  Defines the volumes used by the Component and some static attributes of the volumes.\n                  After defining the volumes here, user can reference them in the\n                  `cluster.spec.componentSpecs[*].volumeClaimTemplates` field to configure dynamic properties such as\n                  volume capacity and storage class.\n\n\n                  This field allows you to specify the following:\n\n\n                  - Snapshot behavior: Determines whether a snapshot of the volume should be taken when performing\n                    a snapshot backup of the Component.\n                  - Disk high watermark: Sets the high watermark for the volume's disk usage.\n                    When the disk usage reaches the specified threshold, it triggers an alert or action.\n\n\n                  By configuring these volume behaviors, you can control how the volumes are managed and monitored within the Component.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    highWatermark:\n                      default: 0\n                      description: |-\n                        Sets the critical threshold for volume space utilization as a percentage (0-100).\n\n\n                        Exceeding this percentage triggers the system to switch the volume to read-only mode as specified in\n                        `componentDefinition.spec.lifecycleActions.readOnly`.\n                        This precaution helps prevent space depletion while maintaining read-only access.\n                        If the space utilization later falls below this threshold, the system reverts the volume to read-write mode\n                        as defined in `componentDefinition.spec.lifecycleActions.readWrite`, restoring full functionality.\n\n\n                        Note: This field cannot be updated.\n                      maximum: 100\n                      minimum: 0\n                      type: integer\n                    name:\n                      description: |-\n                        Specifies the name of the volume.\n                        It must be a DNS_LABEL and unique within the pod.\n                        More info can be found at: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                        Note: This field cannot be updated.\n                      type: string\n                    needSnapshot:\n                      default: false\n                      description: |-\n                        Specifies whether the creation of a snapshot of this volume is necessary when performing a backup of the Component.\n\n\n                        Note: This field cannot be updated.\n                      type: boolean\n                  required:\n                  - name\n                  type: object\n                type: array\n            required:\n            - runtime\n            type: object\n          status:\n            description: ComponentDefinitionStatus defines the observed state of ComponentDefinition.\n            properties:\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: Refers to the most recent generation that has been observed\n                  for the ComponentDefinition.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Represents the current status of the ComponentDefinition. Valid values include ``, `Available`, and `Unavailable`.\n                  When the status is `Available`, the ComponentDefinition is ready and can be utilized by related objects.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n  - additionalPrinterColumns:\n    - description: service\n      jsonPath: .spec.serviceKind\n      name: SERVICE\n      type: string\n    - description: service version\n      jsonPath: .spec.serviceVersion\n      name: SERVICE-VERSION\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          ComponentDefinition serves as a reusable blueprint for creating Components,\n          encapsulating essential static settings such as Component description,\n          Pod templates, configuration file templates, scripts, parameter lists,\n          injected environment variables and their sources, and event handlers.\n          ComponentDefinition works in conjunction with dynamic settings from the ClusterComponentSpec,\n          to instantiate Components during Cluster creation.\n\n\n          Key aspects that can be defined in a ComponentDefinition include:\n\n\n          - PodSpec template: Specifies the PodSpec template used by the Component.\n          - Configuration templates: Specify the configuration file templates required by the Component.\n          - Scripts: Provide the necessary scripts for Component management and operations.\n          - Storage volumes: Specify the storage volumes and their configurations for the Component.\n          - Pod roles: Outlines various roles of Pods within the Component along with their capabilities.\n          - Exposed Kubernetes Services: Specify the Services that need to be exposed by the Component.\n          - System accounts: Define the system accounts required for the Component.\n          - Monitoring and logging: Configure the exporter and logging settings for the Component.\n\n\n          ComponentDefinitions also enable defining reactive behaviors of the Component in response to events,\n          such as member join/leave, Component addition/deletion, role changes, switch over, and more.\n          This allows for automatic event handling, thus encapsulating complex behaviors within the Component.\n\n\n          Referencing a ComponentDefinition when creating individual Components ensures inheritance of predefined configurations,\n          promoting reusability and consistency across different deployments and cluster topologies.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            properties:\n              annotations:\n                additionalProperties:\n                  type: string\n                description: |-\n                  Specifies static annotations that will be patched to all Kubernetes resources created for the Component.\n\n\n                  Note: If an annotation key in the `annotations` field conflicts with any system annotations\n                  or user-specified annotations, it will be silently ignored to avoid overriding higher-priority annotations.\n\n\n                  This field is immutable.\n                type: object\n              configs:\n                description: |-\n                  Specifies the configuration file templates and volume mount parameters used by the Component.\n                  It also includes descriptions of the parameters in the ConfigMaps, such as value range limitations.\n\n\n                  This field specifies a list of templates that will be rendered into Component containers' configuration files.\n                  Each template is represented as a ConfigMap and may contain multiple configuration files,\n                  with each file being a key in the ConfigMap.\n\n\n                  The rendered configuration files will be mounted into the Component's containers\n                   according to the specified volume mount parameters.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    asEnvFrom:\n                      description: |-\n                        Specifies the containers to inject the ConfigMap parameters as environment variables.\n\n\n                        This is useful when application images accept parameters through environment variables and\n                        generate the final configuration file in the startup script based on these variables.\n\n\n                        This field allows users to specify a list of container names, and KubeBlocks will inject the environment\n                        variables converted from the ConfigMap into these designated containers. This provides a flexible way to\n                        pass the configuration items from the ConfigMap to the container without modifying the image.\n\n\n                        Deprecated: `asEnvFrom` has been deprecated since 0.9.0 and will be removed in 0.10.0.\n                        Use `injectEnvTo` instead.\n                      items:\n                        type: string\n                      type: array\n                      x-kubernetes-list-type: set\n                    asSecret:\n                      description: Whether to store the final rendered parameters\n                        as a secret.\n                      type: boolean\n                    constraintRef:\n                      description: Specifies the name of the referenced configuration\n                        constraints object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    defaultMode:\n                      description: |-\n                        The operator attempts to set default file permissions for scripts (0555) and configurations (0444).\n                        However, certain database engines may require different file permissions.\n                        You can specify the desired file permissions here.\n\n\n                        Must be specified as an octal value between 0000 and 0777 (inclusive),\n                        or as a decimal value between 0 and 511 (inclusive).\n                        YAML supports both octal and decimal values for file permissions.\n\n\n                        Please note that this setting only affects the permissions of the files themselves.\n                        Directories within the specified path are not impacted by this setting.\n                        It's important to be aware that this setting might conflict with other options\n                        that influence the file mode, such as fsGroup.\n                        In such cases, the resulting file mode may have additional bits set.\n                        Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                      format: int32\n                      type: integer\n                    injectEnvTo:\n                      description: |-\n                        Specifies the containers to inject the ConfigMap parameters as environment variables.\n\n\n                        This is useful when application images accept parameters through environment variables and\n                        generate the final configuration file in the startup script based on these variables.\n\n\n                        This field allows users to specify a list of container names, and KubeBlocks will inject the environment\n                        variables converted from the ConfigMap into these designated containers. This provides a flexible way to\n                        pass the configuration items from the ConfigMap to the container without modifying the image.\n                      items:\n                        type: string\n                      type: array\n                      x-kubernetes-list-type: set\n                    keys:\n                      description: |-\n                        Specifies the configuration files within the ConfigMap that support dynamic updates.\n\n\n                        A configuration template (provided in the form of a ConfigMap) may contain templates for multiple\n                        configuration files.\n                        Each configuration file corresponds to a key in the ConfigMap.\n                        Some of these configuration files may support dynamic modification and reloading without requiring\n                        a pod restart.\n\n\n                        If empty or omitted, all configuration files in the ConfigMap are assumed to support dynamic updates,\n                        and ConfigConstraint applies to all keys.\n                      items:\n                        type: string\n                      type: array\n                      x-kubernetes-list-type: set\n                    legacyRenderedConfigSpec:\n                      description: |-\n                        Specifies the secondary rendered config spec for pod-specific customization.\n\n\n                        The template is rendered inside the pod (by the \"config-manager\" sidecar container) and merged with the main\n                        template's render result to generate the final configuration file.\n\n\n                        This field is intended to handle scenarios where different pods within the same Component have\n                        varying configurations. It allows for pod-specific customization of the configuration.\n\n\n                        Note: This field will be deprecated in future versions, and the functionality will be moved to\n                        `cluster.spec.componentSpecs[*].instances[*]`.\n                      properties:\n                        namespace:\n                          default: default\n                          description: |-\n                            Specifies the namespace of the referenced configuration template ConfigMap object.\n                            An empty namespace is equivalent to the \"default\" namespace.\n                          pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        policy:\n                          default: none\n                          description: Defines the strategy for merging externally\n                            imported templates into component templates.\n                          enum:\n                          - patch\n                          - replace\n                          - none\n                          type: string\n                        templateRef:\n                          description: Specifies the name of the referenced configuration\n                            template ConfigMap object.\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                      required:\n                      - templateRef\n                      type: object\n                    name:\n                      description: Specifies the name of the configuration template.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    namespace:\n                      default: default\n                      description: |-\n                        Specifies the namespace of the referenced configuration template ConfigMap object.\n                        An empty namespace is equivalent to the \"default\" namespace.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    reRenderResourceTypes:\n                      description: |-\n                        Specifies whether the configuration needs to be re-rendered after v-scale or h-scale operations to reflect changes.\n\n\n                        In some scenarios, the configuration may need to be updated to reflect the changes in resource allocation\n                        or cluster topology. Examples:\n\n\n                        - Redis: adjust maxmemory after v-scale operation.\n                        - MySQL: increase max connections after v-scale operation.\n                        - Zookeeper: update zoo.cfg with new node addresses after h-scale operation.\n                      items:\n                        description: RerenderResourceType defines the resource requirements\n                          for a component.\n                        enum:\n                        - vscale\n                        - hscale\n                        - tls\n                        - shardingHScale\n                        type: string\n                      type: array\n                      x-kubernetes-list-type: set\n                    templateRef:\n                      description: Specifies the name of the referenced configuration\n                        template ConfigMap object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    volumeName:\n                      description: |-\n                        Refers to the volume name of PodTemplate. The configuration file produced through the configuration\n                        template will be mounted to the corresponding volume. Must be a DNS_LABEL name.\n                        The volume name must be defined in podSpec.containers[*].volumeMounts.\n                      maxLength: 63\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              description:\n                description: |-\n                  Provides a brief and concise explanation of the Component's purpose, functionality, and any relevant details.\n                  It serves as a quick reference for users to understand the Component's role and characteristics.\n                maxLength: 256\n                type: string\n              exporter:\n                description: Defines the built-in metrics exporter container.\n                properties:\n                  containerName:\n                    description: Specifies the name of the built-in metrics exporter\n                      container.\n                    type: string\n                  scrapePath:\n                    description: |-\n                      Specifies the http/https url path to scrape for metrics.\n                      If empty, Prometheus uses the default value (e.g. `/metrics`).\n                    type: string\n                  scrapePort:\n                    description: Specifies the port name to scrape for metrics.\n                    type: string\n                  scrapeScheme:\n                    description: |-\n                      Specifies the schema to use for scraping.\n                      `http` and `https` are the expected values unless you rewrite the `__scheme__` label via relabeling.\n                      If empty, Prometheus uses the default value `http`.\n                    enum:\n                    - http\n                    - https\n                    type: string\n                type: object\n              hostNetwork:\n                description: |-\n                  Specifies the host network configuration for the Component.\n\n\n                  When `hostNetwork` option is enabled, the Pods share the host's network namespace and can directly access\n                  the host's network interfaces.\n                  This means that if multiple Pods need to use the same port, they cannot run on the same host simultaneously\n                  due to port conflicts.\n\n\n                  The DNSPolicy field in the Pod spec determines how containers within the Pod perform DNS resolution.\n                  When using hostNetwork, the operator will set the DNSPolicy to 'ClusterFirstWithHostNet'.\n                  With this policy, DNS queries will first go through the K8s cluster's DNS service.\n                  If the query fails, it will fall back to the host's DNS settings.\n\n\n                  If set, the DNS policy will be automatically set to \"ClusterFirstWithHostNet\".\n\n\n                  This field is immutable.\n                properties:\n                  containerPorts:\n                    description: The list of container ports that are required by\n                      the component.\n                    items:\n                      properties:\n                        container:\n                          description: Container specifies the target container within\n                            the Pod.\n                          type: string\n                        ports:\n                          description: |-\n                            Ports are named container ports within the specified container.\n                            These container ports must be defined in the container for proper port allocation.\n                          items:\n                            type: string\n                          minItems: 1\n                          type: array\n                      required:\n                      - container\n                      - ports\n                      type: object\n                    type: array\n                type: object\n              labels:\n                additionalProperties:\n                  type: string\n                description: |-\n                  Specifies static labels that will be patched to all Kubernetes resources created for the Component.\n\n\n                  Note: If a label key in the `labels` field conflicts with any system labels or user-specified labels,\n                  it will be silently ignored to avoid overriding higher-priority labels.\n\n\n                  This field is immutable.\n                type: object\n              lifecycleActions:\n                description: |-\n                  Defines a set of hooks and procedures that customize the behavior of a Component throughout its lifecycle.\n                  Actions are triggered at specific lifecycle stages:\n\n\n                    - `postProvision`: Defines the hook to be executed after the creation of a Component,\n                      with `preCondition` specifying when the action should be fired relative to the Component's lifecycle stages:\n                      `Immediately`, `RuntimeReady`, `ComponentReady`, and `ClusterReady`.\n                    - `preTerminate`: Defines the hook to be executed before terminating a Component.\n                    - `roleProbe`: Defines the procedure which is invoked regularly to assess the role of replicas.\n                    - `switchover`: Defines the procedure for a controlled transition of leadership from the current leader to a new replica.\n                      This approach aims to minimize downtime and maintain availability in systems with a leader-follower topology,\n                      such as before planned maintenance or upgrades on the current leader node.\n                    - `memberJoin`: Defines the procedure to add a new replica to the replication group.\n                    - `memberLeave`: Defines the method to remove a replica from the replication group.\n                    - `readOnly`: Defines the procedure to switch a replica into the read-only state.\n                    - `readWrite`: transition a replica from the read-only state back to the read-write state.\n                    - `dataDump`: Defines the procedure to export the data from a replica.\n                    - `dataLoad`: Defines the procedure to import data into a replica.\n                    - `reconfigure`: Defines the procedure that update a replica with new configuration file.\n                    - `accountProvision`: Defines the procedure to generate a new database account.\n\n\n                  This field is immutable.\n                properties:\n                  accountProvision:\n                    description: |-\n                      Defines the procedure to generate a new database account.\n\n\n                      Use Case:\n                      This action is designed to create system accounts that are utilized for replication, monitoring, backup,\n                      and other administrative tasks.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  dataDump:\n                    description: |-\n                      Defines the procedure for exporting the data from a replica.\n\n\n                      Use Case:\n                      This action is intended for initializing a newly created replica with data. It involves exporting data\n                      from an existing replica and importing it into the new, empty replica. This is essential for synchronizing\n                      the state of replicas across the system.\n\n\n                      Applicability:\n                      Some database engines or associated sidecar applications (e.g., Patroni) may already provide this functionality.\n                      In such cases, this action may not be required.\n\n\n                      The output should be a valid data dump streamed to stdout. It must exclude any irrelevant information to ensure\n                      that only the necessary data is exported for import into the new replica.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  dataLoad:\n                    description: |-\n                      Defines the procedure for importing data into a replica.\n\n\n                      Use Case:\n                      This action is intended for initializing a newly created replica with data. It involves exporting data\n                      from an existing replica and importing it into the new, empty replica. This is essential for synchronizing\n                      the state of replicas across the system.\n\n\n                      Some database engines or associated sidecar applications (e.g., Patroni) may already provide this functionality.\n                      In such cases, this action may not be required.\n\n\n                      Data should be received through stdin. If any error occurs during the process,\n                      the action must be able to guarantee idempotence to allow for retries from the beginning.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  memberJoin:\n                    description: |-\n                      Defines the procedure to add a new replica to the replication group.\n\n\n                      This action is initiated after a replica pod becomes ready.\n\n\n                      The role of the replica (e.g., primary, secondary) will be determined and assigned as part of the action command\n                      implementation, or automatically by the database kernel or a sidecar utility like Patroni that implements\n                      a consensus algorithm.\n\n\n                      The container executing this action has access to following environment variables:\n\n\n                      - KB_SERVICE_PORT: The port used by the database service.\n                      - KB_SERVICE_USER: The username with the necessary permissions to interact with the database service.\n                      - KB_SERVICE_PASSWORD: The corresponding password for KB_SERVICE_USER to authenticate with the database service.\n                      - KB_PRIMARY_POD_FQDN: The FQDN of the primary Pod within the replication group.\n                      - KB_MEMBER_ADDRESSES: A comma-separated list of Pod addresses for all replicas in the group.\n                      - KB_NEW_MEMBER_POD_NAME: The pod name of the replica being added to the group.\n                      - KB_NEW_MEMBER_POD_IP: The IP address of the replica being added to the group.\n\n\n                      Expected action output:\n                      - On Failure: An error message detailing the reason for any failure encountered\n                        during the addition of the new member.\n\n\n                      For example, to add a new OBServer to an OceanBase Cluster in 'zone1', the following command may be used:\n\n\n                      ```yaml\n                      command:\n                      - bash\n                      - -c\n                      - |\n                         ADDRESS=$(KB_MEMBER_ADDRESSES%%,*)\n                         HOST=$(echo $ADDRESS | cut -d ':' -f 1)\n                         PORT=$(echo $ADDRESS | cut -d ':' -f 2)\n                         CLIENT=\"mysql -u $KB_SERVICE_USER -p$KB_SERVICE_PASSWORD -P $PORT -h $HOST -e\"\n                             $CLIENT \"ALTER SYSTEM ADD SERVER '$KB_NEW_MEMBER_POD_IP:$KB_SERVICE_PORT' ZONE 'zone1'\"\n                      ```\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  memberLeave:\n                    description: |-\n                      Defines the procedure to remove a replica from the replication group.\n\n\n                      This action is initiated before remove a replica from the group.\n                      The operator will wait for MemberLeave to complete successfully before releasing the replica and cleaning up\n                      related Kubernetes resources.\n\n\n                      The process typically includes updating configurations and informing other group members about the removal.\n                      Data migration is generally not part of this action and should be handled separately if needed.\n\n\n                      The container executing this action has access to following environment variables:\n\n\n                      - KB_SERVICE_PORT: The port used by the database service.\n                      - KB_SERVICE_USER: The username with the necessary permissions to interact with the database service.\n                      - KB_SERVICE_PASSWORD: The corresponding password for KB_SERVICE_USER to authenticate with the database service.\n                      - KB_PRIMARY_POD_FQDN: The FQDN of the primary Pod within the replication group.\n                      - KB_MEMBER_ADDRESSES: A comma-separated list of Pod addresses for all replicas in the group.\n                      - KB_LEAVE_MEMBER_POD_NAME: The pod name of the replica being removed from the group.\n                      - KB_LEAVE_MEMBER_POD_IP: The IP address of the replica being removed from the group.\n\n\n                      Expected action output:\n                      - On Failure: An error message, if applicable, indicating why the action failed.\n\n\n                      For example, to remove an OBServer from an OceanBase Cluster in 'zone1', the following command can be executed:\n\n\n                      ```yaml\n                      command:\n                      - bash\n                      - -c\n                      - |\n                         ADDRESS=$(KB_MEMBER_ADDRESSES%%,*)\n                         HOST=$(echo $ADDRESS | cut -d ':' -f 1)\n                         PORT=$(echo $ADDRESS | cut -d ':' -f 2)\n                         CLIENT=\"mysql -u $KB_SERVICE_USER  -p$KB_SERVICE_PASSWORD -P $PORT -h $HOST -e\"\n                             $CLIENT \"ALTER SYSTEM DELETE SERVER '$KB_LEAVE_MEMBER_POD_IP:$KB_SERVICE_PORT' ZONE 'zone1'\"\n                      ```\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  postProvision:\n                    description: |-\n                      Specifies the hook to be executed after a component's creation.\n\n\n                      By setting `postProvision.customHandler.preCondition`, you can determine the specific lifecycle stage\n                      at which the action should trigger: `Immediately`, `RuntimeReady`, `ComponentReady`, and `ClusterReady`.\n                      with `ComponentReady` being the default.\n\n\n                      The PostProvision Action is intended to run only once.\n\n\n                      The container executing this action has access to following environment variables:\n\n\n                      - KB_CLUSTER_POD_IP_LIST: Comma-separated list of the cluster's pod IP addresses (e.g., \"podIp1,podIp2\").\n                      - KB_CLUSTER_POD_NAME_LIST: Comma-separated list of the cluster's pod names (e.g., \"pod1,pod2\").\n                      - KB_CLUSTER_POD_HOST_NAME_LIST: Comma-separated list of host names, each corresponding to a pod in\n                        KB_CLUSTER_POD_NAME_LIST (e.g., \"hostName1,hostName2\").\n                      - KB_CLUSTER_POD_HOST_IP_LIST: Comma-separated list of host IP addresses, each corresponding to a pod in\n                        KB_CLUSTER_POD_NAME_LIST (e.g., \"hostIp1,hostIp2\").\n\n\n                      - KB_CLUSTER_COMPONENT_POD_NAME_LIST: Comma-separated list of all pod names within the component\n                        (e.g., \"pod1,pod2\").\n                      - KB_CLUSTER_COMPONENT_POD_IP_LIST: Comma-separated list of pod IP addresses,\n                        matching the order of pods in KB_CLUSTER_COMPONENT_POD_NAME_LIST (e.g., \"podIp1,podIp2\").\n                      - KB_CLUSTER_COMPONENT_POD_HOST_NAME_LIST: Comma-separated list of host names for each pod,\n                        matching the order of pods in KB_CLUSTER_COMPONENT_POD_NAME_LIST (e.g., \"hostName1,hostName2\").\n                      - KB_CLUSTER_COMPONENT_POD_HOST_IP_LIST: Comma-separated list of host IP addresses for each pod,\n                        matching the order of pods in KB_CLUSTER_COMPONENT_POD_NAME_LIST (e.g., \"hostIp1,hostIp2\").\n\n\n                      - KB_CLUSTER_COMPONENT_LIST: Comma-separated list of all cluster components (e.g., \"comp1,comp2\").\n                      - KB_CLUSTER_COMPONENT_DELETING_LIST: Comma-separated list of components that are currently being deleted\n                        (e.g., \"comp1,comp2\").\n                      - KB_CLUSTER_COMPONENT_UNDELETED_LIST: Comma-separated list of components that are not being deleted\n                        (e.g., \"comp1,comp2\").\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  preTerminate:\n                    description: |-\n                      Specifies the hook to be executed prior to terminating a component.\n\n\n                      The PreTerminate Action is intended to run only once.\n\n\n                      This action is executed immediately when a scale-down operation for the Component is initiated.\n                      The actual termination and cleanup of the Component and its associated resources will not proceed\n                      until the PreTerminate action has completed successfully.\n\n\n                      The container executing this action has access to following environment variables:\n\n\n                      - KB_CLUSTER_POD_IP_LIST: Comma-separated list of the cluster's pod IP addresses (e.g., \"podIp1,podIp2\").\n                      - KB_CLUSTER_POD_NAME_LIST: Comma-separated list of the cluster's pod names (e.g., \"pod1,pod2\").\n                      - KB_CLUSTER_POD_HOST_NAME_LIST: Comma-separated list of host names, each corresponding to a pod in\n                        KB_CLUSTER_POD_NAME_LIST (e.g., \"hostName1,hostName2\").\n                      - KB_CLUSTER_POD_HOST_IP_LIST: Comma-separated list of host IP addresses, each corresponding to a pod in\n                        KB_CLUSTER_POD_NAME_LIST (e.g., \"hostIp1,hostIp2\").\n\n\n                      - KB_CLUSTER_COMPONENT_POD_NAME_LIST: Comma-separated list of all pod names within the component\n                        (e.g., \"pod1,pod2\").\n                      - KB_CLUSTER_COMPONENT_POD_IP_LIST: Comma-separated list of pod IP addresses,\n                        matching the order of pods in KB_CLUSTER_COMPONENT_POD_NAME_LIST (e.g., \"podIp1,podIp2\").\n                      - KB_CLUSTER_COMPONENT_POD_HOST_NAME_LIST: Comma-separated list of host names for each pod,\n                        matching the order of pods in KB_CLUSTER_COMPONENT_POD_NAME_LIST (e.g., \"hostName1,hostName2\").\n                      - KB_CLUSTER_COMPONENT_POD_HOST_IP_LIST: Comma-separated list of host IP addresses for each pod,\n                        matching the order of pods in KB_CLUSTER_COMPONENT_POD_NAME_LIST (e.g., \"hostIp1,hostIp2\").\n\n\n                      - KB_CLUSTER_COMPONENT_LIST: Comma-separated list of all cluster components (e.g., \"comp1,comp2\").\n                      - KB_CLUSTER_COMPONENT_DELETING_LIST: Comma-separated list of components that are currently being deleted\n                        (e.g., \"comp1,comp2\").\n                      - KB_CLUSTER_COMPONENT_UNDELETED_LIST: Comma-separated list of components that are not being deleted\n                        (e.g., \"comp1,comp2\").\n\n\n                      - KB_CLUSTER_COMPONENT_IS_SCALING_IN: Indicates whether the component is currently scaling in.\n                        If this variable is present and set to \"true\", it denotes that the component is undergoing a scale-in operation.\n                        During scale-in, data rebalancing is necessary to maintain cluster integrity.\n                        Contrast this with a cluster deletion scenario where data rebalancing is not required as the entire cluster\n                        is being cleaned up.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  readonly:\n                    description: |-\n                      Defines the procedure to switch a replica into the read-only state.\n\n\n                      Use Case:\n                      This action is invoked when the database's volume capacity nears its upper limit and space is about to be exhausted.\n\n\n                      The container executing this action has access to following environment variables:\n\n\n                      - KB_POD_FQDN: The FQDN of the replica pod whose role is being checked.\n                      - KB_SERVICE_PORT: The port used by the database service.\n                      - KB_SERVICE_USER: The username with the necessary permissions to interact with the database service.\n                      - KB_SERVICE_PASSWORD: The corresponding password for KB_SERVICE_USER to authenticate with the database service.\n\n\n                      Expected action output:\n                      - On Failure: An error message, if applicable, indicating why the action failed.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  readwrite:\n                    description: |-\n                      Defines the procedure to transition a replica from the read-only state back to the read-write state.\n\n\n                      Use Case:\n                      This action is used to bring back a replica that was previously in a read-only state,\n                      which restricted write operations, to its normal operational state where it can handle\n                      both read and write operations.\n\n\n                      The container executing this action has access to following environment variables:\n\n\n                      - KB_POD_FQDN: The FQDN of the replica pod whose role is being checked.\n                      - KB_SERVICE_PORT: The port used by the database service.\n                      - KB_SERVICE_USER: The username with the necessary permissions to interact with the database service.\n                      - KB_SERVICE_PASSWORD: The corresponding password for KB_SERVICE_USER to authenticate with the database service.\n\n\n                      Expected action output:\n                      - On Failure: An error message, if applicable, indicating why the action failed.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  reconfigure:\n                    description: |-\n                      Defines the procedure that update a replica with new configuration.\n\n\n                      Note: This field is immutable once it has been set.\n\n\n                      This Action is reserved for future versions.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                  roleProbe:\n                    description: |-\n                      Defines the procedure which is invoked regularly to assess the role of replicas.\n\n\n                      This action is periodically triggered by Lorry at the specified interval to determine the role of each replica.\n                      Upon successful execution, the action's output designates the role of the replica,\n                      which should match one of the predefined role names within `componentDefinition.spec.roles`.\n                      The output is then compared with the previous successful execution result.\n                      If a role change is detected, an event is generated to inform the controller,\n                      which initiates an update of the replica's role.\n\n\n                      Defining a RoleProbe Action for a Component is required if roles are defined for the Component.\n                      It ensures replicas are correctly labeled with their respective roles.\n                      Without this, services that rely on roleSelectors might improperly direct traffic to wrong replicas.\n\n\n                      The container executing this action has access to following environment variables:\n\n\n                      - KB_POD_FQDN: The FQDN of the Pod whose role is being assessed.\n                      - KB_SERVICE_PORT: The port used by the database service.\n                      - KB_SERVICE_USER: The username with the necessary permissions to interact with the database service.\n                      - KB_SERVICE_PASSWORD: The corresponding password for KB_SERVICE_USER to authenticate with the database service.\n\n\n                      Expected output of this action:\n                      - On Success: The determined role of the replica, which must align with one of the roles specified\n                        in the component definition.\n                      - On Failure: An error message, if applicable, indicating why the action failed.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      builtinHandler:\n                        description: |-\n                          Specifies the name of the predefined action handler to be invoked for lifecycle actions.\n\n\n                          Lorry, as a sidecar agent co-located with the database container in the same Pod,\n                          includes a suite of built-in action implementations that are tailored to different database engines.\n                          These are known as \"builtin\" handlers, includes: `mysql`, `redis`, `mongodb`, `etcd`,\n                          `postgresql`, `vanilla-postgresql`, `apecloud-postgresql`, `wesql`, `oceanbase`, `polardbx`.\n\n\n                          If the `builtinHandler` field is specified, it instructs Lorry to utilize its internal built-in action handler\n                          to execute the specified lifecycle actions.\n\n\n                          The `builtinHandler` field is of type `BuiltinActionHandlerType`,\n                          which represents the name of the built-in handler.\n                          The `builtinHandler` specified within the same `ComponentLifecycleActions` should be consistent across all\n                          actions.\n                          This means that if you specify a built-in handler for one action, you should use the same handler\n                          for all other actions throughout the entire `ComponentLifecycleActions` collection.\n\n\n                          If you need to define lifecycle actions for database engines not covered by the existing built-in support,\n                          or when the pre-existing built-in handlers do not meet your specific needs,\n                          you can use the `customHandler` field to define your own action implementation.\n\n\n                          Deprecation Notice:\n\n\n                          - In the future, the `builtinHandler` field will be deprecated in favor of using the `customHandler` field\n                            for configuring all lifecycle actions.\n                          - Instead of using a name to indicate the built-in action implementations in Lorry,\n                            the recommended approach will be to explicitly invoke the desired action implementation through\n                            a gRPC interface exposed by the sidecar agent.\n                          - Developers will have the flexibility to either use the built-in action implementations provided by Lorry\n                            or develop their own sidecar agent to implement custom actions and expose them via gRPC interfaces.\n                          - This change will allow for greater customization and extensibility of lifecycle actions,\n                            as developers can create their own \"builtin\" implementations tailored to their specific requirements.\n                        type: string\n                      customHandler:\n                        description: |-\n                          Specifies a user-defined hook or procedure that is called to perform the specific lifecycle action.\n                          It offers a flexible and expandable approach for customizing the behavior of a Component by leveraging\n                          tailored actions.\n\n\n                          An Action can be implemented as either an ExecAction or an HTTPAction, with future versions planning\n                          to support GRPCAction,\n                          thereby accommodating unique logic for different database systems within the Action's framework.\n\n\n                          In future iterations, all built-in handlers are expected to transition to GRPCAction.\n                          This change means that Lorry or other sidecar agents will expose the implementation of actions\n                          through a GRPC interface for external invocation.\n                          Then the controller will interact with these actions via GRPCAction calls.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                      initialDelaySeconds:\n                        description: |-\n                          Specifies the number of seconds to wait after the container has started before the RoleProbe\n                          begins to detect the container's role.\n                        format: int32\n                        type: integer\n                      periodSeconds:\n                        description: |-\n                          Specifies the frequency at which the probe is conducted. This value is expressed in seconds.\n                          Default to 10 seconds. Minimum value is 1.\n                        format: int32\n                        type: integer\n                      timeoutSeconds:\n                        description: |-\n                          Specifies the number of seconds after which the probe times out.\n                          Defaults to 1 second. Minimum value is 1.\n                        format: int32\n                        type: integer\n                    type: object\n                  switchover:\n                    description: |-\n                      Defines the procedure for a controlled transition of leadership from the current leader to a new replica.\n                      This approach aims to minimize downtime and maintain availability in systems with a leader-follower topology,\n                      during events such as planned maintenance or when performing stop, shutdown, restart, or upgrade operations\n                      involving the current leader node.\n\n\n                      The container executing this action has access to following environment variables:\n\n\n                      - KB_SWITCHOVER_CANDIDATE_NAME: The name of the pod for the new leader candidate, which may not be specified (empty).\n                      - KB_SWITCHOVER_CANDIDATE_FQDN: The FQDN of the new leader candidate's pod, which may not be specified (empty).\n                      - KB_LEADER_POD_IP: The IP address of the current leader's pod prior to the switchover.\n                      - KB_LEADER_POD_NAME: The name of the current leader's pod prior to the switchover.\n                      - KB_LEADER_POD_FQDN: The FQDN of the current leader's pod prior to the switchover.\n\n\n                      The environment variables with the following prefixes are deprecated and will be removed in future releases:\n\n\n                      - KB_REPLICATION_PRIMARY_POD_\n                      - KB_CONSENSUS_LEADER_POD_\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      scriptSpecSelectors:\n                        description: |-\n                          Used to define the selectors for the scriptSpecs that need to be referenced.\n                          If this field is set, the scripts defined under the 'scripts' field can be invoked or referenced within an Action.\n\n\n                          This field is deprecated from v0.9.\n                          This field is maintained for backward compatibility and its use is discouraged.\n                          Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                        items:\n                          properties:\n                            name:\n                              description: Represents the name of the ScriptSpec referent.\n                              maxLength: 63\n                              pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        type: array\n                      withCandidate:\n                        description: |-\n                          Represents the switchover process for a specified candidate primary or leader instance.\n                          Note that only Action.Exec is currently supported, while Action.HTTP is not.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                      withoutCandidate:\n                        description: |-\n                          Represents a switchover process that does not involve a specific candidate primary or leader instance.\n                          As with the previous field, only Action.Exec is currently supported, not Action.HTTP.\n                        properties:\n                          container:\n                            description: |-\n                              Defines the name of the container within the target Pod where the action will be executed.\n\n\n                              This name must correspond to one of the containers defined in `componentDefinition.spec.runtime`.\n                              If this field is not specified, the default behavior is to use the first container listed in\n                              `componentDefinition.spec.runtime`.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          exec:\n                            description: |-\n                              Defines the command to run.\n\n\n                              This field cannot be updated.\n                            properties:\n                              args:\n                                description: Args represents the arguments that are\n                                  passed to the `command` for execution.\n                                items:\n                                  type: string\n                                type: array\n                              command:\n                                description: |-\n                                  Specifies the command to be executed inside the container.\n                                  The working directory for this command is the container's root directory('/').\n                                  Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                  If the shell is required, it must be explicitly invoked in the command.\n\n\n                                  A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          http:\n                            description: |-\n                              Specifies the HTTP request to perform.\n\n\n                              This field cannot be updated.\n\n\n                              Note: HTTPAction is to be implemented in future version.\n                            properties:\n                              host:\n                                description: |-\n                                  Indicates the server's domain name or IP address. Defaults to the Pod's IP.\n                                  Prefer setting the \"Host\" header in httpHeaders when needed.\n                                type: string\n                              httpHeaders:\n                                description: |-\n                                  Allows for the inclusion of custom headers in the request.\n                                  HTTP permits the use of repeated headers.\n                                items:\n                                  description: HTTPHeader describes a custom header\n                                    to be used in HTTP probes\n                                  properties:\n                                    name:\n                                      description: |-\n                                        The header field name.\n                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                      type: string\n                                    value:\n                                      description: The header field value\n                                      type: string\n                                  required:\n                                  - name\n                                  - value\n                                  type: object\n                                type: array\n                              method:\n                                description: |-\n                                  Represents the type of HTTP request to be made, such as \"GET,\" \"POST,\" \"PUT,\" etc.\n                                  If not specified, \"GET\" is the default method.\n                                type: string\n                              path:\n                                description: Specifies the endpoint to be requested\n                                  on the HTTP server.\n                                type: string\n                              port:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Specifies the target port for the HTTP request.\n                                  It can be specified either as a numeric value in the range of 1 to 65535,\n                                  or as a named port that meets the IANA_SVC_NAME specification.\n                                x-kubernetes-int-or-string: true\n                              scheme:\n                                description: |-\n                                  Designates the protocol used to make the request, such as HTTP or HTTPS.\n                                  If not specified, HTTP is used by default.\n                                type: string\n                            required:\n                            - port\n                            type: object\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              This field is mutually exclusive with the `container` field; only one of them should be provided.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            type: string\n                          preCondition:\n                            description: |-\n                              Specifies the state that the cluster must reach before the Action is executed.\n                              Currently, this is only applicable to the `postProvision` action.\n\n\n                              The conditions are as follows:\n\n\n                              - `Immediately`: Executed right after the Component object is created.\n                                The readiness of the Component and its resources is not guaranteed at this stage.\n                              - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                                runtime resources (e.g. Pods) are in a ready state.\n                              - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                                This process does not affect the readiness state of the Component or the Cluster.\n                              - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                                This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                              This field cannot be updated.\n                            type: string\n                          retryPolicy:\n                            description: |-\n                              Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                              It specifies the conditions under which the Action should be retried and the limits to apply,\n                              such as the maximum number of retries and backoff strategy.\n\n\n                              This field cannot be updated.\n                            properties:\n                              maxRetries:\n                                default: 0\n                                description: |-\n                                  Defines the maximum number of retry attempts that should be made for a given Action.\n                                  This value is set to 0 by default, indicating that no retries will be made.\n                                type: integer\n                              retryInterval:\n                                default: 0\n                                description: |-\n                                  Indicates the duration of time to wait between each retry attempt.\n                                  This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                                format: int64\n                                type: integer\n                            type: object\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              This field cannot be updated.\n\n\n                              Note: This field is reserved for future use and is not currently active.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                          timeoutSeconds:\n                            default: 0\n                            description: |-\n                              Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                              If the Action does not complete within this time frame, it will be terminated.\n\n\n                              This field cannot be updated.\n                            format: int32\n                            type: integer\n                        type: object\n                    type: object\n                type: object\n              logConfigs:\n                description: |-\n                  Defines the types of logs generated by instances of the Component and their corresponding file paths.\n                  These logs can be collected for further analysis and monitoring.\n\n\n                  The `logConfigs` field is an optional list of LogConfig objects, where each object represents\n                  a specific log type and its configuration.\n                  It allows you to specify multiple log types and their respective file paths for the Component.\n\n\n                  Examples:\n\n\n                  ```yaml\n                   logConfigs:\n                   - filePathPattern: /data/mysql/log/mysqld-error.log\n                     name: error\n                   - filePathPattern: /data/mysql/log/mysqld.log\n                     name: general\n                   - filePathPattern: /data/mysql/log/mysqld-slowquery.log\n                     name: slow\n                  ```\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    filePathPattern:\n                      description: |-\n                        Specifies the paths or patterns identifying where the log files are stored.\n                        This field allows the system to locate and manage log files effectively.\n\n\n                        Examples:\n\n\n                        - /home/postgres/pgdata/pgroot/data/log/postgresql-*\n                        - /data/mysql/log/mysqld-error.log\n                      maxLength: 4096\n                      type: string\n                    name:\n                      description: |-\n                        Specifies a descriptive label for the log type, such as 'slow' for a MySQL slow log file.\n                        It provides a clear identification of the log's purpose and content.\n                      maxLength: 128\n                      type: string\n                  required:\n                  - filePathPattern\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              minReadySeconds:\n                default: 0\n                description: |-\n                  `minReadySeconds` is the minimum duration in seconds that a new Pod should remain in the ready\n                  state without any of its containers crashing to be considered available.\n                  This ensures the Pod's stability and readiness to serve requests.\n\n\n                  A default value of 0 seconds means the Pod is considered available as soon as it enters the ready state.\n                format: int32\n                minimum: 0\n                type: integer\n              monitor:\n                description: |-\n                  Deprecated since v0.9\n                  monitor is monitoring config which provided by provider.\n                properties:\n                  builtIn:\n                    default: false\n                    description: |-\n                      builtIn is a switch to enable KubeBlocks builtIn monitoring.\n                      If BuiltIn is set to true, monitor metrics will be scraped automatically.\n                      If BuiltIn is set to false, the provider should set ExporterConfig and Sidecar container own.\n                    type: boolean\n                  exporterConfig:\n                    description: |-\n                      exporterConfig provided by provider, which specify necessary information to Time Series Database.\n                      exporterConfig is valid when builtIn is false.\n                    properties:\n                      scrapePath:\n                        default: /metrics\n                        description: scrapePath is exporter url path for Time Series\n                          Database to scrape metrics.\n                        maxLength: 128\n                        type: string\n                      scrapePort:\n                        anyOf:\n                        - type: integer\n                        - type: string\n                        description: scrapePort is exporter port for Time Series Database\n                          to scrape metrics.\n                        x-kubernetes-int-or-string: true\n                    required:\n                    - scrapePort\n                    type: object\n                type: object\n              podManagementPolicy:\n                description: |-\n                  InstanceSet controls the creation of pods during initial scale up, replacement of pods on nodes, and scaling down.\n\n\n                  - `OrderedReady`: Creates pods in increasing order (pod-0, then pod-1, etc). The controller waits until each pod\n                  is ready before continuing. Pods are removed in reverse order when scaling down.\n                  - `Parallel`: Creates pods in parallel to match the desired scale without waiting. All pods are deleted at once\n                  when scaling down.\n                type: string\n              policyRules:\n                description: |-\n                  Defines the namespaced policy rules required by the Component.\n\n\n                  The `policyRules` field is an array of `rbacv1.PolicyRule` objects that define the policy rules\n                  needed by the Component to operate within a namespace.\n                  These policy rules determine the permissions and verbs the Component is allowed to perform on\n                  Kubernetes resources within the namespace.\n\n\n                  The purpose of this field is to automatically generate the necessary RBAC roles\n                  for the Component based on the specified policy rules.\n                  This ensures that the Pods in the Component has appropriate permissions to function.\n\n\n                  Note: This field is currently non-functional and is reserved for future implementation.\n\n\n                  This field is immutable.\n                items:\n                  description: |-\n                    PolicyRule holds information that describes a policy rule, but does not contain information\n                    about who the rule applies to or which namespace the rule applies to.\n                  properties:\n                    apiGroups:\n                      description: |-\n                        APIGroups is the name of the APIGroup that contains the resources.  If multiple API groups are specified, any action requested against one of\n                        the enumerated resources in any API group will be allowed. \"\" represents the core API group and \"*\" represents all API groups.\n                      items:\n                        type: string\n                      type: array\n                    nonResourceURLs:\n                      description: |-\n                        NonResourceURLs is a set of partial urls that a user should have access to.  *s are allowed, but only as the full, final step in the path\n                        Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding.\n                        Rules can either apply to API resources (such as \"pods\" or \"secrets\") or non-resource URL paths (such as \"/api\"),  but not both.\n                      items:\n                        type: string\n                      type: array\n                    resourceNames:\n                      description: ResourceNames is an optional white list of names\n                        that the rule applies to.  An empty set means that everything\n                        is allowed.\n                      items:\n                        type: string\n                      type: array\n                    resources:\n                      description: Resources is a list of resources this rule applies\n                        to. '*' represents all resources.\n                      items:\n                        type: string\n                      type: array\n                    verbs:\n                      description: Verbs is a list of Verbs that apply to ALL the\n                        ResourceKinds contained in this rule. '*' represents all verbs.\n                      items:\n                        type: string\n                      type: array\n                  required:\n                  - verbs\n                  type: object\n                type: array\n              provider:\n                description: |-\n                  Specifies the name of the Component provider, typically the vendor or developer name.\n                  It identifies the entity responsible for creating and maintaining the Component.\n\n\n                  When specifying the provider name, consider the following guidelines:\n\n\n                  - Keep the name concise and relevant to the Component.\n                  - Use a consistent naming convention across Components from the same provider.\n                  - Avoid using trademarked or copyrighted names without proper permission.\n                maxLength: 32\n                type: string\n              replicasLimit:\n                description: |-\n                  Defines the upper limit of the number of replicas supported by the Component.\n\n\n                  It defines the maximum number of replicas that can be created for the Component.\n                  This field allows you to set a limit on the scalability of the Component, preventing it from exceeding a certain number of replicas.\n\n\n                  This field is immutable.\n                properties:\n                  maxReplicas:\n                    description: The maximum limit of replicas.\n                    format: int32\n                    type: integer\n                  minReplicas:\n                    description: The minimum limit of replicas.\n                    format: int32\n                    type: integer\n                required:\n                - maxReplicas\n                - minReplicas\n                type: object\n                x-kubernetes-validations:\n                - message: the minimum and maximum limit of replicas should be in\n                    the range of [0, 16384]\n                  rule: self.minReplicas >= 0 && self.maxReplicas <= 16384\n                - message: the minimum replicas limit should be no greater than the\n                    maximum\n                  rule: self.minReplicas <= self.maxReplicas\n              roleArbitrator:\n                default: External\n                description: |-\n                  This field has been deprecated since v0.9.\n                  This field is maintained for backward compatibility and its use is discouraged.\n                  Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n\n\n                  This field is immutable.\n                enum:\n                - External\n                - Lorry\n                type: string\n              roles:\n                description: |-\n                  Enumerate all possible roles assigned to each replica of the Component, influencing its behavior.\n\n\n                  A replica can have zero to multiple roles.\n                  KubeBlocks operator determines the roles of each replica by invoking the `lifecycleActions.roleProbe` method.\n                  This action returns a list of roles for each replica, and the returned roles must be predefined in the `roles` field.\n\n\n                  The roles assigned to a replica can influence various aspects of the Component's behavior, such as:\n\n\n                  - Service selection: The Component's exposed Services may target replicas based on their roles using `roleSelector`.\n                  - Update order: The roles can determine the order in which replicas are updated during a Component update.\n                    For instance, replicas with a \"follower\" role can be updated first, while the replica with the \"leader\"\n                    role is updated last. This helps minimize the number of leader changes during the update process.\n\n\n                  This field is immutable.\n                items:\n                  description: ReplicaRole represents a role that can be assumed by\n                    a component instance.\n                  properties:\n                    name:\n                      description: |-\n                        Defines the role's identifier. It is used to set the \"apps.kubeblocks.io/role\" label value\n                        on the corresponding object.\n\n\n                        This field is immutable once set.\n                      maxLength: 32\n                      pattern: ^.*[^\\s]+.*$\n                      type: string\n                    serviceable:\n                      default: false\n                      description: |-\n                        Indicates whether a replica assigned this role is capable of providing services.\n\n\n                        This field is immutable once set.\n                      type: boolean\n                    votable:\n                      default: false\n                      description: |-\n                        Specifies whether a replica with this role has voting rights.\n                        In distributed systems, this typically means the replica can participate in consensus decisions,\n                        configuration changes, or other processes that require a quorum.\n\n\n                        This field is immutable once set.\n                      type: boolean\n                    writable:\n                      default: false\n                      description: |-\n                        Determines if a replica in this role has the authority to perform write operations.\n                        A writable replica can modify data, handle update operations.\n\n\n                        This field is immutable once set.\n                      type: boolean\n                  required:\n                  - name\n                  type: object\n                type: array\n              runtime:\n                description: |-\n                  Specifies the PodSpec template used in the Component.\n                  It includes the following elements:\n\n\n                  - Init containers\n                  - Containers\n                      - Image\n                      - Commands\n                      - Args\n                      - Envs\n                      - Mounts\n                      - Ports\n                      - Security context\n                      - Probes\n                      - Lifecycle\n                  - Volumes\n\n\n                  This field is intended to define static settings that remain consistent across all instantiated Components.\n                  Dynamic settings such as CPU and memory resource limits, as well as scheduling settings (affinity,\n                  toleration, priority), may vary among different instantiated Components.\n                  They should be specified in the `cluster.spec.componentSpecs` (ClusterComponentSpec).\n\n\n                  Specific instances of a Component may override settings defined here, such as using a different container image\n                  or modifying environment variable values.\n                  These instance-specific overrides can be specified in `cluster.spec.componentSpecs[*].instances`.\n\n\n                  This field is immutable and cannot be updated once set.\n                properties:\n                  activeDeadlineSeconds:\n                    description: |-\n                      Optional duration in seconds the pod may be active on the node relative to\n                      StartTime before the system will actively try to mark it failed and kill associated containers.\n                      Value must be a positive integer.\n                    format: int64\n                    type: integer\n                  affinity:\n                    description: If specified, the pod's scheduling constraints\n                    properties:\n                      nodeAffinity:\n                        description: Describes node affinity scheduling rules for\n                          the pod.\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: |-\n                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                              properties:\n                                preference:\n                                  description: A node selector term, associated with\n                                    the corresponding weight.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                weight:\n                                  description: Weight associated with matching the\n                                    corresponding nodeSelectorTerm, in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - preference\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to an update), the system\n                              may or may not try to eventually evict the pod from its node.\n                            properties:\n                              nodeSelectorTerms:\n                                description: Required. A list of node selector terms.\n                                  The terms are ORed.\n                                items:\n                                  description: |-\n                                    A null or empty node selector term matches no objects. The requirements of\n                                    them are ANDed.\n                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                type: array\n                            required:\n                            - nodeSelectorTerms\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                      podAffinity:\n                        description: Describes pod affinity scheduling rules (e.g.\n                          co-locate this pod in the same node, zone, etc. as some\n                          other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                      podAntiAffinity:\n                        description: Describes pod anti-affinity scheduling rules\n                          (e.g. avoid putting this pod in the same node, zone, etc.\n                          as some other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the anti-affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the anti-affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the anti-affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                    type: object\n                  automountServiceAccountToken:\n                    description: AutomountServiceAccountToken indicates whether a\n                      service account token should be automatically mounted.\n                    type: boolean\n                  containers:\n                    description: |-\n                      List of containers belonging to the pod.\n                      Containers cannot currently be added or removed.\n                      There must be at least one container in a Pod.\n                      Cannot be updated.\n                    items:\n                      description: A single application container that you want to\n                        run within a pod.\n                      properties:\n                        args:\n                          description: |-\n                            Arguments to the entrypoint.\n                            The container image's CMD is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        command:\n                          description: |-\n                            Entrypoint array. Not executed within a shell.\n                            The container image's ENTRYPOINT is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        env:\n                          description: |-\n                            List of environment variables to set in the container.\n                            Cannot be updated.\n                          items:\n                            description: EnvVar represents an environment variable\n                              present in a Container.\n                            properties:\n                              name:\n                                description: Name of the environment variable. Must\n                                  be a C_IDENTIFIER.\n                                type: string\n                              value:\n                                description: |-\n                                  Variable references $(VAR_NAME) are expanded\n                                  using the previously defined environment variables in the container and\n                                  any service environment variables. If a variable cannot be resolved,\n                                  the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                  \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                  Escaped references will never be expanded, regardless of whether the variable\n                                  exists or not.\n                                  Defaults to \"\".\n                                type: string\n                              valueFrom:\n                                description: Source for the environment variable's\n                                  value. Cannot be used if value is not empty.\n                                properties:\n                                  configMapKeyRef:\n                                    description: Selects a key of a ConfigMap.\n                                    properties:\n                                      key:\n                                        description: The key to select.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          or its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  fieldRef:\n                                    description: |-\n                                      Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                      spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  secretKeyRef:\n                                    description: Selects a key of a secret in the\n                                      pod's namespace\n                                    properties:\n                                      key:\n                                        description: The key of the secret to select\n                                          from.  Must be a valid secret key.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret or\n                                          its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        envFrom:\n                          description: |-\n                            List of sources to populate environment variables in the container.\n                            The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                            will be reported as an event when the container is starting. When a key exists in multiple\n                            sources, the value associated with the last source will take precedence.\n                            Values defined by an Env with a duplicate key will take precedence.\n                            Cannot be updated.\n                          items:\n                            description: EnvFromSource represents the source of a\n                              set of ConfigMaps\n                            properties:\n                              configMapRef:\n                                description: The ConfigMap to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap must\n                                      be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              prefix:\n                                description: An optional identifier to prepend to\n                                  each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                type: string\n                              secretRef:\n                                description: The Secret to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret must be\n                                      defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          type: array\n                        image:\n                          description: |-\n                            Container image name.\n                            More info: https://kubernetes.io/docs/concepts/containers/images\n                            This field is optional to allow higher level config management to default or override\n                            container images in workload controllers like Deployments and StatefulSets.\n                          type: string\n                        imagePullPolicy:\n                          description: |-\n                            Image pull policy.\n                            One of Always, Never, IfNotPresent.\n                            Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                          type: string\n                        lifecycle:\n                          description: |-\n                            Actions that the management system should take in response to container lifecycle events.\n                            Cannot be updated.\n                          properties:\n                            postStart:\n                              description: |-\n                                PostStart is called immediately after a container is created. If the handler fails,\n                                the container is terminated and restarted according to its restart policy.\n                                Other management of the container blocks until the hook completes.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                            preStop:\n                              description: |-\n                                PreStop is called immediately before a container is terminated due to an\n                                API request or management event such as liveness/startup probe failure,\n                                preemption, resource contention, etc. The handler is not called if the\n                                container crashes or exits. The Pod's termination grace period countdown begins before the\n                                PreStop hook is executed. Regardless of the outcome of the handler, the\n                                container will eventually terminate within the Pod's termination grace\n                                period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                or until the termination grace period is reached.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                          type: object\n                        livenessProbe:\n                          description: |-\n                            Periodic probe of container liveness.\n                            Container will be restarted if the probe fails.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        name:\n                          description: |-\n                            Name of the container specified as a DNS_LABEL.\n                            Each container in a pod must have a unique name (DNS_LABEL).\n                            Cannot be updated.\n                          type: string\n                        ports:\n                          description: |-\n                            List of ports to expose from the container. Not specifying a port here\n                            DOES NOT prevent that port from being exposed. Any port which is\n                            listening on the default \"0.0.0.0\" address inside a container will be\n                            accessible from the network.\n                            Modifying this array with strategic merge patch may corrupt the data.\n                            For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                            Cannot be updated.\n                          items:\n                            description: ContainerPort represents a network port in\n                              a single container.\n                            properties:\n                              containerPort:\n                                description: |-\n                                  Number of port to expose on the pod's IP address.\n                                  This must be a valid port number, 0 < x < 65536.\n                                format: int32\n                                type: integer\n                              hostIP:\n                                description: What host IP to bind the external port\n                                  to.\n                                type: string\n                              hostPort:\n                                description: |-\n                                  Number of port to expose on the host.\n                                  If specified, this must be a valid port number, 0 < x < 65536.\n                                  If HostNetwork is specified, this must match ContainerPort.\n                                  Most containers do not need this.\n                                format: int32\n                                type: integer\n                              name:\n                                description: |-\n                                  If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                  named port in a pod must have a unique name. Name for the port that can be\n                                  referred to by services.\n                                type: string\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  Protocol for port. Must be UDP, TCP, or SCTP.\n                                  Defaults to \"TCP\".\n                                type: string\n                            required:\n                            - containerPort\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - containerPort\n                          - protocol\n                          x-kubernetes-list-type: map\n                        readinessProbe:\n                          description: |-\n                            Periodic probe of container service readiness.\n                            Container will be removed from service endpoints if the probe fails.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        resizePolicy:\n                          description: Resources resize policy for the container.\n                          items:\n                            description: ContainerResizePolicy represents resource\n                              resize policy for the container.\n                            properties:\n                              resourceName:\n                                description: |-\n                                  Name of the resource to which this resource resize policy applies.\n                                  Supported values: cpu, memory.\n                                type: string\n                              restartPolicy:\n                                description: |-\n                                  Restart policy to apply when specified resource is resized.\n                                  If not specified, it defaults to NotRequired.\n                                type: string\n                            required:\n                            - resourceName\n                            - restartPolicy\n                            type: object\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        resources:\n                          description: |-\n                            Compute Resources required by this container.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                        restartPolicy:\n                          description: |-\n                            RestartPolicy defines the restart behavior of individual containers in a pod.\n                            This field may only be set for init containers, and the only allowed value is \"Always\".\n                            For non-init containers or when this field is not specified,\n                            the restart behavior is defined by the Pod's restart policy and the container type.\n                            Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                            this init container will be continually restarted on\n                            exit until all regular containers have terminated. Once all regular\n                            containers have completed, all init containers with restartPolicy \"Always\"\n                            will be shut down. This lifecycle differs from normal init containers and\n                            is often referred to as a \"sidecar\" container. Although this init\n                            container still starts in the init container sequence, it does not wait\n                            for the container to complete before proceeding to the next init\n                            container. Instead, the next init container starts immediately after this\n                            init container is started, or after any startupProbe has successfully\n                            completed.\n                          type: string\n                        securityContext:\n                          description: |-\n                            SecurityContext defines the security options the container should be run with.\n                            If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                            More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                          properties:\n                            allowPrivilegeEscalation:\n                              description: |-\n                                AllowPrivilegeEscalation controls whether a process can gain more\n                                privileges than its parent process. This bool directly controls if\n                                the no_new_privs flag will be set on the container process.\n                                AllowPrivilegeEscalation is true always when the container is:\n                                1) run as Privileged\n                                2) has CAP_SYS_ADMIN\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            capabilities:\n                              description: |-\n                                The capabilities to add/drop when running containers.\n                                Defaults to the default set of capabilities granted by the container runtime.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                add:\n                                  description: Added capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                                drop:\n                                  description: Removed capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                              type: object\n                            privileged:\n                              description: |-\n                                Run container in privileged mode.\n                                Processes in privileged containers are essentially equivalent to root on the host.\n                                Defaults to false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            procMount:\n                              description: |-\n                                procMount denotes the type of proc mount to use for the containers.\n                                The default is DefaultProcMount which uses the container runtime defaults for\n                                readonly paths and masked paths.\n                                This requires the ProcMountType feature flag to be enabled.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: string\n                            readOnlyRootFilesystem:\n                              description: |-\n                                Whether this container has a read-only root filesystem.\n                                Default is false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            runAsGroup:\n                              description: |-\n                                The GID to run the entrypoint of the container process.\n                                Uses runtime default if unset.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            runAsNonRoot:\n                              description: |-\n                                Indicates that the container must run as a non-root user.\n                                If true, the Kubelet will validate the image at runtime to ensure that it\n                                does not run as UID 0 (root) and fail to start the container if it does.\n                                If unset or false, no such validation will be performed.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              type: boolean\n                            runAsUser:\n                              description: |-\n                                The UID to run the entrypoint of the container process.\n                                Defaults to user specified in image metadata if unspecified.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            seLinuxOptions:\n                              description: |-\n                                The SELinux context to be applied to the container.\n                                If unspecified, the container runtime will allocate a random SELinux context for each\n                                container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                level:\n                                  description: Level is SELinux level label that applies\n                                    to the container.\n                                  type: string\n                                role:\n                                  description: Role is a SELinux role label that applies\n                                    to the container.\n                                  type: string\n                                type:\n                                  description: Type is a SELinux type label that applies\n                                    to the container.\n                                  type: string\n                                user:\n                                  description: User is a SELinux user label that applies\n                                    to the container.\n                                  type: string\n                              type: object\n                            seccompProfile:\n                              description: |-\n                                The seccomp options to use by this container. If seccomp options are\n                                provided at both the pod & container level, the container options\n                                override the pod options.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                localhostProfile:\n                                  description: |-\n                                    localhostProfile indicates a profile defined in a file on the node should be used.\n                                    The profile must be preconfigured on the node to work.\n                                    Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                    Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                  type: string\n                                type:\n                                  description: |-\n                                    type indicates which kind of seccomp profile will be applied.\n                                    Valid options are:\n\n\n                                    Localhost - a profile defined in a file on the node should be used.\n                                    RuntimeDefault - the container runtime default profile should be used.\n                                    Unconfined - no profile should be applied.\n                                  type: string\n                              required:\n                              - type\n                              type: object\n                            windowsOptions:\n                              description: |-\n                                The Windows specific settings applied to all containers.\n                                If unspecified, the options from the PodSecurityContext will be used.\n                                If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is linux.\n                              properties:\n                                gmsaCredentialSpec:\n                                  description: |-\n                                    GMSACredentialSpec is where the GMSA admission webhook\n                                    (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                    GMSA credential spec named by the GMSACredentialSpecName field.\n                                  type: string\n                                gmsaCredentialSpecName:\n                                  description: GMSACredentialSpecName is the name\n                                    of the GMSA credential spec to use.\n                                  type: string\n                                hostProcess:\n                                  description: |-\n                                    HostProcess determines if a container should be run as a 'Host Process' container.\n                                    All of a Pod's containers must have the same effective HostProcess value\n                                    (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                    In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                  type: boolean\n                                runAsUserName:\n                                  description: |-\n                                    The UserName in Windows to run the entrypoint of the container process.\n                                    Defaults to the user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext. If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: string\n                              type: object\n                          type: object\n                        startupProbe:\n                          description: |-\n                            StartupProbe indicates that the Pod has successfully initialized.\n                            If specified, no other probes are executed until this completes successfully.\n                            If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                            This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                            when it might take a long time to load data or warm a cache, than during steady-state operation.\n                            This cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        stdin:\n                          description: |-\n                            Whether this container should allocate a buffer for stdin in the container runtime. If this\n                            is not set, reads from stdin in the container will always result in EOF.\n                            Default is false.\n                          type: boolean\n                        stdinOnce:\n                          description: |-\n                            Whether the container runtime should close the stdin channel after it has been opened by\n                            a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                            sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                            first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                            at which time stdin is closed and remains closed until the container is restarted. If this\n                            flag is false, a container processes that reads from stdin will never receive an EOF.\n                            Default is false\n                          type: boolean\n                        terminationMessagePath:\n                          description: |-\n                            Optional: Path at which the file to which the container's termination message\n                            will be written is mounted into the container's filesystem.\n                            Message written is intended to be brief final status, such as an assertion failure message.\n                            Will be truncated by the node if greater than 4096 bytes. The total message length across\n                            all containers will be limited to 12kb.\n                            Defaults to /dev/termination-log.\n                            Cannot be updated.\n                          type: string\n                        terminationMessagePolicy:\n                          description: |-\n                            Indicate how the termination message should be populated. File will use the contents of\n                            terminationMessagePath to populate the container status message on both success and failure.\n                            FallbackToLogsOnError will use the last chunk of container log output if the termination\n                            message file is empty and the container exited with an error.\n                            The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                            Defaults to File.\n                            Cannot be updated.\n                          type: string\n                        tty:\n                          description: |-\n                            Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                            Default is false.\n                          type: boolean\n                        volumeDevices:\n                          description: volumeDevices is the list of block devices\n                            to be used by the container.\n                          items:\n                            description: volumeDevice describes a mapping of a raw\n                              block device within a container.\n                            properties:\n                              devicePath:\n                                description: devicePath is the path inside of the\n                                  container that the device will be mapped to.\n                                type: string\n                              name:\n                                description: name must match the name of a persistentVolumeClaim\n                                  in the pod\n                                type: string\n                            required:\n                            - devicePath\n                            - name\n                            type: object\n                          type: array\n                        volumeMounts:\n                          description: |-\n                            Pod volumes to mount into the container's filesystem.\n                            Cannot be updated.\n                          items:\n                            description: VolumeMount describes a mounting of a Volume\n                              within a container.\n                            properties:\n                              mountPath:\n                                description: |-\n                                  Path within the container at which the volume should be mounted.  Must\n                                  not contain ':'.\n                                type: string\n                              mountPropagation:\n                                description: |-\n                                  mountPropagation determines how mounts are propagated from the host\n                                  to container and the other way around.\n                                  When not set, MountPropagationNone is used.\n                                  This field is beta in 1.10.\n                                type: string\n                              name:\n                                description: This must match the Name of a Volume.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  Mounted read-only if true, read-write otherwise (false or unspecified).\n                                  Defaults to false.\n                                type: boolean\n                              subPath:\n                                description: |-\n                                  Path within the volume from which the container's volume should be mounted.\n                                  Defaults to \"\" (volume's root).\n                                type: string\n                              subPathExpr:\n                                description: |-\n                                  Expanded path within the volume from which the container's volume should be mounted.\n                                  Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                  Defaults to \"\" (volume's root).\n                                  SubPathExpr and SubPath are mutually exclusive.\n                                type: string\n                            required:\n                            - mountPath\n                            - name\n                            type: object\n                          type: array\n                        workingDir:\n                          description: |-\n                            Container's working directory.\n                            If not specified, the container runtime's default will be used, which\n                            might be configured in the container image.\n                            Cannot be updated.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                  dnsConfig:\n                    description: |-\n                      Specifies the DNS parameters of a pod.\n                      Parameters specified here will be merged to the generated DNS\n                      configuration based on DNSPolicy.\n                    properties:\n                      nameservers:\n                        description: |-\n                          A list of DNS name server IP addresses.\n                          This will be appended to the base nameservers generated from DNSPolicy.\n                          Duplicated nameservers will be removed.\n                        items:\n                          type: string\n                        type: array\n                      options:\n                        description: |-\n                          A list of DNS resolver options.\n                          This will be merged with the base options generated from DNSPolicy.\n                          Duplicated entries will be removed. Resolution options given in Options\n                          will override those that appear in the base DNSPolicy.\n                        items:\n                          description: PodDNSConfigOption defines DNS resolver options\n                            of a pod.\n                          properties:\n                            name:\n                              description: Required.\n                              type: string\n                            value:\n                              type: string\n                          type: object\n                        type: array\n                      searches:\n                        description: |-\n                          A list of DNS search domains for host-name lookup.\n                          This will be appended to the base search paths generated from DNSPolicy.\n                          Duplicated search paths will be removed.\n                        items:\n                          type: string\n                        type: array\n                    type: object\n                  dnsPolicy:\n                    description: |-\n                      Set DNS policy for the pod.\n                      Defaults to \"ClusterFirst\".\n                      Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.\n                      DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy.\n                      To have DNS options set along with hostNetwork, you have to specify DNS policy\n                      explicitly to 'ClusterFirstWithHostNet'.\n                    type: string\n                  enableServiceLinks:\n                    description: |-\n                      EnableServiceLinks indicates whether information about services should be injected into pod's\n                      environment variables, matching the syntax of Docker links.\n                      Optional: Defaults to true.\n                    type: boolean\n                  ephemeralContainers:\n                    description: |-\n                      List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing\n                      pod to perform user-initiated actions such as debugging. This list cannot be specified when\n                      creating a pod, and it cannot be modified by updating the pod spec. In order to add an\n                      ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.\n                    items:\n                      description: |-\n                        An EphemeralContainer is a temporary container that you may add to an existing Pod for\n                        user-initiated activities such as debugging. Ephemeral containers have no resource or\n                        scheduling guarantees, and they will not be restarted when they exit or when a Pod is\n                        removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the\n                        Pod to exceed its resource allocation.\n\n\n                        To add an ephemeral container, use the ephemeralcontainers subresource of an existing\n                        Pod. Ephemeral containers may not be removed or restarted.\n                      properties:\n                        args:\n                          description: |-\n                            Arguments to the entrypoint.\n                            The image's CMD is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        command:\n                          description: |-\n                            Entrypoint array. Not executed within a shell.\n                            The image's ENTRYPOINT is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        env:\n                          description: |-\n                            List of environment variables to set in the container.\n                            Cannot be updated.\n                          items:\n                            description: EnvVar represents an environment variable\n                              present in a Container.\n                            properties:\n                              name:\n                                description: Name of the environment variable. Must\n                                  be a C_IDENTIFIER.\n                                type: string\n                              value:\n                                description: |-\n                                  Variable references $(VAR_NAME) are expanded\n                                  using the previously defined environment variables in the container and\n                                  any service environment variables. If a variable cannot be resolved,\n                                  the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                  \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                  Escaped references will never be expanded, regardless of whether the variable\n                                  exists or not.\n                                  Defaults to \"\".\n                                type: string\n                              valueFrom:\n                                description: Source for the environment variable's\n                                  value. Cannot be used if value is not empty.\n                                properties:\n                                  configMapKeyRef:\n                                    description: Selects a key of a ConfigMap.\n                                    properties:\n                                      key:\n                                        description: The key to select.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          or its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  fieldRef:\n                                    description: |-\n                                      Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                      spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  secretKeyRef:\n                                    description: Selects a key of a secret in the\n                                      pod's namespace\n                                    properties:\n                                      key:\n                                        description: The key of the secret to select\n                                          from.  Must be a valid secret key.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret or\n                                          its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        envFrom:\n                          description: |-\n                            List of sources to populate environment variables in the container.\n                            The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                            will be reported as an event when the container is starting. When a key exists in multiple\n                            sources, the value associated with the last source will take precedence.\n                            Values defined by an Env with a duplicate key will take precedence.\n                            Cannot be updated.\n                          items:\n                            description: EnvFromSource represents the source of a\n                              set of ConfigMaps\n                            properties:\n                              configMapRef:\n                                description: The ConfigMap to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap must\n                                      be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              prefix:\n                                description: An optional identifier to prepend to\n                                  each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                type: string\n                              secretRef:\n                                description: The Secret to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret must be\n                                      defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          type: array\n                        image:\n                          description: |-\n                            Container image name.\n                            More info: https://kubernetes.io/docs/concepts/containers/images\n                          type: string\n                        imagePullPolicy:\n                          description: |-\n                            Image pull policy.\n                            One of Always, Never, IfNotPresent.\n                            Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                          type: string\n                        lifecycle:\n                          description: Lifecycle is not allowed for ephemeral containers.\n                          properties:\n                            postStart:\n                              description: |-\n                                PostStart is called immediately after a container is created. If the handler fails,\n                                the container is terminated and restarted according to its restart policy.\n                                Other management of the container blocks until the hook completes.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                            preStop:\n                              description: |-\n                                PreStop is called immediately before a container is terminated due to an\n                                API request or management event such as liveness/startup probe failure,\n                                preemption, resource contention, etc. The handler is not called if the\n                                container crashes or exits. The Pod's termination grace period countdown begins before the\n                                PreStop hook is executed. Regardless of the outcome of the handler, the\n                                container will eventually terminate within the Pod's termination grace\n                                period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                or until the termination grace period is reached.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                          type: object\n                        livenessProbe:\n                          description: Probes are not allowed for ephemeral containers.\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        name:\n                          description: |-\n                            Name of the ephemeral container specified as a DNS_LABEL.\n                            This name must be unique among all containers, init containers and ephemeral containers.\n                          type: string\n                        ports:\n                          description: Ports are not allowed for ephemeral containers.\n                          items:\n                            description: ContainerPort represents a network port in\n                              a single container.\n                            properties:\n                              containerPort:\n                                description: |-\n                                  Number of port to expose on the pod's IP address.\n                                  This must be a valid port number, 0 < x < 65536.\n                                format: int32\n                                type: integer\n                              hostIP:\n                                description: What host IP to bind the external port\n                                  to.\n                                type: string\n                              hostPort:\n                                description: |-\n                                  Number of port to expose on the host.\n                                  If specified, this must be a valid port number, 0 < x < 65536.\n                                  If HostNetwork is specified, this must match ContainerPort.\n                                  Most containers do not need this.\n                                format: int32\n                                type: integer\n                              name:\n                                description: |-\n                                  If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                  named port in a pod must have a unique name. Name for the port that can be\n                                  referred to by services.\n                                type: string\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  Protocol for port. Must be UDP, TCP, or SCTP.\n                                  Defaults to \"TCP\".\n                                type: string\n                            required:\n                            - containerPort\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - containerPort\n                          - protocol\n                          x-kubernetes-list-type: map\n                        readinessProbe:\n                          description: Probes are not allowed for ephemeral containers.\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        resizePolicy:\n                          description: Resources resize policy for the container.\n                          items:\n                            description: ContainerResizePolicy represents resource\n                              resize policy for the container.\n                            properties:\n                              resourceName:\n                                description: |-\n                                  Name of the resource to which this resource resize policy applies.\n                                  Supported values: cpu, memory.\n                                type: string\n                              restartPolicy:\n                                description: |-\n                                  Restart policy to apply when specified resource is resized.\n                                  If not specified, it defaults to NotRequired.\n                                type: string\n                            required:\n                            - resourceName\n                            - restartPolicy\n                            type: object\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        resources:\n                          description: |-\n                            Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources\n                            already allocated to the pod.\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                        restartPolicy:\n                          description: |-\n                            Restart policy for the container to manage the restart behavior of each\n                            container within a pod.\n                            This may only be set for init containers. You cannot set this field on\n                            ephemeral containers.\n                          type: string\n                        securityContext:\n                          description: |-\n                            Optional: SecurityContext defines the security options the ephemeral container should be run with.\n                            If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                          properties:\n                            allowPrivilegeEscalation:\n                              description: |-\n                                AllowPrivilegeEscalation controls whether a process can gain more\n                                privileges than its parent process. This bool directly controls if\n                                the no_new_privs flag will be set on the container process.\n                                AllowPrivilegeEscalation is true always when the container is:\n                                1) run as Privileged\n                                2) has CAP_SYS_ADMIN\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            capabilities:\n                              description: |-\n                                The capabilities to add/drop when running containers.\n                                Defaults to the default set of capabilities granted by the container runtime.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                add:\n                                  description: Added capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                                drop:\n                                  description: Removed capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                              type: object\n                            privileged:\n                              description: |-\n                                Run container in privileged mode.\n                                Processes in privileged containers are essentially equivalent to root on the host.\n                                Defaults to false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            procMount:\n                              description: |-\n                                procMount denotes the type of proc mount to use for the containers.\n                                The default is DefaultProcMount which uses the container runtime defaults for\n                                readonly paths and masked paths.\n                                This requires the ProcMountType feature flag to be enabled.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: string\n                            readOnlyRootFilesystem:\n                              description: |-\n                                Whether this container has a read-only root filesystem.\n                                Default is false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            runAsGroup:\n                              description: |-\n                                The GID to run the entrypoint of the container process.\n                                Uses runtime default if unset.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            runAsNonRoot:\n                              description: |-\n                                Indicates that the container must run as a non-root user.\n                                If true, the Kubelet will validate the image at runtime to ensure that it\n                                does not run as UID 0 (root) and fail to start the container if it does.\n                                If unset or false, no such validation will be performed.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              type: boolean\n                            runAsUser:\n                              description: |-\n                                The UID to run the entrypoint of the container process.\n                                Defaults to user specified in image metadata if unspecified.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            seLinuxOptions:\n                              description: |-\n                                The SELinux context to be applied to the container.\n                                If unspecified, the container runtime will allocate a random SELinux context for each\n                                container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                level:\n                                  description: Level is SELinux level label that applies\n                                    to the container.\n                                  type: string\n                                role:\n                                  description: Role is a SELinux role label that applies\n                                    to the container.\n                                  type: string\n                                type:\n                                  description: Type is a SELinux type label that applies\n                                    to the container.\n                                  type: string\n                                user:\n                                  description: User is a SELinux user label that applies\n                                    to the container.\n                                  type: string\n                              type: object\n                            seccompProfile:\n                              description: |-\n                                The seccomp options to use by this container. If seccomp options are\n                                provided at both the pod & container level, the container options\n                                override the pod options.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                localhostProfile:\n                                  description: |-\n                                    localhostProfile indicates a profile defined in a file on the node should be used.\n                                    The profile must be preconfigured on the node to work.\n                                    Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                    Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                  type: string\n                                type:\n                                  description: |-\n                                    type indicates which kind of seccomp profile will be applied.\n                                    Valid options are:\n\n\n                                    Localhost - a profile defined in a file on the node should be used.\n                                    RuntimeDefault - the container runtime default profile should be used.\n                                    Unconfined - no profile should be applied.\n                                  type: string\n                              required:\n                              - type\n                              type: object\n                            windowsOptions:\n                              description: |-\n                                The Windows specific settings applied to all containers.\n                                If unspecified, the options from the PodSecurityContext will be used.\n                                If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is linux.\n                              properties:\n                                gmsaCredentialSpec:\n                                  description: |-\n                                    GMSACredentialSpec is where the GMSA admission webhook\n                                    (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                    GMSA credential spec named by the GMSACredentialSpecName field.\n                                  type: string\n                                gmsaCredentialSpecName:\n                                  description: GMSACredentialSpecName is the name\n                                    of the GMSA credential spec to use.\n                                  type: string\n                                hostProcess:\n                                  description: |-\n                                    HostProcess determines if a container should be run as a 'Host Process' container.\n                                    All of a Pod's containers must have the same effective HostProcess value\n                                    (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                    In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                  type: boolean\n                                runAsUserName:\n                                  description: |-\n                                    The UserName in Windows to run the entrypoint of the container process.\n                                    Defaults to the user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext. If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: string\n                              type: object\n                          type: object\n                        startupProbe:\n                          description: Probes are not allowed for ephemeral containers.\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        stdin:\n                          description: |-\n                            Whether this container should allocate a buffer for stdin in the container runtime. If this\n                            is not set, reads from stdin in the container will always result in EOF.\n                            Default is false.\n                          type: boolean\n                        stdinOnce:\n                          description: |-\n                            Whether the container runtime should close the stdin channel after it has been opened by\n                            a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                            sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                            first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                            at which time stdin is closed and remains closed until the container is restarted. If this\n                            flag is false, a container processes that reads from stdin will never receive an EOF.\n                            Default is false\n                          type: boolean\n                        targetContainerName:\n                          description: |-\n                            If set, the name of the container from PodSpec that this ephemeral container targets.\n                            The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container.\n                            If not set then the ephemeral container uses the namespaces configured in the Pod spec.\n\n\n                            The container runtime must implement support for this feature. If the runtime does not\n                            support namespace targeting then the result of setting this field is undefined.\n                          type: string\n                        terminationMessagePath:\n                          description: |-\n                            Optional: Path at which the file to which the container's termination message\n                            will be written is mounted into the container's filesystem.\n                            Message written is intended to be brief final status, such as an assertion failure message.\n                            Will be truncated by the node if greater than 4096 bytes. The total message length across\n                            all containers will be limited to 12kb.\n                            Defaults to /dev/termination-log.\n                            Cannot be updated.\n                          type: string\n                        terminationMessagePolicy:\n                          description: |-\n                            Indicate how the termination message should be populated. File will use the contents of\n                            terminationMessagePath to populate the container status message on both success and failure.\n                            FallbackToLogsOnError will use the last chunk of container log output if the termination\n                            message file is empty and the container exited with an error.\n                            The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                            Defaults to File.\n                            Cannot be updated.\n                          type: string\n                        tty:\n                          description: |-\n                            Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                            Default is false.\n                          type: boolean\n                        volumeDevices:\n                          description: volumeDevices is the list of block devices\n                            to be used by the container.\n                          items:\n                            description: volumeDevice describes a mapping of a raw\n                              block device within a container.\n                            properties:\n                              devicePath:\n                                description: devicePath is the path inside of the\n                                  container that the device will be mapped to.\n                                type: string\n                              name:\n                                description: name must match the name of a persistentVolumeClaim\n                                  in the pod\n                                type: string\n                            required:\n                            - devicePath\n                            - name\n                            type: object\n                          type: array\n                        volumeMounts:\n                          description: |-\n                            Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers.\n                            Cannot be updated.\n                          items:\n                            description: VolumeMount describes a mounting of a Volume\n                              within a container.\n                            properties:\n                              mountPath:\n                                description: |-\n                                  Path within the container at which the volume should be mounted.  Must\n                                  not contain ':'.\n                                type: string\n                              mountPropagation:\n                                description: |-\n                                  mountPropagation determines how mounts are propagated from the host\n                                  to container and the other way around.\n                                  When not set, MountPropagationNone is used.\n                                  This field is beta in 1.10.\n                                type: string\n                              name:\n                                description: This must match the Name of a Volume.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  Mounted read-only if true, read-write otherwise (false or unspecified).\n                                  Defaults to false.\n                                type: boolean\n                              subPath:\n                                description: |-\n                                  Path within the volume from which the container's volume should be mounted.\n                                  Defaults to \"\" (volume's root).\n                                type: string\n                              subPathExpr:\n                                description: |-\n                                  Expanded path within the volume from which the container's volume should be mounted.\n                                  Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                  Defaults to \"\" (volume's root).\n                                  SubPathExpr and SubPath are mutually exclusive.\n                                type: string\n                            required:\n                            - mountPath\n                            - name\n                            type: object\n                          type: array\n                        workingDir:\n                          description: |-\n                            Container's working directory.\n                            If not specified, the container runtime's default will be used, which\n                            might be configured in the container image.\n                            Cannot be updated.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                  hostAliases:\n                    description: |-\n                      HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts\n                      file if specified. This is only valid for non-hostNetwork pods.\n                    items:\n                      description: |-\n                        HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the\n                        pod's hosts file.\n                      properties:\n                        hostnames:\n                          description: Hostnames for the above IP address.\n                          items:\n                            type: string\n                          type: array\n                        ip:\n                          description: IP address of the host file entry.\n                          type: string\n                      type: object\n                    type: array\n                  hostIPC:\n                    description: |-\n                      Use the host's ipc namespace.\n                      Optional: Default to false.\n                    type: boolean\n                  hostNetwork:\n                    description: |-\n                      Host networking requested for this pod. Use the host's network namespace.\n                      If this option is set, the ports that will be used must be specified.\n                      Default to false.\n                    type: boolean\n                  hostPID:\n                    description: |-\n                      Use the host's pid namespace.\n                      Optional: Default to false.\n                    type: boolean\n                  hostUsers:\n                    description: |-\n                      Use the host's user namespace.\n                      Optional: Default to true.\n                      If set to true or not present, the pod will be run in the host user namespace, useful\n                      for when the pod needs a feature only available to the host user namespace, such as\n                      loading a kernel module with CAP_SYS_MODULE.\n                      When set to false, a new userns is created for the pod. Setting false is useful for\n                      mitigating container breakout vulnerabilities even allowing users to run their\n                      containers as root without actually having root privileges on the host.\n                      This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.\n                    type: boolean\n                  hostname:\n                    description: |-\n                      Specifies the hostname of the Pod\n                      If not specified, the pod's hostname will be set to a system-defined value.\n                    type: string\n                  imagePullSecrets:\n                    description: |-\n                      ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec.\n                      If specified, these secrets will be passed to individual puller implementations for them to use.\n                      More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod\n                    items:\n                      description: |-\n                        LocalObjectReference contains enough information to let you locate the\n                        referenced object inside the same namespace.\n                      properties:\n                        name:\n                          description: |-\n                            Name of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            TODO: Add other useful fields. apiVersion, kind, uid?\n                          type: string\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    type: array\n                  initContainers:\n                    description: |-\n                      List of initialization containers belonging to the pod.\n                      Init containers are executed in order prior to containers being started. If any\n                      init container fails, the pod is considered to have failed and is handled according\n                      to its restartPolicy. The name for an init container or normal container must be\n                      unique among all containers.\n                      Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes.\n                      The resourceRequirements of an init container are taken into account during scheduling\n                      by finding the highest request/limit for each resource type, and then using the max of\n                      of that value or the sum of the normal containers. Limits are applied to init containers\n                      in a similar fashion.\n                      Init containers cannot currently be added or removed.\n                      Cannot be updated.\n                      More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n                    items:\n                      description: A single application container that you want to\n                        run within a pod.\n                      properties:\n                        args:\n                          description: |-\n                            Arguments to the entrypoint.\n                            The container image's CMD is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        command:\n                          description: |-\n                            Entrypoint array. Not executed within a shell.\n                            The container image's ENTRYPOINT is used if this is not provided.\n                            Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                            cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                            produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                            of whether the variable exists or not. Cannot be updated.\n                            More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                          items:\n                            type: string\n                          type: array\n                        env:\n                          description: |-\n                            List of environment variables to set in the container.\n                            Cannot be updated.\n                          items:\n                            description: EnvVar represents an environment variable\n                              present in a Container.\n                            properties:\n                              name:\n                                description: Name of the environment variable. Must\n                                  be a C_IDENTIFIER.\n                                type: string\n                              value:\n                                description: |-\n                                  Variable references $(VAR_NAME) are expanded\n                                  using the previously defined environment variables in the container and\n                                  any service environment variables. If a variable cannot be resolved,\n                                  the reference in the input string will be unchanged. Double $$ are reduced\n                                  to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                  \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                  Escaped references will never be expanded, regardless of whether the variable\n                                  exists or not.\n                                  Defaults to \"\".\n                                type: string\n                              valueFrom:\n                                description: Source for the environment variable's\n                                  value. Cannot be used if value is not empty.\n                                properties:\n                                  configMapKeyRef:\n                                    description: Selects a key of a ConfigMap.\n                                    properties:\n                                      key:\n                                        description: The key to select.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          or its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  fieldRef:\n                                    description: |-\n                                      Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                      spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  secretKeyRef:\n                                    description: Selects a key of a secret in the\n                                      pod's namespace\n                                    properties:\n                                      key:\n                                        description: The key of the secret to select\n                                          from.  Must be a valid secret key.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret or\n                                          its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        envFrom:\n                          description: |-\n                            List of sources to populate environment variables in the container.\n                            The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                            will be reported as an event when the container is starting. When a key exists in multiple\n                            sources, the value associated with the last source will take precedence.\n                            Values defined by an Env with a duplicate key will take precedence.\n                            Cannot be updated.\n                          items:\n                            description: EnvFromSource represents the source of a\n                              set of ConfigMaps\n                            properties:\n                              configMapRef:\n                                description: The ConfigMap to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap must\n                                      be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              prefix:\n                                description: An optional identifier to prepend to\n                                  each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                type: string\n                              secretRef:\n                                description: The Secret to select from\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret must be\n                                      defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          type: array\n                        image:\n                          description: |-\n                            Container image name.\n                            More info: https://kubernetes.io/docs/concepts/containers/images\n                            This field is optional to allow higher level config management to default or override\n                            container images in workload controllers like Deployments and StatefulSets.\n                          type: string\n                        imagePullPolicy:\n                          description: |-\n                            Image pull policy.\n                            One of Always, Never, IfNotPresent.\n                            Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                          type: string\n                        lifecycle:\n                          description: |-\n                            Actions that the management system should take in response to container lifecycle events.\n                            Cannot be updated.\n                          properties:\n                            postStart:\n                              description: |-\n                                PostStart is called immediately after a container is created. If the handler fails,\n                                the container is terminated and restarted according to its restart policy.\n                                Other management of the container blocks until the hook completes.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                            preStop:\n                              description: |-\n                                PreStop is called immediately before a container is terminated due to an\n                                API request or management event such as liveness/startup probe failure,\n                                preemption, resource contention, etc. The handler is not called if the\n                                container crashes or exits. The Pod's termination grace period countdown begins before the\n                                PreStop hook is executed. Regardless of the outcome of the handler, the\n                                container will eventually terminate within the Pod's termination grace\n                                period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                or until the termination grace period is reached.\n                                More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                sleep:\n                                  description: Sleep represents the duration that\n                                    the container should sleep before being terminated.\n                                  properties:\n                                    seconds:\n                                      description: Seconds is the number of seconds\n                                        to sleep.\n                                      format: int64\n                                      type: integer\n                                  required:\n                                  - seconds\n                                  type: object\n                                tcpSocket:\n                                  description: |-\n                                    Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                    for the backward compatibility. There are no validation of this field and\n                                    lifecycle hooks will fail in runtime when tcp handler is specified.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                              type: object\n                          type: object\n                        livenessProbe:\n                          description: |-\n                            Periodic probe of container liveness.\n                            Container will be restarted if the probe fails.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        name:\n                          description: |-\n                            Name of the container specified as a DNS_LABEL.\n                            Each container in a pod must have a unique name (DNS_LABEL).\n                            Cannot be updated.\n                          type: string\n                        ports:\n                          description: |-\n                            List of ports to expose from the container. Not specifying a port here\n                            DOES NOT prevent that port from being exposed. Any port which is\n                            listening on the default \"0.0.0.0\" address inside a container will be\n                            accessible from the network.\n                            Modifying this array with strategic merge patch may corrupt the data.\n                            For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                            Cannot be updated.\n                          items:\n                            description: ContainerPort represents a network port in\n                              a single container.\n                            properties:\n                              containerPort:\n                                description: |-\n                                  Number of port to expose on the pod's IP address.\n                                  This must be a valid port number, 0 < x < 65536.\n                                format: int32\n                                type: integer\n                              hostIP:\n                                description: What host IP to bind the external port\n                                  to.\n                                type: string\n                              hostPort:\n                                description: |-\n                                  Number of port to expose on the host.\n                                  If specified, this must be a valid port number, 0 < x < 65536.\n                                  If HostNetwork is specified, this must match ContainerPort.\n                                  Most containers do not need this.\n                                format: int32\n                                type: integer\n                              name:\n                                description: |-\n                                  If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                  named port in a pod must have a unique name. Name for the port that can be\n                                  referred to by services.\n                                type: string\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  Protocol for port. Must be UDP, TCP, or SCTP.\n                                  Defaults to \"TCP\".\n                                type: string\n                            required:\n                            - containerPort\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - containerPort\n                          - protocol\n                          x-kubernetes-list-type: map\n                        readinessProbe:\n                          description: |-\n                            Periodic probe of container service readiness.\n                            Container will be removed from service endpoints if the probe fails.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        resizePolicy:\n                          description: Resources resize policy for the container.\n                          items:\n                            description: ContainerResizePolicy represents resource\n                              resize policy for the container.\n                            properties:\n                              resourceName:\n                                description: |-\n                                  Name of the resource to which this resource resize policy applies.\n                                  Supported values: cpu, memory.\n                                type: string\n                              restartPolicy:\n                                description: |-\n                                  Restart policy to apply when specified resource is resized.\n                                  If not specified, it defaults to NotRequired.\n                                type: string\n                            required:\n                            - resourceName\n                            - restartPolicy\n                            type: object\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        resources:\n                          description: |-\n                            Compute Resources required by this container.\n                            Cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                        restartPolicy:\n                          description: |-\n                            RestartPolicy defines the restart behavior of individual containers in a pod.\n                            This field may only be set for init containers, and the only allowed value is \"Always\".\n                            For non-init containers or when this field is not specified,\n                            the restart behavior is defined by the Pod's restart policy and the container type.\n                            Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                            this init container will be continually restarted on\n                            exit until all regular containers have terminated. Once all regular\n                            containers have completed, all init containers with restartPolicy \"Always\"\n                            will be shut down. This lifecycle differs from normal init containers and\n                            is often referred to as a \"sidecar\" container. Although this init\n                            container still starts in the init container sequence, it does not wait\n                            for the container to complete before proceeding to the next init\n                            container. Instead, the next init container starts immediately after this\n                            init container is started, or after any startupProbe has successfully\n                            completed.\n                          type: string\n                        securityContext:\n                          description: |-\n                            SecurityContext defines the security options the container should be run with.\n                            If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                            More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                          properties:\n                            allowPrivilegeEscalation:\n                              description: |-\n                                AllowPrivilegeEscalation controls whether a process can gain more\n                                privileges than its parent process. This bool directly controls if\n                                the no_new_privs flag will be set on the container process.\n                                AllowPrivilegeEscalation is true always when the container is:\n                                1) run as Privileged\n                                2) has CAP_SYS_ADMIN\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            capabilities:\n                              description: |-\n                                The capabilities to add/drop when running containers.\n                                Defaults to the default set of capabilities granted by the container runtime.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                add:\n                                  description: Added capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                                drop:\n                                  description: Removed capabilities\n                                  items:\n                                    description: Capability represent POSIX capabilities\n                                      type\n                                    type: string\n                                  type: array\n                              type: object\n                            privileged:\n                              description: |-\n                                Run container in privileged mode.\n                                Processes in privileged containers are essentially equivalent to root on the host.\n                                Defaults to false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            procMount:\n                              description: |-\n                                procMount denotes the type of proc mount to use for the containers.\n                                The default is DefaultProcMount which uses the container runtime defaults for\n                                readonly paths and masked paths.\n                                This requires the ProcMountType feature flag to be enabled.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: string\n                            readOnlyRootFilesystem:\n                              description: |-\n                                Whether this container has a read-only root filesystem.\n                                Default is false.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              type: boolean\n                            runAsGroup:\n                              description: |-\n                                The GID to run the entrypoint of the container process.\n                                Uses runtime default if unset.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            runAsNonRoot:\n                              description: |-\n                                Indicates that the container must run as a non-root user.\n                                If true, the Kubelet will validate the image at runtime to ensure that it\n                                does not run as UID 0 (root) and fail to start the container if it does.\n                                If unset or false, no such validation will be performed.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              type: boolean\n                            runAsUser:\n                              description: |-\n                                The UID to run the entrypoint of the container process.\n                                Defaults to user specified in image metadata if unspecified.\n                                May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              format: int64\n                              type: integer\n                            seLinuxOptions:\n                              description: |-\n                                The SELinux context to be applied to the container.\n                                If unspecified, the container runtime will allocate a random SELinux context for each\n                                container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                level:\n                                  description: Level is SELinux level label that applies\n                                    to the container.\n                                  type: string\n                                role:\n                                  description: Role is a SELinux role label that applies\n                                    to the container.\n                                  type: string\n                                type:\n                                  description: Type is a SELinux type label that applies\n                                    to the container.\n                                  type: string\n                                user:\n                                  description: User is a SELinux user label that applies\n                                    to the container.\n                                  type: string\n                              type: object\n                            seccompProfile:\n                              description: |-\n                                The seccomp options to use by this container. If seccomp options are\n                                provided at both the pod & container level, the container options\n                                override the pod options.\n                                Note that this field cannot be set when spec.os.name is windows.\n                              properties:\n                                localhostProfile:\n                                  description: |-\n                                    localhostProfile indicates a profile defined in a file on the node should be used.\n                                    The profile must be preconfigured on the node to work.\n                                    Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                    Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                  type: string\n                                type:\n                                  description: |-\n                                    type indicates which kind of seccomp profile will be applied.\n                                    Valid options are:\n\n\n                                    Localhost - a profile defined in a file on the node should be used.\n                                    RuntimeDefault - the container runtime default profile should be used.\n                                    Unconfined - no profile should be applied.\n                                  type: string\n                              required:\n                              - type\n                              type: object\n                            windowsOptions:\n                              description: |-\n                                The Windows specific settings applied to all containers.\n                                If unspecified, the options from the PodSecurityContext will be used.\n                                If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                Note that this field cannot be set when spec.os.name is linux.\n                              properties:\n                                gmsaCredentialSpec:\n                                  description: |-\n                                    GMSACredentialSpec is where the GMSA admission webhook\n                                    (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                    GMSA credential spec named by the GMSACredentialSpecName field.\n                                  type: string\n                                gmsaCredentialSpecName:\n                                  description: GMSACredentialSpecName is the name\n                                    of the GMSA credential spec to use.\n                                  type: string\n                                hostProcess:\n                                  description: |-\n                                    HostProcess determines if a container should be run as a 'Host Process' container.\n                                    All of a Pod's containers must have the same effective HostProcess value\n                                    (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                    In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                  type: boolean\n                                runAsUserName:\n                                  description: |-\n                                    The UserName in Windows to run the entrypoint of the container process.\n                                    Defaults to the user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext. If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: string\n                              type: object\n                          type: object\n                        startupProbe:\n                          description: |-\n                            StartupProbe indicates that the Pod has successfully initialized.\n                            If specified, no other probes are executed until this completes successfully.\n                            If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                            This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                            when it might take a long time to load data or warm a cache, than during steady-state operation.\n                            This cannot be updated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            failureThreshold:\n                              description: |-\n                                Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                Defaults to 3. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            grpc:\n                              description: GRPC specifies an action involving a GRPC\n                                port.\n                              properties:\n                                port:\n                                  description: Port number of the gRPC service. Number\n                                    must be in the range 1 to 65535.\n                                  format: int32\n                                  type: integer\n                                service:\n                                  description: |-\n                                    Service is the name of the service to place in the gRPC HealthCheckRequest\n                                    (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                    If this is not specified, the default behavior is defined by gRPC.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            initialDelaySeconds:\n                              description: |-\n                                Number of seconds after the container has started before liveness probes are initiated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                            periodSeconds:\n                              description: |-\n                                How often (in seconds) to perform the probe.\n                                Default to 10 seconds. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            successThreshold:\n                              description: |-\n                                Minimum consecutive successes for the probe to be considered successful after having failed.\n                                Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                              format: int32\n                              type: integer\n                            tcpSocket:\n                              description: TCPSocket specifies an action involving\n                                a TCP port.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                value overrides the value provided by the pod spec.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                              format: int64\n                              type: integer\n                            timeoutSeconds:\n                              description: |-\n                                Number of seconds after which the probe times out.\n                                Defaults to 1 second. Minimum value is 1.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              format: int32\n                              type: integer\n                          type: object\n                        stdin:\n                          description: |-\n                            Whether this container should allocate a buffer for stdin in the container runtime. If this\n                            is not set, reads from stdin in the container will always result in EOF.\n                            Default is false.\n                          type: boolean\n                        stdinOnce:\n                          description: |-\n                            Whether the container runtime should close the stdin channel after it has been opened by\n                            a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                            sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                            first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                            at which time stdin is closed and remains closed until the container is restarted. If this\n                            flag is false, a container processes that reads from stdin will never receive an EOF.\n                            Default is false\n                          type: boolean\n                        terminationMessagePath:\n                          description: |-\n                            Optional: Path at which the file to which the container's termination message\n                            will be written is mounted into the container's filesystem.\n                            Message written is intended to be brief final status, such as an assertion failure message.\n                            Will be truncated by the node if greater than 4096 bytes. The total message length across\n                            all containers will be limited to 12kb.\n                            Defaults to /dev/termination-log.\n                            Cannot be updated.\n                          type: string\n                        terminationMessagePolicy:\n                          description: |-\n                            Indicate how the termination message should be populated. File will use the contents of\n                            terminationMessagePath to populate the container status message on both success and failure.\n                            FallbackToLogsOnError will use the last chunk of container log output if the termination\n                            message file is empty and the container exited with an error.\n                            The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                            Defaults to File.\n                            Cannot be updated.\n                          type: string\n                        tty:\n                          description: |-\n                            Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                            Default is false.\n                          type: boolean\n                        volumeDevices:\n                          description: volumeDevices is the list of block devices\n                            to be used by the container.\n                          items:\n                            description: volumeDevice describes a mapping of a raw\n                              block device within a container.\n                            properties:\n                              devicePath:\n                                description: devicePath is the path inside of the\n                                  container that the device will be mapped to.\n                                type: string\n                              name:\n                                description: name must match the name of a persistentVolumeClaim\n                                  in the pod\n                                type: string\n                            required:\n                            - devicePath\n                            - name\n                            type: object\n                          type: array\n                        volumeMounts:\n                          description: |-\n                            Pod volumes to mount into the container's filesystem.\n                            Cannot be updated.\n                          items:\n                            description: VolumeMount describes a mounting of a Volume\n                              within a container.\n                            properties:\n                              mountPath:\n                                description: |-\n                                  Path within the container at which the volume should be mounted.  Must\n                                  not contain ':'.\n                                type: string\n                              mountPropagation:\n                                description: |-\n                                  mountPropagation determines how mounts are propagated from the host\n                                  to container and the other way around.\n                                  When not set, MountPropagationNone is used.\n                                  This field is beta in 1.10.\n                                type: string\n                              name:\n                                description: This must match the Name of a Volume.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  Mounted read-only if true, read-write otherwise (false or unspecified).\n                                  Defaults to false.\n                                type: boolean\n                              subPath:\n                                description: |-\n                                  Path within the volume from which the container's volume should be mounted.\n                                  Defaults to \"\" (volume's root).\n                                type: string\n                              subPathExpr:\n                                description: |-\n                                  Expanded path within the volume from which the container's volume should be mounted.\n                                  Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                  Defaults to \"\" (volume's root).\n                                  SubPathExpr and SubPath are mutually exclusive.\n                                type: string\n                            required:\n                            - mountPath\n                            - name\n                            type: object\n                          type: array\n                        workingDir:\n                          description: |-\n                            Container's working directory.\n                            If not specified, the container runtime's default will be used, which\n                            might be configured in the container image.\n                            Cannot be updated.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                  nodeName:\n                    description: |-\n                      NodeName is a request to schedule this pod onto a specific node. If it is non-empty,\n                      the scheduler simply schedules this pod onto that node, assuming that it fits resource\n                      requirements.\n                    type: string\n                  nodeSelector:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      NodeSelector is a selector which must be true for the pod to fit on a node.\n                      Selector which must match a node's labels for the pod to be scheduled on that node.\n                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  os:\n                    description: |-\n                      Specifies the OS of the containers in the pod.\n                      Some pod and container fields are restricted if this is set.\n\n\n                      If the OS field is set to linux, the following fields must be unset:\n                      -securityContext.windowsOptions\n\n\n                      If the OS field is set to windows, following fields must be unset:\n                      - spec.hostPID\n                      - spec.hostIPC\n                      - spec.hostUsers\n                      - spec.securityContext.seLinuxOptions\n                      - spec.securityContext.seccompProfile\n                      - spec.securityContext.fsGroup\n                      - spec.securityContext.fsGroupChangePolicy\n                      - spec.securityContext.sysctls\n                      - spec.shareProcessNamespace\n                      - spec.securityContext.runAsUser\n                      - spec.securityContext.runAsGroup\n                      - spec.securityContext.supplementalGroups\n                      - spec.containers[*].securityContext.seLinuxOptions\n                      - spec.containers[*].securityContext.seccompProfile\n                      - spec.containers[*].securityContext.capabilities\n                      - spec.containers[*].securityContext.readOnlyRootFilesystem\n                      - spec.containers[*].securityContext.privileged\n                      - spec.containers[*].securityContext.allowPrivilegeEscalation\n                      - spec.containers[*].securityContext.procMount\n                      - spec.containers[*].securityContext.runAsUser\n                      - spec.containers[*].securityContext.runAsGroup\n                    properties:\n                      name:\n                        description: |-\n                          Name is the name of the operating system. The currently supported values are linux and windows.\n                          Additional value may be defined in future and can be one of:\n                          https://github.com/opencontainers/runtime-spec/blob/master/config.md#platform-specific-configuration\n                          Clients should expect to handle additional values and treat unrecognized values in this field as os: null\n                        type: string\n                    required:\n                    - name\n                    type: object\n                  overhead:\n                    additionalProperties:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                      x-kubernetes-int-or-string: true\n                    description: |-\n                      Overhead represents the resource overhead associated with running a pod for a given RuntimeClass.\n                      This field will be autopopulated at admission time by the RuntimeClass admission controller. If\n                      the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests.\n                      The RuntimeClass admission controller will reject Pod create requests which have the overhead already\n                      set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value\n                      defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero.\n                      More info: https://git.k8s.io/enhancements/keps/sig-node/688-pod-overhead/README.md\n                    type: object\n                  preemptionPolicy:\n                    description: |-\n                      PreemptionPolicy is the Policy for preempting pods with lower priority.\n                      One of Never, PreemptLowerPriority.\n                      Defaults to PreemptLowerPriority if unset.\n                    type: string\n                  priority:\n                    description: |-\n                      The priority value. Various system components use this field to find the\n                      priority of the pod. When Priority Admission Controller is enabled, it\n                      prevents users from setting this field. The admission controller populates\n                      this field from PriorityClassName.\n                      The higher the value, the higher the priority.\n                    format: int32\n                    type: integer\n                  priorityClassName:\n                    description: |-\n                      If specified, indicates the pod's priority. \"system-node-critical\" and\n                      \"system-cluster-critical\" are two special keywords which indicate the\n                      highest priorities with the former being the highest priority. Any other\n                      name must be defined by creating a PriorityClass object with that name.\n                      If not specified, the pod priority will be default or zero if there is no\n                      default.\n                    type: string\n                  readinessGates:\n                    description: |-\n                      If specified, all readiness gates will be evaluated for pod readiness.\n                      A pod is ready when all its containers are ready AND\n                      all conditions specified in the readiness gates have status equal to \"True\"\n                      More info: https://git.k8s.io/enhancements/keps/sig-network/580-pod-readiness-gates\n                    items:\n                      description: PodReadinessGate contains the reference to a pod\n                        condition\n                      properties:\n                        conditionType:\n                          description: ConditionType refers to a condition in the\n                            pod's condition list with matching type.\n                          type: string\n                      required:\n                      - conditionType\n                      type: object\n                    type: array\n                  resourceClaims:\n                    description: |-\n                      ResourceClaims defines which ResourceClaims must be allocated\n                      and reserved before the Pod is allowed to start. The resources\n                      will be made available to those containers which consume them\n                      by name.\n\n\n                      This is an alpha field and requires enabling the\n                      DynamicResourceAllocation feature gate.\n\n\n                      This field is immutable.\n                    items:\n                      description: |-\n                        PodResourceClaim references exactly one ResourceClaim through a ClaimSource.\n                        It adds a name to it that uniquely identifies the ResourceClaim inside the Pod.\n                        Containers that need access to the ResourceClaim reference it with this name.\n                      properties:\n                        name:\n                          description: |-\n                            Name uniquely identifies this resource claim inside the pod.\n                            This must be a DNS_LABEL.\n                          type: string\n                        source:\n                          description: Source describes where to find the ResourceClaim.\n                          properties:\n                            resourceClaimName:\n                              description: |-\n                                ResourceClaimName is the name of a ResourceClaim object in the same\n                                namespace as this pod.\n                              type: string\n                            resourceClaimTemplateName:\n                              description: |-\n                                ResourceClaimTemplateName is the name of a ResourceClaimTemplate\n                                object in the same namespace as this pod.\n\n\n                                The template will be used to create a new ResourceClaim, which will\n                                be bound to this pod. When this pod is deleted, the ResourceClaim\n                                will also be deleted. The pod name and resource name, along with a\n                                generated component, will be used to form a unique name for the\n                                ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses.\n\n\n                                This field is immutable and no changes will be made to the\n                                corresponding ResourceClaim by the control plane after creating the\n                                ResourceClaim.\n                              type: string\n                          type: object\n                      required:\n                      - name\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                  restartPolicy:\n                    description: |-\n                      Restart policy for all containers within the pod.\n                      One of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted.\n                      Default to Always.\n                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy\n                    type: string\n                  runtimeClassName:\n                    description: |-\n                      RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used\n                      to run this pod.  If no RuntimeClass resource matches the named class, the pod will not be run.\n                      If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an\n                      empty definition that uses the default runtime handler.\n                      More info: https://git.k8s.io/enhancements/keps/sig-node/585-runtime-class\n                    type: string\n                  schedulerName:\n                    description: |-\n                      If specified, the pod will be dispatched by specified scheduler.\n                      If not specified, the pod will be dispatched by default scheduler.\n                    type: string\n                  schedulingGates:\n                    description: |-\n                      SchedulingGates is an opaque list of values that if specified will block scheduling the pod.\n                      If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the\n                      scheduler will not attempt to schedule the pod.\n\n\n                      SchedulingGates can only be set at pod creation time, and be removed only afterwards.\n\n\n                      This is a beta feature enabled by the PodSchedulingReadiness feature gate.\n                    items:\n                      description: PodSchedulingGate is associated to a Pod to guard\n                        its scheduling.\n                      properties:\n                        name:\n                          description: |-\n                            Name of the scheduling gate.\n                            Each scheduling gate must have a unique name field.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                  securityContext:\n                    description: |-\n                      SecurityContext holds pod-level security attributes and common container settings.\n                      Optional: Defaults to empty.  See type description for default values of each field.\n                    properties:\n                      fsGroup:\n                        description: |-\n                          A special supplemental group that applies to all containers in a pod.\n                          Some volume types allow the Kubelet to change the ownership of that volume\n                          to be owned by the pod:\n\n\n                          1. The owning GID will be the FSGroup\n                          2. The setgid bit is set (new files created in the volume will be owned by FSGroup)\n                          3. The permission bits are OR'd with rw-rw----\n\n\n                          If unset, the Kubelet will not modify the ownership and permissions of any volume.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        format: int64\n                        type: integer\n                      fsGroupChangePolicy:\n                        description: |-\n                          fsGroupChangePolicy defines behavior of changing ownership and permission of the volume\n                          before being exposed inside Pod. This field will only apply to\n                          volume types which support fsGroup based ownership(and permissions).\n                          It will have no effect on ephemeral volume types such as: secret, configmaps\n                          and emptydir.\n                          Valid values are \"OnRootMismatch\" and \"Always\". If not specified, \"Always\" is used.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        type: string\n                      runAsGroup:\n                        description: |-\n                          The GID to run the entrypoint of the container process.\n                          Uses runtime default if unset.\n                          May also be set in SecurityContext.  If set in both SecurityContext and\n                          PodSecurityContext, the value specified in SecurityContext takes precedence\n                          for that container.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        format: int64\n                        type: integer\n                      runAsNonRoot:\n                        description: |-\n                          Indicates that the container must run as a non-root user.\n                          If true, the Kubelet will validate the image at runtime to ensure that it\n                          does not run as UID 0 (root) and fail to start the container if it does.\n                          If unset or false, no such validation will be performed.\n                          May also be set in SecurityContext.  If set in both SecurityContext and\n                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                        type: boolean\n                      runAsUser:\n                        description: |-\n                          The UID to run the entrypoint of the container process.\n                          Defaults to user specified in image metadata if unspecified.\n                          May also be set in SecurityContext.  If set in both SecurityContext and\n                          PodSecurityContext, the value specified in SecurityContext takes precedence\n                          for that container.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        format: int64\n                        type: integer\n                      seLinuxOptions:\n                        description: |-\n                          The SELinux context to be applied to all containers.\n                          If unspecified, the container runtime will allocate a random SELinux context for each\n                          container.  May also be set in SecurityContext.  If set in\n                          both SecurityContext and PodSecurityContext, the value specified in SecurityContext\n                          takes precedence for that container.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        properties:\n                          level:\n                            description: Level is SELinux level label that applies\n                              to the container.\n                            type: string\n                          role:\n                            description: Role is a SELinux role label that applies\n                              to the container.\n                            type: string\n                          type:\n                            description: Type is a SELinux type label that applies\n                              to the container.\n                            type: string\n                          user:\n                            description: User is a SELinux user label that applies\n                              to the container.\n                            type: string\n                        type: object\n                      seccompProfile:\n                        description: |-\n                          The seccomp options to use by the containers in this pod.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        properties:\n                          localhostProfile:\n                            description: |-\n                              localhostProfile indicates a profile defined in a file on the node should be used.\n                              The profile must be preconfigured on the node to work.\n                              Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                              Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                            type: string\n                          type:\n                            description: |-\n                              type indicates which kind of seccomp profile will be applied.\n                              Valid options are:\n\n\n                              Localhost - a profile defined in a file on the node should be used.\n                              RuntimeDefault - the container runtime default profile should be used.\n                              Unconfined - no profile should be applied.\n                            type: string\n                        required:\n                        - type\n                        type: object\n                      supplementalGroups:\n                        description: |-\n                          A list of groups applied to the first process run in each container, in addition\n                          to the container's primary GID, the fsGroup (if specified), and group memberships\n                          defined in the container image for the uid of the container process. If unspecified,\n                          no additional groups are added to any container. Note that group memberships\n                          defined in the container image for the uid of the container process are still effective,\n                          even if they are not included in this list.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        items:\n                          format: int64\n                          type: integer\n                        type: array\n                      sysctls:\n                        description: |-\n                          Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported\n                          sysctls (by the container runtime) might fail to launch.\n                          Note that this field cannot be set when spec.os.name is windows.\n                        items:\n                          description: Sysctl defines a kernel parameter to be set\n                          properties:\n                            name:\n                              description: Name of a property to set\n                              type: string\n                            value:\n                              description: Value of a property to set\n                              type: string\n                          required:\n                          - name\n                          - value\n                          type: object\n                        type: array\n                      windowsOptions:\n                        description: |-\n                          The Windows specific settings applied to all containers.\n                          If unspecified, the options within a container's SecurityContext will be used.\n                          If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                          Note that this field cannot be set when spec.os.name is linux.\n                        properties:\n                          gmsaCredentialSpec:\n                            description: |-\n                              GMSACredentialSpec is where the GMSA admission webhook\n                              (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                              GMSA credential spec named by the GMSACredentialSpecName field.\n                            type: string\n                          gmsaCredentialSpecName:\n                            description: GMSACredentialSpecName is the name of the\n                              GMSA credential spec to use.\n                            type: string\n                          hostProcess:\n                            description: |-\n                              HostProcess determines if a container should be run as a 'Host Process' container.\n                              All of a Pod's containers must have the same effective HostProcess value\n                              (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                              In addition, if HostProcess is true then HostNetwork must also be set to true.\n                            type: boolean\n                          runAsUserName:\n                            description: |-\n                              The UserName in Windows to run the entrypoint of the container process.\n                              Defaults to the user specified in image metadata if unspecified.\n                              May also be set in PodSecurityContext. If set in both SecurityContext and\n                              PodSecurityContext, the value specified in SecurityContext takes precedence.\n                            type: string\n                        type: object\n                    type: object\n                  serviceAccount:\n                    description: |-\n                      DeprecatedServiceAccount is a depreciated alias for ServiceAccountName.\n                      Deprecated: Use serviceAccountName instead.\n                    type: string\n                  serviceAccountName:\n                    description: |-\n                      ServiceAccountName is the name of the ServiceAccount to use to run this pod.\n                      More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n                    type: string\n                  setHostnameAsFQDN:\n                    description: |-\n                      If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default).\n                      In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname).\n                      In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip\\\\Parameters to FQDN.\n                      If a pod does not have FQDN, this has no effect.\n                      Default to false.\n                    type: boolean\n                  shareProcessNamespace:\n                    description: |-\n                      Share a single process namespace between all of the containers in a pod.\n                      When this is set containers will be able to view and signal processes from other containers\n                      in the same pod, and the first process in each container will not be assigned PID 1.\n                      HostPID and ShareProcessNamespace cannot both be set.\n                      Optional: Default to false.\n                    type: boolean\n                  subdomain:\n                    description: |-\n                      If specified, the fully qualified Pod hostname will be \"<hostname>.<subdomain>.<pod namespace>.svc.<cluster domain>\".\n                      If not specified, the pod will not have a domainname at all.\n                    type: string\n                  terminationGracePeriodSeconds:\n                    description: |-\n                      Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request.\n                      Value must be non-negative integer. The value zero indicates stop immediately via\n                      the kill signal (no opportunity to shut down).\n                      If this value is nil, the default grace period will be used instead.\n                      The grace period is the duration in seconds after the processes running in the pod are sent\n                      a termination signal and the time when the processes are forcibly halted with a kill signal.\n                      Set this value longer than the expected cleanup time for your process.\n                      Defaults to 30 seconds.\n                    format: int64\n                    type: integer\n                  tolerations:\n                    description: If specified, the pod's tolerations.\n                    items:\n                      description: |-\n                        The pod this Toleration is attached to tolerates any taint that matches\n                        the triple <key,value,effect> using the matching operator <operator>.\n                      properties:\n                        effect:\n                          description: |-\n                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                          type: string\n                        key:\n                          description: |-\n                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                          type: string\n                        operator:\n                          description: |-\n                            Operator represents a key's relationship to the value.\n                            Valid operators are Exists and Equal. Defaults to Equal.\n                            Exists is equivalent to wildcard for value, so that a pod can\n                            tolerate all taints of a particular category.\n                          type: string\n                        tolerationSeconds:\n                          description: |-\n                            TolerationSeconds represents the period of time the toleration (which must be\n                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                            negative values will be treated as 0 (evict immediately) by the system.\n                          format: int64\n                          type: integer\n                        value:\n                          description: |-\n                            Value is the taint value the toleration matches to.\n                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                          type: string\n                      type: object\n                    type: array\n                  topologySpreadConstraints:\n                    description: |-\n                      TopologySpreadConstraints describes how a group of pods ought to spread across topology\n                      domains. Scheduler will schedule pods in a way which abides by the constraints.\n                      All topologySpreadConstraints are ANDed.\n                    items:\n                      description: TopologySpreadConstraint specifies how to spread\n                        matching pods among the given topology.\n                      properties:\n                        labelSelector:\n                          description: |-\n                            LabelSelector is used to find matching pods.\n                            Pods that match this label selector are counted to determine the number of pods\n                            in their corresponding topology domain.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        matchLabelKeys:\n                          description: |-\n                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                            spreading will be calculated. The keys are used to lookup values from the\n                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                            to select the group of existing pods over which spreading will be calculated\n                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                            Keys that don't exist in the incoming pod labels will\n                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        maxSkew:\n                          description: |-\n                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                            between the number of matching pods in the target topology and the global minimum.\n                            The global minimum is the minimum number of matching pods in an eligible domain\n                            or zero if the number of eligible domains is less than MinDomains.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 2/2/1:\n                            In this case, the global minimum is 1.\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |   P   |\n                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                            violate MaxSkew(1).\n                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                            to topologies that satisfy it.\n                            It's a required field. Default value is 1 and 0 is not allowed.\n                          format: int32\n                          type: integer\n                        minDomains:\n                          description: |-\n                            MinDomains indicates a minimum number of eligible domains.\n                            When the number of eligible domains with matching topology keys is less than minDomains,\n                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                            this value has no effect on scheduling.\n                            As a result, when the number of eligible domains is less than minDomains,\n                            scheduler won't schedule more than maxSkew Pods to those domains.\n                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                            Valid values are integers greater than 0.\n                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                            labelSelector spread as 2/2/2:\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |  P P  |\n                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                            it will violate MaxSkew.\n\n\n                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                          format: int32\n                          type: integer\n                        nodeAffinityPolicy:\n                          description: |-\n                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                            when calculating pod topology spread skew. Options are:\n                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                            If this value is nil, the behavior is equivalent to the Honor policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        nodeTaintsPolicy:\n                          description: |-\n                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                            pod topology spread skew. Options are:\n                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                            has a toleration, are included.\n                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        topologyKey:\n                          description: |-\n                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                            and identical values are considered to be in the same topology.\n                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                            of pods into each bucket.\n                            We define a domain as a particular instance of a topology.\n                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                            nodeAffinityPolicy and nodeTaintsPolicy.\n                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                            It's a required field.\n                          type: string\n                        whenUnsatisfiable:\n                          description: |-\n                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                            the spread constraint.\n                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                              but giving higher precedence to topologies that would help reduce the\n                              skew.\n                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                            if and only if every possible node assignment for that pod would violate\n                            \"MaxSkew\" on some topology.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 3/1/1:\n                            | zone1 | zone2 | zone3 |\n                            | P P P |   P   |   P   |\n                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                            won't make it *more* imbalanced.\n                            It's a required field.\n                          type: string\n                      required:\n                      - maxSkew\n                      - topologyKey\n                      - whenUnsatisfiable\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - topologyKey\n                    - whenUnsatisfiable\n                    x-kubernetes-list-type: map\n                  volumes:\n                    description: |-\n                      List of volumes that can be mounted by containers belonging to the pod.\n                      More info: https://kubernetes.io/docs/concepts/storage/volumes\n                    items:\n                      description: Volume represents a named volume in a pod that\n                        may be accessed by any container in the pod.\n                      properties:\n                        awsElasticBlockStore:\n                          description: |-\n                            awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                            kubelet's host machine and then exposed to the pod.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type of the volume that you want to mount.\n                                Tip: Ensure that the filesystem type is supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            partition:\n                              description: |-\n                                partition is the partition in the volume that you want to mount.\n                                If omitted, the default is to mount by volume name.\n                                Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                              format: int32\n                              type: integer\n                            readOnly:\n                              description: |-\n                                readOnly value true will force the readOnly setting in VolumeMounts.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                              type: boolean\n                            volumeID:\n                              description: |-\n                                volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                              type: string\n                          required:\n                          - volumeID\n                          type: object\n                        azureDisk:\n                          description: azureDisk represents an Azure Data Disk mount\n                            on the host and bind mount to the pod.\n                          properties:\n                            cachingMode:\n                              description: 'cachingMode is the Host Caching mode:\n                                None, Read Only, Read Write.'\n                              type: string\n                            diskName:\n                              description: diskName is the Name of the data disk in\n                                the blob storage\n                              type: string\n                            diskURI:\n                              description: diskURI is the URI of data disk in the\n                                blob storage\n                              type: string\n                            fsType:\n                              description: |-\n                                fsType is Filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            kind:\n                              description: 'kind expected values are Shared: multiple\n                                blob disks per storage account  Dedicated: single\n                                blob disk per storage account  Managed: azure managed\n                                data disk (only in managed availability set). defaults\n                                to shared'\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly Defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                          required:\n                          - diskName\n                          - diskURI\n                          type: object\n                        azureFile:\n                          description: azureFile represents an Azure File Service\n                            mount on the host and bind mount to the pod.\n                          properties:\n                            readOnly:\n                              description: |-\n                                readOnly defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            secretName:\n                              description: secretName is the  name of secret that\n                                contains Azure Storage Account Name and Key\n                              type: string\n                            shareName:\n                              description: shareName is the azure share Name\n                              type: string\n                          required:\n                          - secretName\n                          - shareName\n                          type: object\n                        cephfs:\n                          description: cephFS represents a Ceph FS mount on the host\n                            that shares a pod's lifetime\n                          properties:\n                            monitors:\n                              description: |-\n                                monitors is Required: Monitors is a collection of Ceph monitors\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              items:\n                                type: string\n                              type: array\n                            path:\n                              description: 'path is Optional: Used as the mounted\n                                root, rather than the full Ceph tree, default is /'\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              type: boolean\n                            secretFile:\n                              description: |-\n                                secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              type: string\n                            secretRef:\n                              description: |-\n                                secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            user:\n                              description: |-\n                                user is optional: User is the rados user name, default is admin\n                                More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                              type: string\n                          required:\n                          - monitors\n                          type: object\n                        cinder:\n                          description: |-\n                            cinder represents a cinder volume attached and mounted on kubelets host machine.\n                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                                More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef is optional: points to a secret object containing parameters used to connect\n                                to OpenStack.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            volumeID:\n                              description: |-\n                                volumeID used to identify the volume in cinder.\n                                More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                              type: string\n                          required:\n                          - volumeID\n                          type: object\n                        configMap:\n                          description: configMap represents a configMap that should\n                            populate this volume\n                          properties:\n                            defaultMode:\n                              description: |-\n                                defaultMode is optional: mode bits used to set permissions on created files by default.\n                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                Defaults to 0644.\n                                Directories within the path are not affected by this setting.\n                                This might be in conflict with other options that affect the file\n                                mode, like fsGroup, and the result can be other mode bits set.\n                              format: int32\n                              type: integer\n                            items:\n                              description: |-\n                                items if unspecified, each key-value pair in the Data field of the referenced\n                                ConfigMap will be projected into the volume as a file whose name is the\n                                key and content is the value. If specified, the listed keys will be\n                                projected into the specified paths, and unlisted keys will not be\n                                present. If a key is specified which is not present in the ConfigMap,\n                                the volume setup will error unless it is marked optional. Paths must be\n                                relative and may not contain the '..' path or start with '..'.\n                              items:\n                                description: Maps a string key to a path within a\n                                  volume.\n                                properties:\n                                  key:\n                                    description: key is the key to project.\n                                    type: string\n                                  mode:\n                                    description: |-\n                                      mode is Optional: mode bits used to set permissions on this file.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      If not specified, the volume defaultMode will be used.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  path:\n                                    description: |-\n                                      path is the relative path of the file to map the key to.\n                                      May not be an absolute path.\n                                      May not contain the path element '..'.\n                                      May not start with the string '..'.\n                                    type: string\n                                required:\n                                - key\n                                - path\n                                type: object\n                              type: array\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: optional specify whether the ConfigMap\n                                or its keys must be defined\n                              type: boolean\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        csi:\n                          description: csi (Container Storage Interface) represents\n                            ephemeral storage that is handled by certain external\n                            CSI drivers (Beta feature).\n                          properties:\n                            driver:\n                              description: |-\n                                driver is the name of the CSI driver that handles this volume.\n                                Consult with your admin for the correct name as registered in the cluster.\n                              type: string\n                            fsType:\n                              description: |-\n                                fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                If not provided, the empty value is passed to the associated CSI driver\n                                which will determine the default filesystem to apply.\n                              type: string\n                            nodePublishSecretRef:\n                              description: |-\n                                nodePublishSecretRef is a reference to the secret object containing\n                                sensitive information to pass to the CSI driver to complete the CSI\n                                NodePublishVolume and NodeUnpublishVolume calls.\n                                This field is optional, and  may be empty if no secret is required. If the\n                                secret object contains more than one secret, all secret references are passed.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            readOnly:\n                              description: |-\n                                readOnly specifies a read-only configuration for the volume.\n                                Defaults to false (read/write).\n                              type: boolean\n                            volumeAttributes:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                volumeAttributes stores driver-specific properties that are passed to the CSI\n                                driver. Consult your driver's documentation for supported values.\n                              type: object\n                          required:\n                          - driver\n                          type: object\n                        downwardAPI:\n                          description: downwardAPI represents downward API about the\n                            pod that should populate this volume\n                          properties:\n                            defaultMode:\n                              description: |-\n                                Optional: mode bits to use on created files by default. Must be a\n                                Optional: mode bits used to set permissions on created files by default.\n                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                Defaults to 0644.\n                                Directories within the path are not affected by this setting.\n                                This might be in conflict with other options that affect the file\n                                mode, like fsGroup, and the result can be other mode bits set.\n                              format: int32\n                              type: integer\n                            items:\n                              description: Items is a list of downward API volume\n                                file\n                              items:\n                                description: DownwardAPIVolumeFile represents information\n                                  to create the file containing the pod field\n                                properties:\n                                  fieldRef:\n                                    description: 'Required: Selects a field of the\n                                      pod: only annotations, labels, name and namespace\n                                      are supported.'\n                                    properties:\n                                      apiVersion:\n                                        description: Version of the schema the FieldPath\n                                          is written in terms of, defaults to \"v1\".\n                                        type: string\n                                      fieldPath:\n                                        description: Path of the field to select in\n                                          the specified API version.\n                                        type: string\n                                    required:\n                                    - fieldPath\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  mode:\n                                    description: |-\n                                      Optional: mode bits used to set permissions on this file, must be an octal value\n                                      between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      If not specified, the volume defaultMode will be used.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  path:\n                                    description: 'Required: Path is  the relative\n                                      path name of the file to be created. Must not\n                                      be absolute or contain the ''..'' path. Must\n                                      be utf-8 encoded. The first item of the relative\n                                      path must not start with ''..'''\n                                    type: string\n                                  resourceFieldRef:\n                                    description: |-\n                                      Selects a resource of the container: only resources limits and requests\n                                      (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                    properties:\n                                      containerName:\n                                        description: 'Container name: required for\n                                          volumes, optional for env vars'\n                                        type: string\n                                      divisor:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: Specifies the output format of\n                                          the exposed resources, defaults to \"1\"\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      resource:\n                                        description: 'Required: resource to select'\n                                        type: string\n                                    required:\n                                    - resource\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                required:\n                                - path\n                                type: object\n                              type: array\n                          type: object\n                        emptyDir:\n                          description: |-\n                            emptyDir represents a temporary directory that shares a pod's lifetime.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                          properties:\n                            medium:\n                              description: |-\n                                medium represents what type of storage medium should back this directory.\n                                The default is \"\" which means to use the node's default medium.\n                                Must be an empty string (default) or Memory.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                              type: string\n                            sizeLimit:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                The size limit is also applicable for memory medium.\n                                The maximum usage on memory medium EmptyDir would be the minimum value between\n                                the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                The default is nil which means that the limit is undefined.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                          type: object\n                        ephemeral:\n                          description: |-\n                            ephemeral represents a volume that is handled by a cluster storage driver.\n                            The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                            and deleted when the pod is removed.\n\n\n                            Use this if:\n                            a) the volume is only needed while the pod runs,\n                            b) features of normal volumes like restoring from snapshot or capacity\n                               tracking are needed,\n                            c) the storage driver is specified through a storage class, and\n                            d) the storage driver supports dynamic volume provisioning through\n                               a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                               information on the connection between this volume type\n                               and PersistentVolumeClaim).\n\n\n                            Use PersistentVolumeClaim or one of the vendor-specific\n                            APIs for volumes that persist for longer than the lifecycle\n                            of an individual pod.\n\n\n                            Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                            be used that way - see the documentation of the driver for\n                            more information.\n\n\n                            A pod can use both types of ephemeral volumes and\n                            persistent volumes at the same time.\n                          properties:\n                            volumeClaimTemplate:\n                              description: |-\n                                Will be used to create a stand-alone PVC to provision the volume.\n                                The pod in which this EphemeralVolumeSource is embedded will be the\n                                owner of the PVC, i.e. the PVC will be deleted together with the\n                                pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                `<volume name>` is the name from the `PodSpec.Volumes` array\n                                entry. Pod validation will reject the pod if the concatenated name\n                                is not valid for a PVC (for example, too long).\n\n\n                                An existing PVC with that name that is not owned by the pod\n                                will *not* be used for the pod to avoid using an unrelated\n                                volume by mistake. Starting the pod is then blocked until\n                                the unrelated PVC is removed. If such a pre-created PVC is\n                                meant to be used by the pod, the PVC has to updated with an\n                                owner reference to the pod once the pod exists. Normally\n                                this should not be necessary, but it may be useful when\n                                manually reconstructing a broken cluster.\n\n\n                                This field is read-only and no changes will be made by Kubernetes\n                                to the PVC after it has been created.\n\n\n                                Required, must not be nil.\n                              properties:\n                                metadata:\n                                  description: |-\n                                    May contain labels and annotations that will be copied into the PVC\n                                    when creating it. No other fields are allowed and will be rejected during\n                                    validation.\n                                  properties:\n                                    annotations:\n                                      additionalProperties:\n                                        type: string\n                                      type: object\n                                    finalizers:\n                                      items:\n                                        type: string\n                                      type: array\n                                    labels:\n                                      additionalProperties:\n                                        type: string\n                                      type: object\n                                    name:\n                                      type: string\n                                    namespace:\n                                      type: string\n                                  type: object\n                                spec:\n                                  description: |-\n                                    The specification for the PersistentVolumeClaim. The entire content is\n                                    copied unchanged into the PVC that gets created from this\n                                    template. The same fields as in a PersistentVolumeClaim\n                                    are also valid here.\n                                  properties:\n                                    accessModes:\n                                      description: |-\n                                        accessModes contains the desired access modes the volume should have.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                      items:\n                                        type: string\n                                      type: array\n                                    dataSource:\n                                      description: |-\n                                        dataSource field can be used to specify either:\n                                        * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                        * An existing PVC (PersistentVolumeClaim)\n                                        If the provisioner or an external controller can support the specified data source,\n                                        it will create a new volume based on the contents of the specified data source.\n                                        When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                        and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                        If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                      properties:\n                                        apiGroup:\n                                          description: |-\n                                            APIGroup is the group for the resource being referenced.\n                                            If APIGroup is not specified, the specified Kind must be in the core API group.\n                                            For any other third-party types, APIGroup is required.\n                                          type: string\n                                        kind:\n                                          description: Kind is the type of resource\n                                            being referenced\n                                          type: string\n                                        name:\n                                          description: Name is the name of resource\n                                            being referenced\n                                          type: string\n                                      required:\n                                      - kind\n                                      - name\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    dataSourceRef:\n                                      description: |-\n                                        dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                        volume is desired. This may be any object from a non-empty API group (non\n                                        core object) or a PersistentVolumeClaim object.\n                                        When this field is specified, volume binding will only succeed if the type of\n                                        the specified object matches some installed volume populator or dynamic\n                                        provisioner.\n                                        This field will replace the functionality of the dataSource field and as such\n                                        if both fields are non-empty, they must have the same value. For backwards\n                                        compatibility, when namespace isn't specified in dataSourceRef,\n                                        both fields (dataSource and dataSourceRef) will be set to the same\n                                        value automatically if one of them is empty and the other is non-empty.\n                                        When namespace is specified in dataSourceRef,\n                                        dataSource isn't set to the same value and must be empty.\n                                        There are three important differences between dataSource and dataSourceRef:\n                                        * While dataSource only allows two specific types of objects, dataSourceRef\n                                          allows any non-core object, as well as PersistentVolumeClaim objects.\n                                        * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                          preserves all values, and generates an error if a disallowed value is\n                                          specified.\n                                        * While dataSource only allows local objects, dataSourceRef allows objects\n                                          in any namespaces.\n                                        (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                        (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                      properties:\n                                        apiGroup:\n                                          description: |-\n                                            APIGroup is the group for the resource being referenced.\n                                            If APIGroup is not specified, the specified Kind must be in the core API group.\n                                            For any other third-party types, APIGroup is required.\n                                          type: string\n                                        kind:\n                                          description: Kind is the type of resource\n                                            being referenced\n                                          type: string\n                                        name:\n                                          description: Name is the name of resource\n                                            being referenced\n                                          type: string\n                                        namespace:\n                                          description: |-\n                                            Namespace is the namespace of resource being referenced\n                                            Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                            (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                          type: string\n                                      required:\n                                      - kind\n                                      - name\n                                      type: object\n                                    resources:\n                                      description: |-\n                                        resources represents the minimum resources the volume should have.\n                                        If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                        that are lower than previous value but must still be higher than capacity recorded in the\n                                        status field of the claim.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                      properties:\n                                        limits:\n                                          additionalProperties:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          description: |-\n                                            Limits describes the maximum amount of compute resources allowed.\n                                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                          type: object\n                                        requests:\n                                          additionalProperties:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          description: |-\n                                            Requests describes the minimum amount of compute resources required.\n                                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                          type: object\n                                      type: object\n                                    selector:\n                                      description: selector is a label query over\n                                        volumes to consider for binding.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    storageClassName:\n                                      description: |-\n                                        storageClassName is the name of the StorageClass required by the claim.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                      type: string\n                                    volumeAttributesClassName:\n                                      description: |-\n                                        volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                        If specified, the CSI driver will create or update the volume with the attributes defined\n                                        in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                        it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                        will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                        If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                        will be set by the persistentvolume controller if it exists.\n                                        If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                        set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                        exists.\n                                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                        (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                      type: string\n                                    volumeMode:\n                                      description: |-\n                                        volumeMode defines what type of volume is required by the claim.\n                                        Value of Filesystem is implied when not included in claim spec.\n                                      type: string\n                                    volumeName:\n                                      description: volumeName is the binding reference\n                                        to the PersistentVolume backing this claim.\n                                      type: string\n                                  type: object\n                              required:\n                              - spec\n                              type: object\n                          type: object\n                        fc:\n                          description: fc represents a Fibre Channel resource that\n                            is attached to a kubelet's host machine and then exposed\n                            to the pod.\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            lun:\n                              description: 'lun is Optional: FC target lun number'\n                              format: int32\n                              type: integer\n                            readOnly:\n                              description: |-\n                                readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            targetWWNs:\n                              description: 'targetWWNs is Optional: FC target worldwide\n                                names (WWNs)'\n                              items:\n                                type: string\n                              type: array\n                            wwids:\n                              description: |-\n                                wwids Optional: FC volume world wide identifiers (wwids)\n                                Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                              items:\n                                type: string\n                              type: array\n                          type: object\n                        flexVolume:\n                          description: |-\n                            flexVolume represents a generic volume resource that is\n                            provisioned/attached using an exec based plugin.\n                          properties:\n                            driver:\n                              description: driver is the name of the driver to use\n                                for this volume.\n                              type: string\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                              type: string\n                            options:\n                              additionalProperties:\n                                type: string\n                              description: 'options is Optional: this field holds\n                                extra command options if any.'\n                              type: object\n                            readOnly:\n                              description: |-\n                                readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef is Optional: secretRef is reference to the secret object containing\n                                sensitive information to pass to the plugin scripts. This may be\n                                empty if no secret object is specified. If the secret object\n                                contains more than one secret, all secrets are passed to the plugin\n                                scripts.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                          required:\n                          - driver\n                          type: object\n                        flocker:\n                          description: flocker represents a Flocker volume attached\n                            to a kubelet's host machine. This depends on the Flocker\n                            control service being running\n                          properties:\n                            datasetName:\n                              description: |-\n                                datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                should be considered as deprecated\n                              type: string\n                            datasetUUID:\n                              description: datasetUUID is the UUID of the dataset.\n                                This is unique identifier of a Flocker dataset\n                              type: string\n                          type: object\n                        gcePersistentDisk:\n                          description: |-\n                            gcePersistentDisk represents a GCE Disk resource that is attached to a\n                            kubelet's host machine and then exposed to the pod.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is filesystem type of the volume that you want to mount.\n                                Tip: Ensure that the filesystem type is supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            partition:\n                              description: |-\n                                partition is the partition in the volume that you want to mount.\n                                If omitted, the default is to mount by volume name.\n                                Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                              format: int32\n                              type: integer\n                            pdName:\n                              description: |-\n                                pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the ReadOnly setting in VolumeMounts.\n                                Defaults to false.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                              type: boolean\n                          required:\n                          - pdName\n                          type: object\n                        gitRepo:\n                          description: |-\n                            gitRepo represents a git repository at a particular revision.\n                            DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                            EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                            into the Pod's container.\n                          properties:\n                            directory:\n                              description: |-\n                                directory is the target directory name.\n                                Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                the subdirectory with the given name.\n                              type: string\n                            repository:\n                              description: repository is the URL\n                              type: string\n                            revision:\n                              description: revision is the commit hash for the specified\n                                revision.\n                              type: string\n                          required:\n                          - repository\n                          type: object\n                        glusterfs:\n                          description: |-\n                            glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                            More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                          properties:\n                            endpoints:\n                              description: |-\n                                endpoints is the endpoint name that details Glusterfs topology.\n                                More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                              type: string\n                            path:\n                              description: |-\n                                path is the Glusterfs volume path.\n                                More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                Defaults to false.\n                                More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                              type: boolean\n                          required:\n                          - endpoints\n                          - path\n                          type: object\n                        hostPath:\n                          description: |-\n                            hostPath represents a pre-existing file or directory on the host\n                            machine that is directly exposed to the container. This is generally\n                            used for system agents or other privileged things that are allowed\n                            to see the host machine. Most containers will NOT need this.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                            ---\n                            TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                            mount host directories as read/write.\n                          properties:\n                            path:\n                              description: |-\n                                path of the directory on the host.\n                                If the path is a symlink, it will follow the link to the real path.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                              type: string\n                            type:\n                              description: |-\n                                type for HostPath Volume\n                                Defaults to \"\"\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                              type: string\n                          required:\n                          - path\n                          type: object\n                        iscsi:\n                          description: |-\n                            iscsi represents an ISCSI Disk resource that is attached to a\n                            kubelet's host machine and then exposed to the pod.\n                            More info: https://examples.k8s.io/volumes/iscsi/README.md\n                          properties:\n                            chapAuthDiscovery:\n                              description: chapAuthDiscovery defines whether support\n                                iSCSI Discovery CHAP authentication\n                              type: boolean\n                            chapAuthSession:\n                              description: chapAuthSession defines whether support\n                                iSCSI Session CHAP authentication\n                              type: boolean\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type of the volume that you want to mount.\n                                Tip: Ensure that the filesystem type is supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            initiatorName:\n                              description: |-\n                                initiatorName is the custom iSCSI Initiator Name.\n                                If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                <target portal>:<volume name> will be created for the connection.\n                              type: string\n                            iqn:\n                              description: iqn is the target iSCSI Qualified Name.\n                              type: string\n                            iscsiInterface:\n                              description: |-\n                                iscsiInterface is the interface Name that uses an iSCSI transport.\n                                Defaults to 'default' (tcp).\n                              type: string\n                            lun:\n                              description: lun represents iSCSI Target Lun number.\n                              format: int32\n                              type: integer\n                            portals:\n                              description: |-\n                                portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                is other than default (typically TCP ports 860 and 3260).\n                              items:\n                                type: string\n                              type: array\n                            readOnly:\n                              description: |-\n                                readOnly here will force the ReadOnly setting in VolumeMounts.\n                                Defaults to false.\n                              type: boolean\n                            secretRef:\n                              description: secretRef is the CHAP Secret for iSCSI\n                                target and initiator authentication\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            targetPortal:\n                              description: |-\n                                targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                is other than default (typically TCP ports 860 and 3260).\n                              type: string\n                          required:\n                          - iqn\n                          - lun\n                          - targetPortal\n                          type: object\n                        name:\n                          description: |-\n                            name of the volume.\n                            Must be a DNS_LABEL and unique within the pod.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                          type: string\n                        nfs:\n                          description: |-\n                            nfs represents an NFS mount on the host that shares a pod's lifetime\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                          properties:\n                            path:\n                              description: |-\n                                path that is exported by the NFS server.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the NFS export to be mounted with read-only permissions.\n                                Defaults to false.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                              type: boolean\n                            server:\n                              description: |-\n                                server is the hostname or IP address of the NFS server.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                              type: string\n                          required:\n                          - path\n                          - server\n                          type: object\n                        persistentVolumeClaim:\n                          description: |-\n                            persistentVolumeClaimVolumeSource represents a reference to a\n                            PersistentVolumeClaim in the same namespace.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                          properties:\n                            claimName:\n                              description: |-\n                                claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly Will force the ReadOnly setting in VolumeMounts.\n                                Default false.\n                              type: boolean\n                          required:\n                          - claimName\n                          type: object\n                        photonPersistentDisk:\n                          description: photonPersistentDisk represents a PhotonController\n                            persistent disk attached and mounted on kubelets host\n                            machine\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            pdID:\n                              description: pdID is the ID that identifies Photon Controller\n                                persistent disk\n                              type: string\n                          required:\n                          - pdID\n                          type: object\n                        portworxVolume:\n                          description: portworxVolume represents a portworx volume\n                            attached and mounted on kubelets host machine\n                          properties:\n                            fsType:\n                              description: |-\n                                fSType represents the filesystem type to mount\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            volumeID:\n                              description: volumeID uniquely identifies a Portworx\n                                volume\n                              type: string\n                          required:\n                          - volumeID\n                          type: object\n                        projected:\n                          description: projected items for all in one resources secrets,\n                            configmaps, and downward API\n                          properties:\n                            defaultMode:\n                              description: |-\n                                defaultMode are the mode bits used to set permissions on created files by default.\n                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                Directories within the path are not affected by this setting.\n                                This might be in conflict with other options that affect the file\n                                mode, like fsGroup, and the result can be other mode bits set.\n                              format: int32\n                              type: integer\n                            sources:\n                              description: sources is the list of volume projections\n                              items:\n                                description: Projection that may be projected along\n                                  with other supported volume types\n                                properties:\n                                  clusterTrustBundle:\n                                    description: |-\n                                      ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                      of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                      Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                      ClusterTrustBundle objects can either be selected by name, or by the\n                                      combination of signer name and a label selector.\n\n\n                                      Kubelet performs aggressive normalization of the PEM contents written\n                                      into the pod filesystem.  Esoteric PEM features such as inter-block\n                                      comments and block headers are stripped.  Certificates are deduplicated.\n                                      The ordering of certificates within the file is arbitrary, and Kubelet\n                                      may change the order over time.\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          Select all ClusterTrustBundles that match this label selector.  Only has\n                                          effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                          interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                          everything\".\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      name:\n                                        description: |-\n                                          Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                          with signerName and labelSelector.\n                                        type: string\n                                      optional:\n                                        description: |-\n                                          If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                          aren't available.  If using name, then the named ClusterTrustBundle is\n                                          allowed not to exist.  If using signerName, then the combination of\n                                          signerName and labelSelector is allowed to match zero\n                                          ClusterTrustBundles.\n                                        type: boolean\n                                      path:\n                                        description: Relative path from the volume\n                                          root to write the bundle.\n                                        type: string\n                                      signerName:\n                                        description: |-\n                                          Select all ClusterTrustBundles that match this signer name.\n                                          Mutually-exclusive with name.  The contents of all selected\n                                          ClusterTrustBundles will be unified and deduplicated.\n                                        type: string\n                                    required:\n                                    - path\n                                    type: object\n                                  configMap:\n                                    description: configMap information about the configMap\n                                      data to project\n                                    properties:\n                                      items:\n                                        description: |-\n                                          items if unspecified, each key-value pair in the Data field of the referenced\n                                          ConfigMap will be projected into the volume as a file whose name is the\n                                          key and content is the value. If specified, the listed keys will be\n                                          projected into the specified paths, and unlisted keys will not be\n                                          present. If a key is specified which is not present in the ConfigMap,\n                                          the volume setup will error unless it is marked optional. Paths must be\n                                          relative and may not contain the '..' path or start with '..'.\n                                        items:\n                                          description: Maps a string key to a path\n                                            within a volume.\n                                          properties:\n                                            key:\n                                              description: key is the key to project.\n                                              type: string\n                                            mode:\n                                              description: |-\n                                                mode is Optional: mode bits used to set permissions on this file.\n                                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the relative path of the file to map the key to.\n                                                May not be an absolute path.\n                                                May not contain the path element '..'.\n                                                May not start with the string '..'.\n                                              type: string\n                                          required:\n                                          - key\n                                          - path\n                                          type: object\n                                        type: array\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: optional specify whether the\n                                          ConfigMap or its keys must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  downwardAPI:\n                                    description: downwardAPI information about the\n                                      downwardAPI data to project\n                                    properties:\n                                      items:\n                                        description: Items is a list of DownwardAPIVolume\n                                          file\n                                        items:\n                                          description: DownwardAPIVolumeFile represents\n                                            information to create the file containing\n                                            the pod field\n                                          properties:\n                                            fieldRef:\n                                              description: 'Required: Selects a field\n                                                of the pod: only annotations, labels,\n                                                name and namespace are supported.'\n                                              properties:\n                                                apiVersion:\n                                                  description: Version of the schema\n                                                    the FieldPath is written in terms\n                                                    of, defaults to \"v1\".\n                                                  type: string\n                                                fieldPath:\n                                                  description: Path of the field to\n                                                    select in the specified API version.\n                                                  type: string\n                                              required:\n                                              - fieldPath\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            mode:\n                                              description: |-\n                                                Optional: mode bits used to set permissions on this file, must be an octal value\n                                                between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: 'Required: Path is  the\n                                                relative path name of the file to\n                                                be created. Must not be absolute or\n                                                contain the ''..'' path. Must be utf-8\n                                                encoded. The first item of the relative\n                                                path must not start with ''..'''\n                                              type: string\n                                            resourceFieldRef:\n                                              description: |-\n                                                Selects a resource of the container: only resources limits and requests\n                                                (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                              properties:\n                                                containerName:\n                                                  description: 'Container name: required\n                                                    for volumes, optional for env\n                                                    vars'\n                                                  type: string\n                                                divisor:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  description: Specifies the output\n                                                    format of the exposed resources,\n                                                    defaults to \"1\"\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                resource:\n                                                  description: 'Required: resource\n                                                    to select'\n                                                  type: string\n                                              required:\n                                              - resource\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                          required:\n                                          - path\n                                          type: object\n                                        type: array\n                                    type: object\n                                  secret:\n                                    description: secret information about the secret\n                                      data to project\n                                    properties:\n                                      items:\n                                        description: |-\n                                          items if unspecified, each key-value pair in the Data field of the referenced\n                                          Secret will be projected into the volume as a file whose name is the\n                                          key and content is the value. If specified, the listed keys will be\n                                          projected into the specified paths, and unlisted keys will not be\n                                          present. If a key is specified which is not present in the Secret,\n                                          the volume setup will error unless it is marked optional. Paths must be\n                                          relative and may not contain the '..' path or start with '..'.\n                                        items:\n                                          description: Maps a string key to a path\n                                            within a volume.\n                                          properties:\n                                            key:\n                                              description: key is the key to project.\n                                              type: string\n                                            mode:\n                                              description: |-\n                                                mode is Optional: mode bits used to set permissions on this file.\n                                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the relative path of the file to map the key to.\n                                                May not be an absolute path.\n                                                May not contain the path element '..'.\n                                                May not start with the string '..'.\n                                              type: string\n                                          required:\n                                          - key\n                                          - path\n                                          type: object\n                                        type: array\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: optional field specify whether\n                                          the Secret or its key must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  serviceAccountToken:\n                                    description: serviceAccountToken is information\n                                      about the serviceAccountToken data to project\n                                    properties:\n                                      audience:\n                                        description: |-\n                                          audience is the intended audience of the token. A recipient of a token\n                                          must identify itself with an identifier specified in the audience of the\n                                          token, and otherwise should reject the token. The audience defaults to the\n                                          identifier of the apiserver.\n                                        type: string\n                                      expirationSeconds:\n                                        description: |-\n                                          expirationSeconds is the requested duration of validity of the service\n                                          account token. As the token approaches expiration, the kubelet volume\n                                          plugin will proactively rotate the service account token. The kubelet will\n                                          start trying to rotate the token if the token is older than 80 percent of\n                                          its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                          and must be at least 10 minutes.\n                                        format: int64\n                                        type: integer\n                                      path:\n                                        description: |-\n                                          path is the path relative to the mount point of the file to project the\n                                          token into.\n                                        type: string\n                                    required:\n                                    - path\n                                    type: object\n                                type: object\n                              type: array\n                          type: object\n                        quobyte:\n                          description: quobyte represents a Quobyte mount on the host\n                            that shares a pod's lifetime\n                          properties:\n                            group:\n                              description: |-\n                                group to map volume access to\n                                Default is no group\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                Defaults to false.\n                              type: boolean\n                            registry:\n                              description: |-\n                                registry represents a single or multiple Quobyte Registry services\n                                specified as a string as host:port pair (multiple entries are separated with commas)\n                                which acts as the central registry for volumes\n                              type: string\n                            tenant:\n                              description: |-\n                                tenant owning the given Quobyte volume in the Backend\n                                Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                              type: string\n                            user:\n                              description: |-\n                                user to map volume access to\n                                Defaults to serivceaccount user\n                              type: string\n                            volume:\n                              description: volume is a string that references an already\n                                created Quobyte volume by name.\n                              type: string\n                          required:\n                          - registry\n                          - volume\n                          type: object\n                        rbd:\n                          description: |-\n                            rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type of the volume that you want to mount.\n                                Tip: Ensure that the filesystem type is supported by the host operating system.\n                                Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                TODO: how do we prevent errors in the filesystem from compromising the machine\n                              type: string\n                            image:\n                              description: |-\n                                image is the rados image name.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: string\n                            keyring:\n                              description: |-\n                                keyring is the path to key ring for RBDUser.\n                                Default is /etc/ceph/keyring.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: string\n                            monitors:\n                              description: |-\n                                monitors is a collection of Ceph monitors.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              items:\n                                type: string\n                              type: array\n                            pool:\n                              description: |-\n                                pool is the rados pool name.\n                                Default is rbd.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly here will force the ReadOnly setting in VolumeMounts.\n                                Defaults to false.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef is name of the authentication secret for RBDUser. If provided\n                                overrides keyring.\n                                Default is nil.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            user:\n                              description: |-\n                                user is the rados user name.\n                                Default is admin.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                              type: string\n                          required:\n                          - image\n                          - monitors\n                          type: object\n                        scaleIO:\n                          description: scaleIO represents a ScaleIO persistent volume\n                            attached and mounted on Kubernetes nodes.\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                Default is \"xfs\".\n                              type: string\n                            gateway:\n                              description: gateway is the host address of the ScaleIO\n                                API Gateway.\n                              type: string\n                            protectionDomain:\n                              description: protectionDomain is the name of the ScaleIO\n                                Protection Domain for the configured storage.\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly Defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef references to the secret for ScaleIO user and other\n                                sensitive information. If this is not provided, Login operation will fail.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            sslEnabled:\n                              description: sslEnabled Flag enable/disable SSL communication\n                                with Gateway, default false\n                              type: boolean\n                            storageMode:\n                              description: |-\n                                storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                Default is ThinProvisioned.\n                              type: string\n                            storagePool:\n                              description: storagePool is the ScaleIO Storage Pool\n                                associated with the protection domain.\n                              type: string\n                            system:\n                              description: system is the name of the storage system\n                                as configured in ScaleIO.\n                              type: string\n                            volumeName:\n                              description: |-\n                                volumeName is the name of a volume already created in the ScaleIO system\n                                that is associated with this volume source.\n                              type: string\n                          required:\n                          - gateway\n                          - secretRef\n                          - system\n                          type: object\n                        secret:\n                          description: |-\n                            secret represents a secret that should populate this volume.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                          properties:\n                            defaultMode:\n                              description: |-\n                                defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                YAML accepts both octal and decimal values, JSON requires decimal values\n                                for mode bits. Defaults to 0644.\n                                Directories within the path are not affected by this setting.\n                                This might be in conflict with other options that affect the file\n                                mode, like fsGroup, and the result can be other mode bits set.\n                              format: int32\n                              type: integer\n                            items:\n                              description: |-\n                                items If unspecified, each key-value pair in the Data field of the referenced\n                                Secret will be projected into the volume as a file whose name is the\n                                key and content is the value. If specified, the listed keys will be\n                                projected into the specified paths, and unlisted keys will not be\n                                present. If a key is specified which is not present in the Secret,\n                                the volume setup will error unless it is marked optional. Paths must be\n                                relative and may not contain the '..' path or start with '..'.\n                              items:\n                                description: Maps a string key to a path within a\n                                  volume.\n                                properties:\n                                  key:\n                                    description: key is the key to project.\n                                    type: string\n                                  mode:\n                                    description: |-\n                                      mode is Optional: mode bits used to set permissions on this file.\n                                      Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                      YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                      If not specified, the volume defaultMode will be used.\n                                      This might be in conflict with other options that affect the file\n                                      mode, like fsGroup, and the result can be other mode bits set.\n                                    format: int32\n                                    type: integer\n                                  path:\n                                    description: |-\n                                      path is the relative path of the file to map the key to.\n                                      May not be an absolute path.\n                                      May not contain the path element '..'.\n                                      May not start with the string '..'.\n                                    type: string\n                                required:\n                                - key\n                                - path\n                                type: object\n                              type: array\n                            optional:\n                              description: optional field specify whether the Secret\n                                or its keys must be defined\n                              type: boolean\n                            secretName:\n                              description: |-\n                                secretName is the name of the secret in the pod's namespace to use.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                              type: string\n                          type: object\n                        storageos:\n                          description: storageOS represents a StorageOS volume attached\n                            and mounted on Kubernetes nodes.\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is the filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            readOnly:\n                              description: |-\n                                readOnly defaults to false (read/write). ReadOnly here will force\n                                the ReadOnly setting in VolumeMounts.\n                              type: boolean\n                            secretRef:\n                              description: |-\n                                secretRef specifies the secret to use for obtaining the StorageOS API\n                                credentials.  If not specified, default values will be attempted.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            volumeName:\n                              description: |-\n                                volumeName is the human-readable name of the StorageOS volume.  Volume\n                                names are only unique within a namespace.\n                              type: string\n                            volumeNamespace:\n                              description: |-\n                                volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                namespace is specified then the Pod's namespace will be used.  This allows the\n                                Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                Set VolumeName to any name to override the default behaviour.\n                                Set to \"default\" if you are not using namespaces within StorageOS.\n                                Namespaces that do not pre-exist within StorageOS will be created.\n                              type: string\n                          type: object\n                        vsphereVolume:\n                          description: vsphereVolume represents a vSphere volume attached\n                            and mounted on kubelets host machine\n                          properties:\n                            fsType:\n                              description: |-\n                                fsType is filesystem type to mount.\n                                Must be a filesystem type supported by the host operating system.\n                                Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                              type: string\n                            storagePolicyID:\n                              description: storagePolicyID is the storage Policy Based\n                                Management (SPBM) profile ID associated with the StoragePolicyName.\n                              type: string\n                            storagePolicyName:\n                              description: storagePolicyName is the storage Policy\n                                Based Management (SPBM) profile name.\n                              type: string\n                            volumePath:\n                              description: volumePath is the path that identifies\n                                vSphere volume vmdk\n                              type: string\n                          required:\n                          - volumePath\n                          type: object\n                      required:\n                      - name\n                      type: object\n                    type: array\n                required:\n                - containers\n                type: object\n                x-kubernetes-preserve-unknown-fields: true\n              scripts:\n                description: |-\n                  Specifies groups of scripts, each provided via a ConfigMap, to be mounted as volumes in the container.\n                  These scripts can be executed during container startup or via specific actions.\n\n\n                  Each script group is encapsulated in a ComponentTemplateSpec that includes:\n\n\n                  - The ConfigMap containing the scripts.\n                  - The mount point where the scripts will be mounted inside the container.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    defaultMode:\n                      description: |-\n                        The operator attempts to set default file permissions for scripts (0555) and configurations (0444).\n                        However, certain database engines may require different file permissions.\n                        You can specify the desired file permissions here.\n\n\n                        Must be specified as an octal value between 0000 and 0777 (inclusive),\n                        or as a decimal value between 0 and 511 (inclusive).\n                        YAML supports both octal and decimal values for file permissions.\n\n\n                        Please note that this setting only affects the permissions of the files themselves.\n                        Directories within the specified path are not impacted by this setting.\n                        It's important to be aware that this setting might conflict with other options\n                        that influence the file mode, such as fsGroup.\n                        In such cases, the resulting file mode may have additional bits set.\n                        Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                      format: int32\n                      type: integer\n                    name:\n                      description: Specifies the name of the configuration template.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    namespace:\n                      default: default\n                      description: |-\n                        Specifies the namespace of the referenced configuration template ConfigMap object.\n                        An empty namespace is equivalent to the \"default\" namespace.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    templateRef:\n                      description: Specifies the name of the referenced configuration\n                        template ConfigMap object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    volumeName:\n                      description: |-\n                        Refers to the volume name of PodTemplate. The configuration file produced through the configuration\n                        template will be mounted to the corresponding volume. Must be a DNS_LABEL name.\n                        The volume name must be defined in podSpec.containers[*].volumeMounts.\n                      maxLength: 63\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              serviceKind:\n                description: |-\n                  Defines the type of well-known service protocol that the Component provides.\n                  It specifies the standard or widely recognized protocol used by the Component to offer its Services.\n\n\n                  The `serviceKind` field allows users to quickly identify the type of Service provided by the Component\n                  based on common protocols or service types. This information helps in understanding the compatibility,\n                  interoperability, and usage of the Component within a system.\n\n\n                  Some examples of well-known service protocols include:\n\n\n                  - \"MySQL\": Indicates that the Component provides a MySQL database service.\n                  - \"PostgreSQL\": Indicates that the Component offers a PostgreSQL database service.\n                  - \"Redis\": Signifies that the Component functions as a Redis key-value store.\n                  - \"ETCD\": Denotes that the Component serves as an ETCD distributed key-value store.\n\n\n                  The `serviceKind` value is case-insensitive, allowing for flexibility in specifying the protocol name.\n\n\n                  When specifying the `serviceKind`, consider the following guidelines:\n\n\n                  - Use well-established and widely recognized protocol names or service types.\n                  - Ensure that the `serviceKind` accurately represents the primary service type offered by the Component.\n                  - If the Component provides multiple services, choose the most prominent or commonly used protocol.\n                  - Limit the `serviceKind` to a maximum of 32 characters for conciseness and readability.\n\n\n                  Note: The `serviceKind` field is optional and can be left empty if the Component does not fit into a well-known\n                  service category or if the protocol is not widely recognized. It is primarily used to convey information about\n                  the Component's service type to users and facilitate discovery and integration.\n\n\n                  The `serviceKind` field is immutable and cannot be updated.\n                maxLength: 32\n                type: string\n              serviceRefDeclarations:\n                description: |-\n                  Lists external service dependencies of the Component, including services from other Clusters or outside the K8s environment.\n\n\n                  This field is immutable.\n                items:\n                  description: |-\n                    ServiceRefDeclaration represents a reference to a service that can be either provided by a KubeBlocks Cluster\n                    or an external service.\n                    It acts as a placeholder for the actual service reference, which is determined later when a Cluster is created.\n\n\n                    The purpose of ServiceRefDeclaration is to declare a service dependency without specifying the concrete details\n                    of the service.\n                    It allows for flexibility and abstraction in defining service references within a Component.\n                    By using ServiceRefDeclaration, you can define service dependencies in a declarative manner, enabling loose coupling\n                    and easier management of service references across different components and clusters.\n\n\n                    Upon Cluster creation, the ServiceRefDeclaration is bound to an actual service through the ServiceRef field,\n                    effectively resolving and connecting to the specified service.\n                  properties:\n                    name:\n                      description: Specifies the name of the ServiceRefDeclaration.\n                      type: string\n                    optional:\n                      description: |-\n                        Specifies whether the service reference can be optional.\n\n\n                        For an optional service-ref, the component can still be created even if the service-ref is not provided.\n                      type: boolean\n                    serviceRefDeclarationSpecs:\n                      description: |-\n                        Defines a list of constraints and requirements for services that can be bound to this ServiceRefDeclaration\n                        upon Cluster creation.\n                        Each ServiceRefDeclarationSpec defines a ServiceKind and ServiceVersion,\n                        outlining the acceptable service types and versions that are compatible.\n\n\n                        This flexibility allows a ServiceRefDeclaration to be fulfilled by any one of the provided specs.\n                        For example, if it requires an OLTP database, specs for both MySQL and PostgreSQL are listed,\n                        either MySQL or PostgreSQL services can be used when binding.\n                      items:\n                        properties:\n                          serviceKind:\n                            description: |-\n                              Specifies the type or nature of the service. This should be a well-known application cluster type, such as\n                              {mysql, redis, mongodb}.\n                              The field is case-insensitive and supports abbreviations for some well-known databases.\n                              For instance, both `zk` and `zookeeper` are considered as a ZooKeeper cluster, while `pg`, `postgres`, `postgresql`\n                              are all recognized as a PostgreSQL cluster.\n                            type: string\n                          serviceVersion:\n                            description: |-\n                              Defines the service version of the service reference. This is a regular expression that matches a version number pattern.\n                              For instance, `^8.0.8$`, `8.0.\\d{1,2}$`, `^[v\\-]*?(\\d{1,2}\\.){0,3}\\d{1,2}$` are all valid patterns.\n                            type: string\n                        required:\n                        - serviceKind\n                        - serviceVersion\n                        type: object\n                      type: array\n                  required:\n                  - name\n                  - serviceRefDeclarationSpecs\n                  type: object\n                type: array\n              serviceVersion:\n                description: |-\n                  Specifies the version of the Service provided by the Component.\n                  It follows the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n\n\n                  The Semantic Versioning specification defines a version number format of X.Y.Z (MAJOR.MINOR.PATCH), where:\n\n\n                  - X represents the major version and indicates incompatible API changes.\n                  - Y represents the minor version and indicates added functionality in a backward-compatible manner.\n                  - Z represents the patch version and indicates backward-compatible bug fixes.\n\n\n                  Additional labels for pre-release and build metadata are available as extensions to the X.Y.Z format:\n\n\n                  - Use pre-release labels (e.g., -alpha, -beta) for versions that are not yet stable or ready for production use.\n                  - Use build metadata (e.g., +build.1) for additional version information if needed.\n\n\n                  Examples of valid ServiceVersion values:\n\n\n                  - \"1.0.0\"\n                  - \"2.3.1\"\n                  - \"3.0.0-alpha.1\"\n                  - \"4.5.2+build.1\"\n\n\n                  The `serviceVersion` field is immutable and cannot be updated.\n                maxLength: 32\n                type: string\n              services:\n                description: |-\n                  Defines additional Services to expose the Component's endpoints.\n\n\n                  A default headless Service, named `{cluster.name}-{component.name}-headless`, is automatically created\n                  for internal Cluster communication.\n\n\n                  This field enables customization of additional Services to expose the Component's endpoints to\n                  other Components within the same or different Clusters, and to external applications.\n                  Each Service entry in this list can include properties such as ports, type, and selectors.\n\n\n                  - For intra-Cluster access, Components can reference Services using variables declared in\n                    `componentDefinition.spec.vars[*].valueFrom.serviceVarRef`.\n                  - For inter-Cluster access, reference Services use variables declared in\n                    `componentDefinition.spec.vars[*].valueFrom.serviceRefVarRef`,\n                    and bind Services at Cluster creation time with `clusterComponentSpec.ServiceRef[*].clusterServiceSelector`.\n\n\n                  This field is immutable.\n                items:\n                  description: |-\n                    ComponentService defines a service that would be exposed as an inter-component service within a Cluster.\n                    A Service defined in the ComponentService is expected to be accessed by other Components within the same Cluster.\n\n\n                    When a Component needs to use a ComponentService provided by another Component within the same Cluster,\n                    it can declare a variable in the `componentDefinition.spec.vars` section and bind it to the specific exposed address\n                    of the ComponentService using the `serviceVarRef` field.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        If ServiceType is LoadBalancer, cloud provider related parameters can be put here\n                        More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                      type: object\n                    disableAutoProvision:\n                      description: |-\n                        Indicates whether the automatic provisioning of the service should be disabled.\n\n\n                        If set to true, the service will not be automatically created at the component provisioning.\n                        Instead, you can enable the creation of this service by specifying it explicitly in the cluster API.\n                      type: boolean\n                    name:\n                      description: |-\n                        Name defines the name of the service.\n                        otherwise, it indicates the name of the service.\n                        Others can refer to this service by its name. (e.g., connection credential)\n                        Cannot be updated.\n                      maxLength: 25\n                      type: string\n                    podService:\n                      default: false\n                      description: |-\n                        Indicates whether to create a corresponding Service for each Pod of the selected Component.\n                        When set to true, a set of Services will be automatically generated for each Pod,\n                        and the `roleSelector` field will be ignored.\n\n\n                        The names of the generated Services will follow the same suffix naming pattern: `$(serviceName)-$(podOrdinal)`.\n                        The total number of generated Services will be equal to the number of replicas specified for the Component.\n\n\n                        Example usage:\n\n\n                        ```yaml\n                        name: my-service\n                        serviceName: my-service\n                        podService: true\n                        disableAutoProvision: true\n                        spec:\n                          type: NodePort\n                          ports:\n                          - name: http\n                            port: 80\n                            targetPort: 8080\n                        ```\n\n\n                        In this example, if the Component has 3 replicas, three Services will be generated:\n                        - my-service-0: Points to the first Pod (podOrdinal: 0)\n                        - my-service-1: Points to the second Pod (podOrdinal: 1)\n                        - my-service-2: Points to the third Pod (podOrdinal: 2)\n\n\n                        Each generated Service will have the specified spec configuration and will target its respective Pod.\n\n\n                        This feature is useful when you need to expose each Pod of a Component individually, allowing external access\n                        to specific instances of the Component.\n                      type: boolean\n                    roleSelector:\n                      description: \"Extends the above `serviceSpec.selector` by allowing\n                        you to specify defined role as selector for the service.\\nWhen\n                        `roleSelector` is set, it adds a label selector \\\"kubeblocks.io/role:\n                        {roleSelector}\\\"\\nto the `serviceSpec.selector`.\\nExample\n                        usage:\\n\\n\\n\\t  roleSelector: \\\"leader\\\"\\n\\n\\nIn this example,\n                        setting `roleSelector` to \\\"leader\\\" will add a label selector\\n\\\"kubeblocks.io/role:\n                        leader\\\" to the `serviceSpec.selector`.\\nThis means that the\n                        service will select and route traffic to Pods with the label\\n\\\"kubeblocks.io/role\\\"\n                        set to \\\"leader\\\".\\n\\n\\nNote that if `podService` sets to\n                        true, RoleSelector will be ignored.\\nThe `podService` flag\n                        takes precedence over `roleSelector` and generates a service\n                        for each Pod.\"\n                      type: string\n                    serviceName:\n                      description: |-\n                        ServiceName defines the name of the underlying service object.\n                        If not specified, the default service name with different patterns will be used:\n\n\n                        - CLUSTER_NAME: for cluster-level services\n                        - CLUSTER_NAME-COMPONENT_NAME: for component-level services\n\n\n                        Only one default service name is allowed.\n                        Cannot be updated.\n                      maxLength: 25\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    spec:\n                      description: |-\n                        Spec defines the behavior of a service.\n                        https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                      properties:\n                        allocateLoadBalancerNodePorts:\n                          description: |-\n                            allocateLoadBalancerNodePorts defines if NodePorts will be automatically\n                            allocated for services with type LoadBalancer.  Default is \"true\". It\n                            may be set to \"false\" if the cluster load-balancer does not rely on\n                            NodePorts.  If the caller requests specific NodePorts (by specifying a\n                            value), those requests will be respected, regardless of this field.\n                            This field may only be set for services with type LoadBalancer and will\n                            be cleared if the type is changed to any other type.\n                          type: boolean\n                        clusterIP:\n                          description: |-\n                            clusterIP is the IP address of the service and is usually assigned\n                            randomly. If an address is specified manually, is in-range (as per\n                            system configuration), and is not in use, it will be allocated to the\n                            service; otherwise creation of the service will fail. This field may not\n                            be changed through updates unless the type field is also being changed\n                            to ExternalName (which requires this field to be blank) or the type\n                            field is being changed from ExternalName (in which case this field may\n                            optionally be specified, as describe above).  Valid values are \"None\",\n                            empty string (\"\"), or a valid IP address. Setting this to \"None\" makes a\n                            \"headless service\" (no virtual IP), which is useful when direct endpoint\n                            connections are preferred and proxying is not required.  Only applies to\n                            types ClusterIP, NodePort, and LoadBalancer. If this field is specified\n                            when creating a Service of type ExternalName, creation will fail. This\n                            field will be wiped when updating a Service to type ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        clusterIPs:\n                          description: |-\n                            ClusterIPs is a list of IP addresses assigned to this service, and are\n                            usually assigned randomly.  If an address is specified manually, is\n                            in-range (as per system configuration), and is not in use, it will be\n                            allocated to the service; otherwise creation of the service will fail.\n                            This field may not be changed through updates unless the type field is\n                            also being changed to ExternalName (which requires this field to be\n                            empty) or the type field is being changed from ExternalName (in which\n                            case this field may optionally be specified, as describe above).  Valid\n                            values are \"None\", empty string (\"\"), or a valid IP address.  Setting\n                            this to \"None\" makes a \"headless service\" (no virtual IP), which is\n                            useful when direct endpoint connections are preferred and proxying is\n                            not required.  Only applies to types ClusterIP, NodePort, and\n                            LoadBalancer. If this field is specified when creating a Service of type\n                            ExternalName, creation will fail. This field will be wiped when updating\n                            a Service to type ExternalName.  If this field is not specified, it will\n                            be initialized from the clusterIP field.  If this field is specified,\n                            clients must ensure that clusterIPs[0] and clusterIP have the same\n                            value.\n\n\n                            This field may hold a maximum of two entries (dual-stack IPs, in either order).\n                            These IPs must correspond to the values of the ipFamilies field. Both\n                            clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        externalIPs:\n                          description: |-\n                            externalIPs is a list of IP addresses for which nodes in the cluster\n                            will also accept traffic for this service.  These IPs are not managed by\n                            Kubernetes.  The user is responsible for ensuring that traffic arrives\n                            at a node with this IP.  A common example is external load-balancers\n                            that are not part of the Kubernetes system.\n                          items:\n                            type: string\n                          type: array\n                        externalName:\n                          description: |-\n                            externalName is the external reference that discovery mechanisms will\n                            return as an alias for this service (e.g. a DNS CNAME record). No\n                            proxying will be involved.  Must be a lowercase RFC-1123 hostname\n                            (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".\n                          type: string\n                        externalTrafficPolicy:\n                          description: |-\n                            externalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on one of the Service's \"externally-facing\" addresses (NodePorts,\n                            ExternalIPs, and LoadBalancer IPs). If set to \"Local\", the proxy will configure\n                            the service in a way that assumes that external load balancers will take care\n                            of balancing the service traffic between nodes, and so each node will deliver\n                            traffic only to the node-local endpoints of the service, without masquerading\n                            the client source IP. (Traffic mistakenly sent to a node with no endpoints will\n                            be dropped.) The default value, \"Cluster\", uses the standard behavior of\n                            routing to all endpoints evenly (possibly modified by topology and other\n                            features). Note that traffic sent to an External IP or LoadBalancer IP from\n                            within the cluster will always get \"Cluster\" semantics, but clients sending to\n                            a NodePort from within the cluster may need to take traffic policy into account\n                            when picking a node.\n                          type: string\n                        healthCheckNodePort:\n                          description: |-\n                            healthCheckNodePort specifies the healthcheck nodePort for the service.\n                            This only applies when type is set to LoadBalancer and\n                            externalTrafficPolicy is set to Local. If a value is specified, is\n                            in-range, and is not in use, it will be used.  If not specified, a value\n                            will be automatically allocated.  External systems (e.g. load-balancers)\n                            can use this port to determine if a given node holds endpoints for this\n                            service or not.  If this field is specified when creating a Service\n                            which does not need it, creation will fail. This field will be wiped\n                            when updating a Service to no longer need it (e.g. changing type).\n                            This field cannot be updated once set.\n                          format: int32\n                          type: integer\n                        internalTrafficPolicy:\n                          description: |-\n                            InternalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on the ClusterIP. If set to \"Local\", the proxy will assume that pods\n                            only want to talk to endpoints of the service on the same node as the pod,\n                            dropping the traffic if there are no local endpoints. The default value,\n                            \"Cluster\", uses the standard behavior of routing to all endpoints evenly\n                            (possibly modified by topology and other features).\n                          type: string\n                        ipFamilies:\n                          description: |-\n                            IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this\n                            service. This field is usually assigned automatically based on cluster\n                            configuration and the ipFamilyPolicy field. If this field is specified\n                            manually, the requested family is available in the cluster,\n                            and ipFamilyPolicy allows it, it will be used; otherwise creation of\n                            the service will fail. This field is conditionally mutable: it allows\n                            for adding or removing a secondary IP family, but it does not allow\n                            changing the primary IP family of the Service. Valid values are \"IPv4\"\n                            and \"IPv6\".  This field only applies to Services of types ClusterIP,\n                            NodePort, and LoadBalancer, and does apply to \"headless\" services.\n                            This field will be wiped when updating a Service to type ExternalName.\n\n\n                            This field may hold a maximum of two entries (dual-stack families, in\n                            either order).  These families must correspond to the values of the\n                            clusterIPs field, if specified. Both clusterIPs and ipFamilies are\n                            governed by the ipFamilyPolicy field.\n                          items:\n                            description: |-\n                              IPFamily represents the IP Family (IPv4 or IPv6). This type is used\n                              to express the family of an IP expressed by a type (e.g. service.spec.ipFamilies).\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        ipFamilyPolicy:\n                          description: |-\n                            IPFamilyPolicy represents the dual-stack-ness requested or required by\n                            this Service. If there is no value provided, then this field will be set\n                            to SingleStack. Services can be \"SingleStack\" (a single IP family),\n                            \"PreferDualStack\" (two IP families on dual-stack configured clusters or\n                            a single IP family on single-stack clusters), or \"RequireDualStack\"\n                            (two IP families on dual-stack configured clusters, otherwise fail). The\n                            ipFamilies and clusterIPs fields depend on the value of this field. This\n                            field will be wiped when updating a service to type ExternalName.\n                          type: string\n                        loadBalancerClass:\n                          description: |-\n                            loadBalancerClass is the class of the load balancer implementation this Service belongs to.\n                            If specified, the value of this field must be a label-style identifier, with an optional prefix,\n                            e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users.\n                            This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load\n                            balancer implementation is used, today this is typically done through the cloud provider integration,\n                            but should apply for any default implementation. If set, it is assumed that a load balancer\n                            implementation is watching for Services with a matching class. Any default load balancer\n                            implementation (e.g. cloud providers) should ignore Services that set this field.\n                            This field can only be set when creating or updating a Service to type 'LoadBalancer'.\n                            Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.\n                          type: string\n                        loadBalancerIP:\n                          description: |-\n                            Only applies to Service Type: LoadBalancer.\n                            This feature depends on whether the underlying cloud-provider supports specifying\n                            the loadBalancerIP when a load balancer is created.\n                            This field will be ignored if the cloud-provider does not support the feature.\n                            Deprecated: This field was under-specified and its meaning varies across implementations.\n                            Using it is non-portable and it may not support dual-stack.\n                            Users are encouraged to use implementation-specific annotations when available.\n                          type: string\n                        loadBalancerSourceRanges:\n                          description: |-\n                            If specified and supported by the platform, this will restrict traffic through the cloud-provider\n                            load-balancer will be restricted to the specified client IPs. This field will be ignored if the\n                            cloud-provider does not support the feature.\"\n                            More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/\n                          items:\n                            type: string\n                          type: array\n                        ports:\n                          description: |-\n                            The list of ports that are exposed by this service.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            description: ServicePort contains information on service's\n                              port.\n                            properties:\n                              appProtocol:\n                                description: |-\n                                  The application protocol for this port.\n                                  This is used as a hint for implementations to offer richer behavior for protocols that they understand.\n                                  This field follows standard Kubernetes label syntax.\n                                  Valid values are either:\n\n\n                                  * Un-prefixed protocol names - reserved for IANA standard service names (as per\n                                  RFC-6335 and https://www.iana.org/assignments/service-names).\n\n\n                                  * Kubernetes-defined prefixed names:\n                                    * 'kubernetes.io/h2c' - HTTP/2 prior knowledge over cleartext as described in https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior-\n                                    * 'kubernetes.io/ws'  - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n                                    * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n\n                                  * Other protocols should use implementation-defined prefixed names such as\n                                  mycompany.com/my-custom-protocol.\n                                type: string\n                              name:\n                                description: |-\n                                  The name of this port within the service. This must be a DNS_LABEL.\n                                  All ports within a ServiceSpec must have unique names. When considering\n                                  the endpoints for a Service, this must match the 'name' field in the\n                                  EndpointPort.\n                                  Optional if only one ServicePort is defined on this service.\n                                type: string\n                              nodePort:\n                                description: |-\n                                  The port on each node on which this service is exposed when type is\n                                  NodePort or LoadBalancer.  Usually assigned by the system. If a value is\n                                  specified, in-range, and not in use it will be used, otherwise the\n                                  operation will fail.  If not specified, a port will be allocated if this\n                                  Service requires one.  If this field is specified when creating a\n                                  Service which does not need it, creation will fail. This field will be\n                                  wiped when updating a Service to no longer need it (e.g. changing type\n                                  from NodePort to ClusterIP).\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n                                format: int32\n                                type: integer\n                              port:\n                                description: The port that will be exposed by this\n                                  service.\n                                format: int32\n                                type: integer\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\".\n                                  Default is TCP.\n                                type: string\n                              targetPort:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Number or name of the port to access on the pods targeted by the service.\n                                  Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.\n                                  If this is a string, it will be looked up as a named port in the\n                                  target Pod's container ports. If this is not specified, the value\n                                  of the 'port' field is used (an identity map).\n                                  This field is ignored for services with clusterIP=None, and should be\n                                  omitted or set equal to the 'port' field.\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service\n                                x-kubernetes-int-or-string: true\n                            required:\n                            - port\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - port\n                          - protocol\n                          x-kubernetes-list-type: map\n                        publishNotReadyAddresses:\n                          description: |-\n                            publishNotReadyAddresses indicates that any agent which deals with endpoints for this\n                            Service should disregard any indications of ready/not-ready.\n                            The primary use case for setting this field is for a StatefulSet's Headless Service to\n                            propagate SRV DNS records for its Pods for the purpose of peer discovery.\n                            The Kubernetes controllers that generate Endpoints and EndpointSlice resources for\n                            Services interpret this to mean that all endpoints are considered \"ready\" even if the\n                            Pods themselves are not. Agents which consume only Kubernetes generated endpoints\n                            through the Endpoints or EndpointSlice resources can safely assume this behavior.\n                          type: boolean\n                        selector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            Route service traffic to pods with label keys and values matching this\n                            selector. If empty or not present, the service is assumed to have an\n                            external process managing its endpoints, which Kubernetes will not\n                            modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.\n                            Ignored if type is ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        sessionAffinity:\n                          description: |-\n                            Supports \"ClientIP\" and \"None\". Used to maintain session affinity.\n                            Enable client IP based session affinity.\n                            Must be ClientIP or None.\n                            Defaults to None.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        sessionAffinityConfig:\n                          description: sessionAffinityConfig contains the configurations\n                            of session affinity.\n                          properties:\n                            clientIP:\n                              description: clientIP contains the configurations of\n                                Client IP based session affinity.\n                              properties:\n                                timeoutSeconds:\n                                  description: |-\n                                    timeoutSeconds specifies the seconds of ClientIP type session sticky time.\n                                    The value must be >0 && <=86400(for 1 day) if ServiceAffinity == \"ClientIP\".\n                                    Default value is 10800(for 3 hours).\n                                  format: int32\n                                  type: integer\n                              type: object\n                          type: object\n                        type:\n                          description: |-\n                            type determines how the Service is exposed. Defaults to ClusterIP. Valid\n                            options are ExternalName, ClusterIP, NodePort, and LoadBalancer.\n                            \"ClusterIP\" allocates a cluster-internal IP address for load-balancing\n                            to endpoints. Endpoints are determined by the selector or if that is not\n                            specified, by manual construction of an Endpoints object or\n                            EndpointSlice objects. If clusterIP is \"None\", no virtual IP is\n                            allocated and the endpoints are published as a set of endpoints rather\n                            than a virtual IP.\n                            \"NodePort\" builds on ClusterIP and allocates a port on every node which\n                            routes to the same endpoints as the clusterIP.\n                            \"LoadBalancer\" builds on NodePort and creates an external load-balancer\n                            (if supported in the current cloud) which routes to the same endpoints\n                            as the clusterIP.\n                            \"ExternalName\" aliases this service to the specified externalName.\n                            Several other fields do not apply to ExternalName services.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types\n                          type: string\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              systemAccounts:\n                description: |-\n                  An array of `SystemAccount` objects that define the system accounts needed\n                  for the management operations of the Component.\n\n\n                  Each `SystemAccount` includes:\n\n\n                  - Account name.\n                  - The SQL statement template: Used to create the system account.\n                  - Password Source: Either generated based on certain rules or retrieved from a Secret.\n\n\n                   Use cases for system accounts typically involve tasks like system initialization, backups, monitoring,\n                   health checks, replication, and other system-level operations.\n\n\n                  System accounts are distinct from user accounts, although both are database accounts.\n\n\n                  - **System Accounts**: Created during Cluster setup by the KubeBlocks operator,\n                    these accounts have higher privileges for system management and are fully managed\n                    through a declarative API by the operator.\n                  - **User Accounts**: Managed by users or administrator.\n                    User account permissions should follow the principle of least privilege,\n                    granting only the necessary access rights to complete their required tasks.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    initAccount:\n                      default: false\n                      description: |-\n                        Indicates if this account is a system initialization account (e.g., MySQL root).\n\n\n                        This field is immutable once set.\n                      type: boolean\n                    name:\n                      description: |-\n                        Specifies the unique identifier for the account. This name is used by other entities to reference the account.\n\n\n                        This field is immutable once set.\n                      type: string\n                    passwordGenerationPolicy:\n                      description: |-\n                        Specifies the policy for generating the account's password.\n\n\n                        This field is immutable once set.\n                      properties:\n                        length:\n                          default: 16\n                          description: The length of the password.\n                          format: int32\n                          maximum: 32\n                          minimum: 8\n                          type: integer\n                        letterCase:\n                          default: MixedCases\n                          description: The case of the letters in the password.\n                          enum:\n                          - LowerCases\n                          - UpperCases\n                          - MixedCases\n                          type: string\n                        numDigits:\n                          default: 4\n                          description: The number of digits in the password.\n                          format: int32\n                          maximum: 8\n                          minimum: 0\n                          type: integer\n                        numSymbols:\n                          default: 0\n                          description: The number of symbols in the password.\n                          format: int32\n                          maximum: 8\n                          minimum: 0\n                          type: integer\n                        seed:\n                          description: |-\n                            Seed to generate the account's password.\n                            Cannot be updated.\n                          type: string\n                      type: object\n                    secretRef:\n                      description: |-\n                        Refers to the secret from which data will be copied to create the new account.\n\n\n                        This field is immutable once set.\n                      properties:\n                        name:\n                          description: The unique identifier of the secret.\n                          type: string\n                        namespace:\n                          description: The namespace where the secret is located.\n                          type: string\n                      required:\n                      - name\n                      - namespace\n                      type: object\n                    statement:\n                      description: |-\n                        Defines the statement used to create the account with the necessary privileges.\n\n\n                        This field is immutable once set.\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n              updateStrategy:\n                default: Serial\n                description: \"Specifies the concurrency strategy for updating multiple\n                  instances of the Component.\\nAvailable strategies:\\n\\n\\n- `Serial`:\n                  Updates replicas one at a time, ensuring minimal downtime by waiting\n                  for each replica to become ready\\n  before updating the next.\\n-\n                  `Parallel`: Updates all replicas simultaneously, optimizing for\n                  speed but potentially reducing availability\\n  during the update.\\n-\n                  `BestEffortParallel`: Updates replicas concurrently with a limit\n                  on simultaneous updates to ensure a minimum\\n  number of operational\n                  replicas for maintaining quorum.\\n\\t For example, in a 5-replica\n                  component, updating a maximum of 2 replicas simultaneously keeps\\n\\t\n                  at least 3 operational for quorum.\\n\\n\\nThis field is immutable\n                  and defaults to 'Serial'.\"\n                enum:\n                - Serial\n                - BestEffortParallel\n                - Parallel\n                type: string\n              vars:\n                description: |-\n                  Defines variables which are determined after Cluster instantiation and reflect\n                  dynamic or runtime attributes of instantiated Clusters.\n                  These variables serve as placeholders for setting environment variables in Pods and Actions,\n                  or for rendering configuration and script templates before actual values are finalized.\n\n\n                  These variables are placed in front of the environment variables declared in the Pod if used as\n                  environment variables.\n\n\n                  Variable values can be sourced from:\n\n\n                  - ConfigMap: Select and extract a value from a specific key within a ConfigMap.\n                  - Secret: Select and extract a value from a specific key within a Secret.\n                  - HostNetwork: Retrieves values (including ports) from host-network resources.\n                  - Service: Retrieves values (including address, port, NodePort) from a selected Service.\n                    Intended to obtain the address of a ComponentService within the same Cluster.\n                  - Credential: Retrieves account name and password from a SystemAccount variable.\n                  - ServiceRef: Retrieves address, port, account name and password from a selected ServiceRefDeclaration.\n                    Designed to obtain the address bound to a ServiceRef, such as a ClusterService or\n                    ComponentService of another cluster or an external service.\n                  - Component: Retrieves values from a selected Component, including replicas and instance name list.\n\n\n                  This field is immutable.\n                items:\n                  description: EnvVar represents a variable present in the env of\n                    Pod/Action or the template of config/script.\n                  properties:\n                    expression:\n                      description: |-\n                        A Go template expression that will be applied to the resolved value of the var.\n\n\n                        The expression will only be evaluated if the var is successfully resolved to a non-credential value.\n\n\n                        The resolved value can be accessed by its name within the expression, system vars and other user-defined\n                        non-credential vars can be used within the expression in the same way.\n                        Notice that, when accessing vars by its name, you should replace all the \"-\" in the name with \"_\", because of\n                        that \"-\" is not a valid identifier in Go.\n\n\n                        All expressions are evaluated in the order the vars are defined. If a var depends on any vars that also\n                        have expressions defined, be careful about the evaluation order as it may use intermediate values.\n\n\n                        The result of evaluation will be used as the final value of the var. If the expression fails to evaluate,\n                        the resolving of var will also be considered failed.\n                      type: string\n                    name:\n                      description: Name of the variable. Must be a C_IDENTIFIER.\n                      type: string\n                    value:\n                      description: |-\n                        Variable references `$(VAR_NAME)` are expanded using the previously defined variables in the current context.\n\n\n                        If a variable cannot be resolved, the reference in the input string will be unchanged.\n                        Double `$$` are reduced to a single `$`, which allows for escaping the `$(VAR_NAME)` syntax: i.e.\n\n\n                        - `$$(VAR_NAME)` will produce the string literal `$(VAR_NAME)`.\n\n\n                        Escaped references will never be expanded, regardless of whether the variable exists or not.\n                        Defaults to \"\".\n                      type: string\n                    valueFrom:\n                      description: Source for the variable's value. Cannot be used\n                        if value is not empty.\n                      properties:\n                        componentVarRef:\n                          description: Selects a defined var of a Component.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            componentName:\n                              description: Reference to the name of the Component\n                                object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            instanceNames:\n                              description: |-\n                                Reference to the pod name list of the component.\n                                and the value will be presented in the following format: name1,name2,...\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            podFQDNs:\n                              description: |-\n                                Reference to the pod FQDN list of the component.\n                                The value will be presented in the following format: FQDN1,FQDN2,...\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            replicas:\n                              description: Reference to the replicas of the component.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        configMapKeyRef:\n                          description: Selects a key of a ConfigMap.\n                          properties:\n                            key:\n                              description: The key to select.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the ConfigMap or its key\n                                must be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        credentialVarRef:\n                          description: Selects a defined var of a Credential (SystemAccount).\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            password:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            username:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        hostNetworkVarRef:\n                          description: Selects a defined var of host-network resources.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            container:\n                              description: ContainerVars defines the vars that can\n                                be referenced from a Container.\n                              properties:\n                                name:\n                                  description: The name of the container.\n                                  type: string\n                                port:\n                                  description: Container port to reference.\n                                  properties:\n                                    name:\n                                      type: string\n                                    option:\n                                      description: VarOption defines whether a variable\n                                        is required or optional.\n                                      enum:\n                                      - Required\n                                      - Optional\n                                      type: string\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                          type: object\n                        secretKeyRef:\n                          description: Selects a key of a Secret.\n                          properties:\n                            key:\n                              description: The key of the secret to select from.  Must\n                                be a valid secret key.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the Secret or its key must\n                                be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        serviceRefVarRef:\n                          description: Selects a defined var of a ServiceRef.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            endpoint:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            host:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            password:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            port:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            username:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        serviceVarRef:\n                          description: Selects a defined var of a Service.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            host:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            loadBalancer:\n                              description: |-\n                                LoadBalancer represents the LoadBalancer ingress point of the service.\n\n\n                                If multiple ingress points are available, the first one will be used automatically, choosing between IP and Hostname.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            port:\n                              description: |-\n                                Port references a port or node-port defined in the service.\n\n\n                                If the referenced service is a pod-service, there will be multiple service objects matched,\n                                and the value will be presented in the following format: service1.name:port1,service2.name:port2...\n                              properties:\n                                name:\n                                  type: string\n                                option:\n                                  description: VarOption defines whether a variable\n                                    is required or optional.\n                                  enum:\n                                  - Required\n                                  - Optional\n                                  type: string\n                              type: object\n                          type: object\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              volumes:\n                description: |-\n                  Defines the volumes used by the Component and some static attributes of the volumes.\n                  After defining the volumes here, user can reference them in the\n                  `cluster.spec.componentSpecs[*].volumeClaimTemplates` field to configure dynamic properties such as\n                  volume capacity and storage class.\n\n\n                  This field allows you to specify the following:\n\n\n                  - Snapshot behavior: Determines whether a snapshot of the volume should be taken when performing\n                    a snapshot backup of the Component.\n                  - Disk high watermark: Sets the high watermark for the volume's disk usage.\n                    When the disk usage reaches the specified threshold, it triggers an alert or action.\n\n\n                  By configuring these volume behaviors, you can control how the volumes are managed and monitored within the Component.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    highWatermark:\n                      default: 0\n                      description: |-\n                        Sets the critical threshold for volume space utilization as a percentage (0-100).\n\n\n                        Exceeding this percentage triggers the system to switch the volume to read-only mode as specified in\n                        `componentDefinition.spec.lifecycleActions.readOnly`.\n                        This precaution helps prevent space depletion while maintaining read-only access.\n                        If the space utilization later falls below this threshold, the system reverts the volume to read-write mode\n                        as defined in `componentDefinition.spec.lifecycleActions.readWrite`, restoring full functionality.\n\n\n                        Note: This field cannot be updated.\n                      maximum: 100\n                      minimum: 0\n                      type: integer\n                    name:\n                      description: |-\n                        Specifies the name of the volume.\n                        It must be a DNS_LABEL and unique within the pod.\n                        More info can be found at: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                        Note: This field cannot be updated.\n                      type: string\n                    needSnapshot:\n                      default: false\n                      description: |-\n                        Specifies whether the creation of a snapshot of this volume is necessary when performing a backup of the Component.\n\n\n                        Note: This field cannot be updated.\n                      type: boolean\n                  required:\n                  - name\n                  type: object\n                type: array\n            required:\n            - runtime\n            type: object\n          status:\n            description: ComponentDefinitionStatus defines the observed state of ComponentDefinition.\n            properties:\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: Refers to the most recent generation that has been observed\n                  for the ComponentDefinition.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Represents the current status of the ComponentDefinition. Valid values include ``, `Available`, and `Unavailable`.\n                  When the status is `Available`, the ComponentDefinition is ready and can be utilized by related objects.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: false\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: components.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: Component\n    listKind: ComponentList\n    plural: components\n    shortNames:\n    - cmp\n    singular: component\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - description: component definition\n      jsonPath: .spec.compDef\n      name: DEFINITION\n      type: string\n    - description: service version\n      jsonPath: .spec.serviceVersion\n      name: SERVICE-VERSION\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          Component is a fundamental building block of a Cluster object.\n          For example, a Redis Cluster can include Components like 'redis', 'sentinel', and potentially a proxy like 'twemproxy'.\n\n\n          The Component object is responsible for managing the lifecycle of all replicas within a Cluster component,\n          It supports a wide range of operations including provisioning, stopping, restarting, termination, upgrading,\n          configuration changes, vertical and horizontal scaling, failover, switchover, cross-node migration,\n          scheduling configuration, exposing Services, managing system accounts, enabling/disabling exporter,\n          and configuring log collection.\n\n\n          Component is an internal sub-object derived from the user-submitted Cluster object.\n          It is designed primarily to be used by the KubeBlocks controllers,\n          users are discouraged from modifying Component objects directly and should use them only for monitoring Component statuses.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ComponentSpec defines the desired state of Component\n            properties:\n              annotations:\n                additionalProperties:\n                  type: string\n                description: Specifies Annotations to override or add for underlying\n                  Pods, PVCs, Account & TLS Secrets, Services Owned by Component.\n                type: object\n              compDef:\n                description: Specifies the name of the referenced ComponentDefinition.\n                maxLength: 64\n                type: string\n              configs:\n                description: Specifies the configuration content of a config template.\n                items:\n                  description: ClusterComponentConfig represents a configuration for\n                    a component.\n                  properties:\n                    configMap:\n                      description: ConfigMap source for the config.\n                      properties:\n                        defaultMode:\n                          description: |-\n                            defaultMode is optional: mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                            Defaults to 0644.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        items:\n                          description: |-\n                            items if unspecified, each key-value pair in the Data field of the referenced\n                            ConfigMap will be projected into the volume as a file whose name is the\n                            key and content is the value. If specified, the listed keys will be\n                            projected into the specified paths, and unlisted keys will not be\n                            present. If a key is specified which is not present in the ConfigMap,\n                            the volume setup will error unless it is marked optional. Paths must be\n                            relative and may not contain the '..' path or start with '..'.\n                          items:\n                            description: Maps a string key to a path within a volume.\n                            properties:\n                              key:\n                                description: key is the key to project.\n                                type: string\n                              mode:\n                                description: |-\n                                  mode is Optional: mode bits used to set permissions on this file.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  If not specified, the volume defaultMode will be used.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              path:\n                                description: |-\n                                  path is the relative path of the file to map the key to.\n                                  May not be an absolute path.\n                                  May not contain the path element '..'.\n                                  May not start with the string '..'.\n                                type: string\n                            required:\n                            - key\n                            - path\n                            type: object\n                          type: array\n                        name:\n                          description: |-\n                            Name of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            TODO: Add other useful fields. apiVersion, kind, uid?\n                          type: string\n                        optional:\n                          description: optional specify whether the ConfigMap or its\n                            keys must be defined\n                          type: boolean\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    externalManaged:\n                      description: |-\n                        ExternalManaged indicates whether the configuration is managed by an external system.\n                        When set to true, the controller will use the user-provided template and reconfigure action,\n                        ignoring the default template and update behavior.\n                      type: boolean\n                    name:\n                      description: The name of the config.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    reconfigure:\n                      description: |-\n                        The custom reconfigure action to reload the service configuration whenever changes to this config are detected.\n\n\n                        The container executing this action has access to following variables:\n\n\n                        - KB_CONFIG_FILES_CREATED: file1,file2...\n                        - KB_CONFIG_FILES_REMOVED: file1,file2...\n                        - KB_CONFIG_FILES_UPDATED: file1:checksum1,file2:checksum2...\n\n\n                        Note: This field is immutable once it has been set.\n                      properties:\n                        exec:\n                          description: |-\n                            Defines the command to run.\n\n\n                            This field cannot be updated.\n                          properties:\n                            args:\n                              description: Args represents the arguments that are\n                                passed to the `command` for execution.\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: |-\n                                Specifies the command to be executed inside the container.\n                                The working directory for this command is the container's root directory('/').\n                                Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                If the shell is required, it must be explicitly invoked in the command.\n\n\n                                A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                              items:\n                                type: string\n                              type: array\n                            container:\n                              description: |-\n                                Specifies the name of the container within the same pod whose resources will be shared with the action.\n                                This allows the action to utilize the specified container's resources without executing within it.\n\n\n                                The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                                The resources that can be shared are included:\n\n\n                                - volume mounts\n\n\n                                This field cannot be updated.\n                              type: string\n                            env:\n                              description: |-\n                                Represents a list of environment variables that will be injected into the container.\n                                These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                                This field cannot be updated.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            image:\n                              description: |-\n                                Specifies the container image to be used for running the Action.\n\n\n                                When specified, a dedicated container will be created using this image to execute the Action.\n                                All actions with same image will share the same container.\n\n\n                                This field cannot be updated.\n                              type: string\n                            matchingKey:\n                              description: |-\n                                Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                                The impact of this field depends on the `targetPodSelector` value:\n\n\n                                - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                                - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                  will be selected for the Action.\n\n\n                                This field cannot be updated.\n                              type: string\n                            targetPodSelector:\n                              description: |-\n                                Defines the criteria used to select the target Pod(s) for executing the Action.\n                                This is useful when there is no default target replica identified.\n                                It allows for precise control over which Pod(s) the Action should run in.\n\n\n                                If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                                to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                                post-provision or pre-terminate of the component.\n\n\n                                This field cannot be updated.\n                              enum:\n                              - Any\n                              - All\n                              - Role\n                              - Ordinal\n                              type: string\n                          type: object\n                        grpc:\n                          description: |-\n                            Defines the gRPC call to issue.\n\n\n                            This field cannot be updated.\n                          properties:\n                            host:\n                              description: |-\n                                The target host to connect to.\n                                Defaults to \"127.0.0.1\" if not specified.\n                              type: string\n                            method:\n                              description: Name of the method to invoke on the gRPC\n                                service.\n                              type: string\n                            port:\n                              description: |-\n                                The port to access on the host.\n                                It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                              type: string\n                            request:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                Request payload for the gRPC method.\n\n\n                                Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                                Templates are rendered with predefined action variables before the request is sent.\n                              type: object\n                            response:\n                              description: Required response schema for the gRPC method.\n                              properties:\n                                message:\n                                  description: |-\n                                    Name of the field in the response whose value should be output.\n                                    Printed to stdout on success, or stderr on failure.\n                                  type: string\n                                status:\n                                  description: |-\n                                    Name of the string field in the response that carries status information.\n                                    If non-empty, the action fails.\n                                  type: string\n                              type: object\n                            service:\n                              description: Fully-qualified name of the gRPC service\n                                to call.\n                              type: string\n                          required:\n                          - method\n                          - port\n                          - service\n                          type: object\n                        http:\n                          description: |-\n                            Defines the HTTP request to perform.\n\n\n                            This field cannot be updated.\n                          properties:\n                            body:\n                              description: |-\n                                Optional HTTP request body.\n\n\n                                Supports Go text/template syntax; rendered with predefined variables before sending.\n                              type: string\n                            headers:\n                              description: |-\n                                Custom headers to set in the request.\n                                Header values may use Go text/template syntax, rendered with predefined variables.\n                              items:\n                                description: HTTPHeader represents a single HTTP header\n                                  key/value pair.\n                                properties:\n                                  name:\n                                    description: Name of the header field.\n                                    type: string\n                                  value:\n                                    description: Value of the header field.\n                                    type: string\n                                required:\n                                - name\n                                - value\n                                type: object\n                              type: array\n                            host:\n                              description: |-\n                                The target host to connect to.\n                                Defaults to \"127.0.0.1\" if not specified.\n                              type: string\n                            method:\n                              default: GET\n                              description: |-\n                                The HTTP method to use.\n                                Defaults to \"GET\".\n                              enum:\n                              - GET\n                              - POST\n                              - PUT\n                              - DELETE\n                              - HEAD\n                              - PATCH\n                              type: string\n                            path:\n                              default: /\n                              description: |-\n                                The path to request on the HTTP server.\n                                Defaults to \"/\" if not specified.\n                              pattern: ^/.*\n                              type: string\n                            port:\n                              description: |-\n                                The port to access on the host.\n                                It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                              type: string\n                            scheme:\n                              default: HTTP\n                              description: |-\n                                The scheme to use for connecting to the host.\n                                Defaults to \"HTTP\".\n                              enum:\n                              - HTTP\n                              - HTTPS\n                              type: string\n                          required:\n                          - port\n                          type: object\n                        matchingKey:\n                          description: |-\n                            Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                            The impact of this field depends on the `targetPodSelector` value:\n\n\n                            - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                            - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                              will be selected for the Action.\n\n\n                            This field cannot be updated.\n                          type: string\n                        preCondition:\n                          description: |-\n                            Specifies the state that the cluster must reach before the Action is executed.\n                            Currently, this is only applicable to the `postProvision` action.\n\n\n                            The conditions are as follows:\n\n\n                            - `Immediately`: Executed right after the Component object is created.\n                              The readiness of the Component and its resources is not guaranteed at this stage.\n                            - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                              runtime resources (e.g. Pods) are in a ready state.\n                            - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                              This process does not affect the readiness state of the Component or the Cluster.\n                            - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                              This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                            This field cannot be updated.\n                          type: string\n                        retryPolicy:\n                          description: |-\n                            Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                            It specifies the conditions under which the Action should be retried and the limits to apply,\n                            such as the maximum number of retries and backoff strategy.\n\n\n                            This field cannot be updated.\n                          properties:\n                            maxRetries:\n                              default: 0\n                              description: |-\n                                Defines the maximum number of retry attempts that should be made for a given Action.\n                                This value is set to 0 by default, indicating that no retries will be made.\n                              type: integer\n                            retryInterval:\n                              default: 0\n                              description: |-\n                                Indicates the duration of time to wait between each retry attempt.\n                                This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                              format: int64\n                              type: integer\n                          type: object\n                        targetPodSelector:\n                          description: |-\n                            Defines the criteria used to select the target Pod(s) for executing the Action.\n                            This is useful when there is no default target replica identified.\n                            It allows for precise control over which Pod(s) the Action should run in.\n\n\n                            If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                            to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                            post-provision or pre-terminate of the component.\n\n\n                            This field cannot be updated.\n                          enum:\n                          - Any\n                          - All\n                          - Role\n                          - Ordinal\n                          type: string\n                        timeoutSeconds:\n                          default: 0\n                          description: |-\n                            Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                            If the Action does not complete within this time frame, it will be terminated.\n\n\n                            This field cannot be updated.\n                          format: int32\n                          type: integer\n                      type: object\n                    variables:\n                      additionalProperties:\n                        type: string\n                      description: Variables are key-value pairs for dynamic configuration\n                        values that can be provided by the user.\n                      type: object\n                  type: object\n                type: array\n              disableExporter:\n                description: |-\n                  Determines whether metrics exporter information is annotated on the Component's headless Service.\n\n\n                  If set to true, the following annotations will not be patched into the Service:\n\n\n                  - \"monitor.kubeblocks.io/path\"\n                  - \"monitor.kubeblocks.io/port\"\n                  - \"monitor.kubeblocks.io/scheme\"\n\n\n                  These annotations allow the Prometheus installed by KubeBlocks to discover and scrape metrics from the exporter.\n                type: boolean\n              env:\n                description: List of environment variables to add.\n                items:\n                  description: EnvVar represents an environment variable present in\n                    a Container.\n                  properties:\n                    name:\n                      description: Name of the environment variable. Must be a C_IDENTIFIER.\n                      type: string\n                    value:\n                      description: |-\n                        Variable references $(VAR_NAME) are expanded\n                        using the previously defined environment variables in the container and\n                        any service environment variables. If a variable cannot be resolved,\n                        the reference in the input string will be unchanged. Double $$ are reduced\n                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                        Escaped references will never be expanded, regardless of whether the variable\n                        exists or not.\n                        Defaults to \"\".\n                      type: string\n                    valueFrom:\n                      description: Source for the environment variable's value. Cannot\n                        be used if value is not empty.\n                      properties:\n                        configMapKeyRef:\n                          description: Selects a key of a ConfigMap.\n                          properties:\n                            key:\n                              description: The key to select.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the ConfigMap or its key\n                                must be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        fieldRef:\n                          description: |-\n                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                          properties:\n                            apiVersion:\n                              description: Version of the schema the FieldPath is\n                                written in terms of, defaults to \"v1\".\n                              type: string\n                            fieldPath:\n                              description: Path of the field to select in the specified\n                                API version.\n                              type: string\n                          required:\n                          - fieldPath\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        resourceFieldRef:\n                          description: |-\n                            Selects a resource of the container: only resources limits and requests\n                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                          properties:\n                            containerName:\n                              description: 'Container name: required for volumes,\n                                optional for env vars'\n                              type: string\n                            divisor:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: Specifies the output format of the exposed\n                                resources, defaults to \"1\"\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                            resource:\n                              description: 'Required: resource to select'\n                              type: string\n                          required:\n                          - resource\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        secretKeyRef:\n                          description: Selects a key of a secret in the pod's namespace\n                          properties:\n                            key:\n                              description: The key of the secret to select from.  Must\n                                be a valid secret key.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the Secret or its key must\n                                be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              instanceUpdateStrategy:\n                description: Provides fine-grained control over the spec update process\n                  of all instances.\n                properties:\n                  rollingUpdate:\n                    description: Specifies how the rolling update should be applied.\n                    properties:\n                      maxUnavailable:\n                        anyOf:\n                        - type: integer\n                        - type: string\n                        description: |-\n                          The maximum number of instances that can be unavailable during the update.\n                          Value can be an absolute number (ex: 5) or a percentage of desired instances (ex: 10%).\n                          Absolute number is calculated from percentage by rounding up. This can not be 0.\n                          Defaults to 1. The field applies to all instances. That means if there is any unavailable pod,\n                          it will be counted towards MaxUnavailable.\n                        x-kubernetes-int-or-string: true\n                      replicas:\n                        anyOf:\n                        - type: integer\n                        - type: string\n                        description: |-\n                          Indicates the number of instances that should be updated during a rolling update.\n                          The remaining instances will remain untouched. This is helpful in defining how many instances\n                          should participate in the update process.\n                          Value can be an absolute number (ex: 5) or a percentage of desired instances (ex: 10%).\n                          Absolute number is calculated from percentage by rounding up.\n                          The default value is ComponentSpec.Replicas (i.e., update all instances).\n                        x-kubernetes-int-or-string: true\n                    type: object\n                  type:\n                    description: |-\n                      Indicates the type of the update strategy.\n                      Default is RollingUpdate.\n                    enum:\n                    - RollingUpdate\n                    - OnDelete\n                    type: string\n                type: object\n              instances:\n                description: |-\n                  Allows for the customization of configuration values for each instance within a Component.\n                  An Instance represent a single replica (Pod and associated K8s resources like PVCs, Services, and ConfigMaps).\n                  While instances typically share a common configuration as defined in the ClusterComponentSpec,\n                  they can require unique settings in various scenarios:\n\n\n                  For example:\n                  - A database Component might require different resource allocations for primary and secondary instances,\n                    with primaries needing more resources.\n                  - During a rolling upgrade, a Component may first update the image for one or a few instances,\n                    and then update the remaining instances after verifying that the updated instances are functioning correctly.\n\n\n                  InstanceTemplate allows for specifying these unique configurations per instance.\n                  Each instance's name is constructed using the pattern: $(component.name)-$(template.name)-$(ordinal),\n                  starting with an ordinal of 0.\n                  It is crucial to maintain unique names for each InstanceTemplate to avoid conflicts.\n\n\n                  The sum of replicas across all InstanceTemplates should not exceed the total number of Replicas specified for the Component.\n                  Any remaining replicas will be generated using the default template and will follow the default naming rules.\n                items:\n                  description: InstanceTemplate allows customization of individual\n                    replica configurations in a Component.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                        Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                      type: object\n                    env:\n                      description: |-\n                        Defines Env to override.\n                        Add new or override existing envs.\n                      items:\n                        description: EnvVar represents an environment variable present\n                          in a Container.\n                        properties:\n                          name:\n                            description: Name of the environment variable. Must be\n                              a C_IDENTIFIER.\n                            type: string\n                          value:\n                            description: |-\n                              Variable references $(VAR_NAME) are expanded\n                              using the previously defined environment variables in the container and\n                              any service environment variables. If a variable cannot be resolved,\n                              the reference in the input string will be unchanged. Double $$ are reduced\n                              to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                              \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                              Escaped references will never be expanded, regardless of whether the variable\n                              exists or not.\n                              Defaults to \"\".\n                            type: string\n                          valueFrom:\n                            description: Source for the environment variable's value.\n                              Cannot be used if value is not empty.\n                            properties:\n                              configMapKeyRef:\n                                description: Selects a key of a ConfigMap.\n                                properties:\n                                  key:\n                                    description: The key to select.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap or\n                                      its key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              fieldRef:\n                                description: |-\n                                  Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                  spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              secretKeyRef:\n                                description: Selects a key of a secret in the pod's\n                                  namespace\n                                properties:\n                                  key:\n                                    description: The key of the secret to select from.  Must\n                                      be a valid secret key.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret or its\n                                      key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    labels:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                        Values for existing keys will be overwritten, and new keys will be added.\n                      type: object\n                    name:\n                      description: |-\n                        Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                        This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal\n                        using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                        The specified name overrides any default naming conventions or patterns.\n                      maxLength: 54\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    ordinals:\n                      description: |-\n                        Specifies the desired Ordinals of this InstanceTemplate.\n                        The Ordinals used to specify the ordinal of the instance (pod) names to be generated under this InstanceTemplate.\n\n\n                        For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},\n                        then the instance names generated under this InstanceTemplate would be\n                        $(cluster.name)-$(component.name)-$(template.name)-0、$(cluster.name)-$(component.name)-$(template.name)-1 and\n                        $(cluster.name)-$(component.name)-$(template.name)-7\n                      properties:\n                        discrete:\n                          items:\n                            format: int32\n                            type: integer\n                          type: array\n                        ranges:\n                          items:\n                            description: |-\n                              Range represents a range with a start and an end value.\n                              It is used to define a continuous segment.\n                            properties:\n                              end:\n                                format: int32\n                                type: integer\n                              start:\n                                format: int32\n                                type: integer\n                            required:\n                            - end\n                            - start\n                            type: object\n                          type: array\n                      type: object\n                    replicas:\n                      default: 1\n                      description: |-\n                        Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                        This field allows setting how many replicated instances of the Component,\n                        with the specific overrides in the InstanceTemplate, are created.\n                        The default value is 1. A value of 0 disables instance creation.\n                      format: int32\n                      minimum: 0\n                      type: integer\n                    resources:\n                      description: |-\n                        Specifies an override for the resource requirements of the first container in the Pod.\n                        This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                      properties:\n                        claims:\n                          description: |-\n                            Claims lists the names of resources, defined in spec.resourceClaims,\n                            that are used by this container.\n\n\n                            This is an alpha field and requires enabling the\n                            DynamicResourceAllocation feature gate.\n\n\n                            This field is immutable. It can only be set for containers.\n                          items:\n                            description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                            properties:\n                              name:\n                                description: |-\n                                  Name must match the name of one entry in pod.spec.resourceClaims of\n                                  the Pod where this field is used. It makes that resource available\n                                  inside a container.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        limits:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Limits describes the maximum amount of compute resources allowed.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                        requests:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Requests describes the minimum amount of compute resources required.\n                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                      type: object\n                    schedulingPolicy:\n                      description: |-\n                        Specifies the scheduling policy for the instance.\n                        If defined, it will overwrite the scheduling policy defined in ClusterSpec and/or ClusterComponentSpec.\n                      properties:\n                        affinity:\n                          description: Specifies a group of affinity scheduling rules\n                            of the Cluster, including NodeAffinity, PodAffinity, and\n                            PodAntiAffinity.\n                          properties:\n                            nodeAffinity:\n                              description: Describes node affinity scheduling rules\n                                for the pod.\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: |-\n                                      An empty preferred scheduling term matches all objects with implicit weight 0\n                                      (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                    properties:\n                                      preference:\n                                        description: A node selector term, associated\n                                          with the corresponding weight.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      weight:\n                                        description: Weight associated with matching\n                                          the corresponding nodeSelectorTerm, in the\n                                          range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - preference\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to an update), the system\n                                    may or may not try to eventually evict the pod from its node.\n                                  properties:\n                                    nodeSelectorTerms:\n                                      description: Required. A list of node selector\n                                        terms. The terms are ORed.\n                                      items:\n                                        description: |-\n                                          A null or empty node selector term matches no objects. The requirements of\n                                          them are ANDed.\n                                          The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      type: array\n                                  required:\n                                  - nodeSelectorTerms\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                              type: object\n                            podAffinity:\n                              description: Describes pod affinity scheduling rules\n                                (e.g. co-locate this pod in the same node, zone, etc.\n                                as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                            podAntiAffinity:\n                              description: Describes pod anti-affinity scheduling\n                                rules (e.g. avoid putting this pod in the same node,\n                                zone, etc. as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the anti-affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the anti-affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the anti-affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                          type: object\n                        nodeName:\n                          description: |-\n                            NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                            the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                            requirements.\n                          type: string\n                        nodeSelector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            NodeSelector is a selector which must be true for the Pod to fit on a node.\n                            Selector which must match a node's labels for the Pod to be scheduled on that node.\n                            More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        schedulerName:\n                          description: |-\n                            If specified, the Pod will be dispatched by specified scheduler.\n                            If not specified, the Pod will be dispatched by default scheduler.\n                          type: string\n                        tolerations:\n                          description: |-\n                            Allows Pods to be scheduled onto nodes with matching taints.\n                            Each toleration in the array allows the Pod to tolerate node taints based on\n                            specified `key`, `value`, `effect`, and `operator`.\n\n\n                            - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                            - The `operator` determines how the toleration matches the taint.\n\n\n                            Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                          items:\n                            description: |-\n                              The pod this Toleration is attached to tolerates any taint that matches\n                              the triple <key,value,effect> using the matching operator <operator>.\n                            properties:\n                              effect:\n                                description: |-\n                                  Effect indicates the taint effect to match. Empty means match all taint effects.\n                                  When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                type: string\n                              key:\n                                description: |-\n                                  Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                  If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                type: string\n                              operator:\n                                description: |-\n                                  Operator represents a key's relationship to the value.\n                                  Valid operators are Exists and Equal. Defaults to Equal.\n                                  Exists is equivalent to wildcard for value, so that a pod can\n                                  tolerate all taints of a particular category.\n                                type: string\n                              tolerationSeconds:\n                                description: |-\n                                  TolerationSeconds represents the period of time the toleration (which must be\n                                  of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                  it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                  negative values will be treated as 0 (evict immediately) by the system.\n                                format: int64\n                                type: integer\n                              value:\n                                description: |-\n                                  Value is the taint value the toleration matches to.\n                                  If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                type: string\n                            type: object\n                          type: array\n                        topologySpreadConstraints:\n                          description: |-\n                            TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                            domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                            All topologySpreadConstraints are ANDed.\n                          items:\n                            description: TopologySpreadConstraint specifies how to\n                              spread matching pods among the given topology.\n                            properties:\n                              labelSelector:\n                                description: |-\n                                  LabelSelector is used to find matching pods.\n                                  Pods that match this label selector are counted to determine the number of pods\n                                  in their corresponding topology domain.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              matchLabelKeys:\n                                description: |-\n                                  MatchLabelKeys is a set of pod label keys to select the pods over which\n                                  spreading will be calculated. The keys are used to lookup values from the\n                                  incoming pod labels, those key-value labels are ANDed with labelSelector\n                                  to select the group of existing pods over which spreading will be calculated\n                                  for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                  MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                  Keys that don't exist in the incoming pod labels will\n                                  be ignored. A null or empty list means only match against labelSelector.\n\n\n                                  This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              maxSkew:\n                                description: |-\n                                  MaxSkew describes the degree to which pods may be unevenly distributed.\n                                  When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                  between the number of matching pods in the target topology and the global minimum.\n                                  The global minimum is the minimum number of matching pods in an eligible domain\n                                  or zero if the number of eligible domains is less than MinDomains.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 2/2/1:\n                                  In this case, the global minimum is 1.\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |   P   |\n                                  - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                  scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                  violate MaxSkew(1).\n                                  - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                  When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                  to topologies that satisfy it.\n                                  It's a required field. Default value is 1 and 0 is not allowed.\n                                format: int32\n                                type: integer\n                              minDomains:\n                                description: |-\n                                  MinDomains indicates a minimum number of eligible domains.\n                                  When the number of eligible domains with matching topology keys is less than minDomains,\n                                  Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                  And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                  this value has no effect on scheduling.\n                                  As a result, when the number of eligible domains is less than minDomains,\n                                  scheduler won't schedule more than maxSkew Pods to those domains.\n                                  If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                  Valid values are integers greater than 0.\n                                  When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                  For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                  labelSelector spread as 2/2/2:\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |  P P  |\n                                  The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                  In this situation, new pod with the same labelSelector cannot be scheduled,\n                                  because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                  it will violate MaxSkew.\n\n\n                                  This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                format: int32\n                                type: integer\n                              nodeAffinityPolicy:\n                                description: |-\n                                  NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                  when calculating pod topology spread skew. Options are:\n                                  - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                  - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                  If this value is nil, the behavior is equivalent to the Honor policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              nodeTaintsPolicy:\n                                description: |-\n                                  NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                  pod topology spread skew. Options are:\n                                  - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                  has a toleration, are included.\n                                  - Ignore: node taints are ignored. All nodes are included.\n\n\n                                  If this value is nil, the behavior is equivalent to the Ignore policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              topologyKey:\n                                description: |-\n                                  TopologyKey is the key of node labels. Nodes that have a label with this key\n                                  and identical values are considered to be in the same topology.\n                                  We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                  of pods into each bucket.\n                                  We define a domain as a particular instance of a topology.\n                                  Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                  nodeAffinityPolicy and nodeTaintsPolicy.\n                                  e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                  And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                  It's a required field.\n                                type: string\n                              whenUnsatisfiable:\n                                description: |-\n                                  WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                  the spread constraint.\n                                  - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                  - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                    but giving higher precedence to topologies that would help reduce the\n                                    skew.\n                                  A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                  if and only if every possible node assignment for that pod would violate\n                                  \"MaxSkew\" on some topology.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 3/1/1:\n                                  | zone1 | zone2 | zone3 |\n                                  | P P P |   P   |   P   |\n                                  If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                  to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                  MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                  won't make it *more* imbalanced.\n                                  It's a required field.\n                                type: string\n                            required:\n                            - maxSkew\n                            - topologyKey\n                            - whenUnsatisfiable\n                            type: object\n                          type: array\n                      type: object\n                    volumeClaimTemplates:\n                      description: Specifies an override for the storage requirements\n                        of the instances.\n                      items:\n                        properties:\n                          annotations:\n                            additionalProperties:\n                              type: string\n                            description: Specifies the annotations for the PVC of\n                              the volume.\n                            type: object\n                          labels:\n                            additionalProperties:\n                              type: string\n                            description: Specifies the labels for the PVC of the volume.\n                            type: object\n                          name:\n                            description: |-\n                              Refers to the name of a volumeMount defined in either:\n\n\n                              - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                              - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                              The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                            type: string\n                          spec:\n                            description: |-\n                              Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                              with the mount name specified in the `name` field.\n\n\n                              When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                              defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                            properties:\n                              accessModes:\n                                description: |-\n                                  Contains the desired access modes the volume should have.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-preserve-unknown-fields: true\n                              resources:\n                                description: |-\n                                  Represents the minimum resources the volume should have.\n                                  If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                  are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                properties:\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                                x-kubernetes-preserve-unknown-fields: true\n                              storageClassName:\n                                description: |-\n                                  The name of the StorageClass required by the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                type: string\n                              volumeAttributesClassName:\n                                description: |-\n                                  volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n\n\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                type: string\n                              volumeMode:\n                                description: Defines what type of volume is required\n                                  by the claim, either Block or Filesystem.\n                                type: string\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                  required:\n                  - name\n                  type: object\n                type: array\n              labels:\n                additionalProperties:\n                  type: string\n                description: Specifies Labels to override or add for underlying Pods,\n                  PVCs, Account & TLS Secrets, Services Owned by Component.\n                type: object\n              offlineInstances:\n                description: |-\n                  Specifies the names of instances to be transitioned to offline status.\n\n\n                  Marking an instance as offline results in the following:\n\n\n                  1. The associated Pod is stopped, and its PersistentVolumeClaim (PVC) is retained for potential\n                     future reuse or data recovery, but it is no longer actively used.\n                  2. The ordinal number assigned to this instance is preserved, ensuring it remains unique\n                     and avoiding conflicts with new instances.\n\n\n                  Setting instances to offline allows for a controlled scale-in process, preserving their data and maintaining\n                  ordinal consistency within the Cluster.\n                  Note that offline instances and their associated resources, such as PVCs, are not automatically deleted.\n                  The administrator must manually manage the cleanup and removal of these resources when they are no longer needed.\n                items:\n                  type: string\n                type: array\n              parallelPodManagementConcurrency:\n                anyOf:\n                - type: integer\n                - type: string\n                description: |-\n                  Controls the concurrency of pods during initial scale up, when replacing pods on nodes,\n                  or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.\n                  The default Concurrency is 100%.\n                x-kubernetes-int-or-string: true\n              persistentVolumeClaimRetentionPolicy:\n                description: |-\n                  persistentVolumeClaimRetentionPolicy describes the lifecycle of persistent\n                  volume claims created from volumeClaimTemplates. By default, all persistent\n                  volume claims are created as needed and retained until manually deleted. This\n                  policy allows the lifecycle to be altered, for example by deleting persistent\n                  volume claims when their workload is deleted, or when their pod is scaled\n                  down.\n                properties:\n                  whenDeleted:\n                    description: |-\n                      WhenDeleted specifies what happens to PVCs created from VolumeClaimTemplates when the workload is deleted.\n                      The `Retain` policy causes PVCs to not be affected by workload deletion.\n                      The default policy of `Delete` causes those PVCs to be deleted.\n                    enum:\n                    - Retain\n                    - Delete\n                    type: string\n                  whenScaled:\n                    description: |-\n                      WhenScaled specifies what happens to PVCs created from VolumeClaimTemplates when the workload is scaled down.\n                      The `Retain` policy causes PVCs to not be affected by a scale down.\n                      The default policy of `Delete` causes the associated PVCs for pods scaled down to be deleted.\n                    enum:\n                    - Retain\n                    - Delete\n                    type: string\n                type: object\n              podUpdatePolicy:\n                description: |-\n                  PodUpdatePolicy indicates how pods should be updated\n\n\n                  - `StrictInPlace` indicates that only allows in-place upgrades.\n                  Any attempt to modify other fields will be rejected.\n                  - `PreferInPlace` indicates that we will first attempt an in-place upgrade of the Pod.\n                  If that fails, it will fall back to the ReCreate, where pod will be recreated.\n                  Default value is \"PreferInPlace\"\n                type: string\n              replicas:\n                default: 1\n                description: Specifies the desired number of replicas in the Component\n                  for enhancing availability and durability, or load balancing.\n                format: int32\n                minimum: 0\n                type: integer\n              resources:\n                description: |-\n                  Specifies the resources required by the Component.\n                  It allows defining the CPU, memory requirements and limits for the Component's containers.\n                properties:\n                  claims:\n                    description: |-\n                      Claims lists the names of resources, defined in spec.resourceClaims,\n                      that are used by this container.\n\n\n                      This is an alpha field and requires enabling the\n                      DynamicResourceAllocation feature gate.\n\n\n                      This field is immutable. It can only be set for containers.\n                    items:\n                      description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                      properties:\n                        name:\n                          description: |-\n                            Name must match the name of one entry in pod.spec.resourceClaims of\n                            the Pod where this field is used. It makes that resource available\n                            inside a container.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                  limits:\n                    additionalProperties:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                      x-kubernetes-int-or-string: true\n                    description: |-\n                      Limits describes the maximum amount of compute resources allowed.\n                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                    type: object\n                  requests:\n                    additionalProperties:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                      x-kubernetes-int-or-string: true\n                    description: |-\n                      Requests describes the minimum amount of compute resources required.\n                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                    type: object\n                type: object\n                x-kubernetes-preserve-unknown-fields: true\n              runtimeClassName:\n                description: Defines runtimeClassName for all Pods managed by this\n                  Component.\n                type: string\n              schedulingPolicy:\n                description: Specifies the scheduling policy for the Component.\n                properties:\n                  affinity:\n                    description: Specifies a group of affinity scheduling rules of\n                      the Cluster, including NodeAffinity, PodAffinity, and PodAntiAffinity.\n                    properties:\n                      nodeAffinity:\n                        description: Describes node affinity scheduling rules for\n                          the pod.\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: |-\n                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                              properties:\n                                preference:\n                                  description: A node selector term, associated with\n                                    the corresponding weight.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                weight:\n                                  description: Weight associated with matching the\n                                    corresponding nodeSelectorTerm, in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - preference\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to an update), the system\n                              may or may not try to eventually evict the pod from its node.\n                            properties:\n                              nodeSelectorTerms:\n                                description: Required. A list of node selector terms.\n                                  The terms are ORed.\n                                items:\n                                  description: |-\n                                    A null or empty node selector term matches no objects. The requirements of\n                                    them are ANDed.\n                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                type: array\n                            required:\n                            - nodeSelectorTerms\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                      podAffinity:\n                        description: Describes pod affinity scheduling rules (e.g.\n                          co-locate this pod in the same node, zone, etc. as some\n                          other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                      podAntiAffinity:\n                        description: Describes pod anti-affinity scheduling rules\n                          (e.g. avoid putting this pod in the same node, zone, etc.\n                          as some other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the anti-affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the anti-affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the anti-affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                    type: object\n                  nodeName:\n                    description: |-\n                      NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                      the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                      requirements.\n                    type: string\n                  nodeSelector:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      NodeSelector is a selector which must be true for the Pod to fit on a node.\n                      Selector which must match a node's labels for the Pod to be scheduled on that node.\n                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  schedulerName:\n                    description: |-\n                      If specified, the Pod will be dispatched by specified scheduler.\n                      If not specified, the Pod will be dispatched by default scheduler.\n                    type: string\n                  tolerations:\n                    description: |-\n                      Allows Pods to be scheduled onto nodes with matching taints.\n                      Each toleration in the array allows the Pod to tolerate node taints based on\n                      specified `key`, `value`, `effect`, and `operator`.\n\n\n                      - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                      - The `operator` determines how the toleration matches the taint.\n\n\n                      Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                    items:\n                      description: |-\n                        The pod this Toleration is attached to tolerates any taint that matches\n                        the triple <key,value,effect> using the matching operator <operator>.\n                      properties:\n                        effect:\n                          description: |-\n                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                          type: string\n                        key:\n                          description: |-\n                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                          type: string\n                        operator:\n                          description: |-\n                            Operator represents a key's relationship to the value.\n                            Valid operators are Exists and Equal. Defaults to Equal.\n                            Exists is equivalent to wildcard for value, so that a pod can\n                            tolerate all taints of a particular category.\n                          type: string\n                        tolerationSeconds:\n                          description: |-\n                            TolerationSeconds represents the period of time the toleration (which must be\n                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                            negative values will be treated as 0 (evict immediately) by the system.\n                          format: int64\n                          type: integer\n                        value:\n                          description: |-\n                            Value is the taint value the toleration matches to.\n                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                          type: string\n                      type: object\n                    type: array\n                  topologySpreadConstraints:\n                    description: |-\n                      TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                      domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                      All topologySpreadConstraints are ANDed.\n                    items:\n                      description: TopologySpreadConstraint specifies how to spread\n                        matching pods among the given topology.\n                      properties:\n                        labelSelector:\n                          description: |-\n                            LabelSelector is used to find matching pods.\n                            Pods that match this label selector are counted to determine the number of pods\n                            in their corresponding topology domain.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        matchLabelKeys:\n                          description: |-\n                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                            spreading will be calculated. The keys are used to lookup values from the\n                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                            to select the group of existing pods over which spreading will be calculated\n                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                            Keys that don't exist in the incoming pod labels will\n                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        maxSkew:\n                          description: |-\n                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                            between the number of matching pods in the target topology and the global minimum.\n                            The global minimum is the minimum number of matching pods in an eligible domain\n                            or zero if the number of eligible domains is less than MinDomains.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 2/2/1:\n                            In this case, the global minimum is 1.\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |   P   |\n                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                            violate MaxSkew(1).\n                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                            to topologies that satisfy it.\n                            It's a required field. Default value is 1 and 0 is not allowed.\n                          format: int32\n                          type: integer\n                        minDomains:\n                          description: |-\n                            MinDomains indicates a minimum number of eligible domains.\n                            When the number of eligible domains with matching topology keys is less than minDomains,\n                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                            this value has no effect on scheduling.\n                            As a result, when the number of eligible domains is less than minDomains,\n                            scheduler won't schedule more than maxSkew Pods to those domains.\n                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                            Valid values are integers greater than 0.\n                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                            labelSelector spread as 2/2/2:\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |  P P  |\n                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                            it will violate MaxSkew.\n\n\n                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                          format: int32\n                          type: integer\n                        nodeAffinityPolicy:\n                          description: |-\n                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                            when calculating pod topology spread skew. Options are:\n                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                            If this value is nil, the behavior is equivalent to the Honor policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        nodeTaintsPolicy:\n                          description: |-\n                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                            pod topology spread skew. Options are:\n                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                            has a toleration, are included.\n                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        topologyKey:\n                          description: |-\n                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                            and identical values are considered to be in the same topology.\n                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                            of pods into each bucket.\n                            We define a domain as a particular instance of a topology.\n                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                            nodeAffinityPolicy and nodeTaintsPolicy.\n                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                            It's a required field.\n                          type: string\n                        whenUnsatisfiable:\n                          description: |-\n                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                            the spread constraint.\n                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                              but giving higher precedence to topologies that would help reduce the\n                              skew.\n                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                            if and only if every possible node assignment for that pod would violate\n                            \"MaxSkew\" on some topology.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 3/1/1:\n                            | zone1 | zone2 | zone3 |\n                            | P P P |   P   |   P   |\n                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                            won't make it *more* imbalanced.\n                            It's a required field.\n                          type: string\n                      required:\n                      - maxSkew\n                      - topologyKey\n                      - whenUnsatisfiable\n                      type: object\n                    type: array\n                type: object\n              serviceAccountName:\n                description: |-\n                  Specifies the name of the ServiceAccount required by the running Component.\n                  This ServiceAccount is used to grant necessary permissions for the Component's Pods to interact\n                  with other Kubernetes resources, such as modifying Pod labels or sending events.\n\n\n                  If not specified, KubeBlocks automatically creates a default ServiceAccount named\n                  \"kb-{componentdefinition.name}\", bound to a role with rules defined in ComponentDefinition's\n                  `policyRules` field. If needed (currently this means if any lifecycleAction is enabled),\n                  it will also be bound to a default role named\n                  \"kubeblocks-cluster-pod-role\", which is installed together with KubeBlocks.\n                  If multiple components use the same ComponentDefinition, they will share one ServiceAccount.\n\n\n                  If the field is not empty, the specified ServiceAccount will be used, and KubeBlocks will not\n                  create a ServiceAccount. But KubeBlocks does create RoleBindings for the specified ServiceAccount.\n                type: string\n              serviceRefs:\n                description: |-\n                  Defines a list of ServiceRef for a Component, enabling access to both external services and\n                  Services provided by other Clusters.\n\n\n                  Types of services:\n\n\n                  - External services: Not managed by KubeBlocks or managed by a different KubeBlocks operator;\n                    Require a ServiceDescriptor for connection details.\n                  - Services provided by a Cluster: Managed by the same KubeBlocks operator;\n                    identified using Cluster, Component and Service names.\n\n\n                  ServiceRefs with identical `serviceRef.name` in the same Cluster are considered the same.\n\n\n                  Example:\n                  ```yaml\n                  serviceRefs:\n                    - name: \"redis-sentinel\"\n                      serviceDescriptor:\n                        name: \"external-redis-sentinel\"\n                    - name: \"postgres-cluster\"\n                      clusterServiceSelector:\n                        cluster: \"my-postgres-cluster\"\n                        service:\n                          component: \"postgresql\"\n                  ```\n                  The example above includes ServiceRefs to an external Redis Sentinel service and a PostgreSQL Cluster.\n                items:\n                  properties:\n                    cluster:\n                      description: |-\n                        Specifies the name of the KubeBlocks Cluster being referenced.\n                        This is used when services from another KubeBlocks Cluster are consumed.\n\n\n                        By default, the referenced KubeBlocks Cluster's `clusterDefinition.spec.connectionCredential`\n                        will be utilized to bind to the current Component. This credential should include:\n                        `endpoint`, `port`, `username`, and `password`.\n\n\n                        Note:\n\n\n                        - The `ServiceKind` and `ServiceVersion` specified in the service reference within the\n                          ClusterDefinition are not validated when using this approach.\n                        - If both `cluster` and `serviceDescriptor` are present, `cluster` will take precedence.\n\n\n                        Deprecated since v0.9 since `clusterDefinition.spec.connectionCredential` is deprecated,\n                        use `clusterServiceSelector` instead.\n                        This field is maintained for backward compatibility and its use is discouraged.\n                        Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                      type: string\n                    clusterServiceSelector:\n                      description: |-\n                        References a service provided by another KubeBlocks Cluster.\n                        It specifies the ClusterService and the account credentials needed for access.\n                      properties:\n                        cluster:\n                          description: The name of the Cluster being referenced.\n                          type: string\n                        credential:\n                          description: |-\n                            Specifies the SystemAccount to authenticate and establish a connection with the referenced Cluster.\n                            The SystemAccount should be defined in `componentDefinition.spec.systemAccounts`\n                            of the Component providing the service in the referenced Cluster.\n                          properties:\n                            component:\n                              description: The name of the Component where the credential\n                                resides in.\n                              type: string\n                            name:\n                              description: The name of the credential (SystemAccount)\n                                to reference.\n                              type: string\n                          required:\n                          - component\n                          - name\n                          type: object\n                        podFQDNs:\n                          properties:\n                            component:\n                              description: The name of the Component where the pods\n                                reside in.\n                              type: string\n                            role:\n                              description: The role of the pods to reference.\n                              type: string\n                          required:\n                          - component\n                          type: object\n                        service:\n                          description: Identifies a ClusterService from the list of\n                            Services defined in `cluster.spec.services` of the referenced\n                            Cluster.\n                          properties:\n                            component:\n                              description: |-\n                                The name of the Component where the Service resides in.\n\n\n                                It is required when referencing a Component's Service.\n                              type: string\n                            port:\n                              description: |-\n                                The port name of the Service to be referenced.\n\n\n                                If there is a non-zero node-port exist for the matched Service port, the node-port will be selected first.\n\n\n                                If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                and the resolved value will be presented in the following format: service1.name:port1,service2.name:port2...\n                              type: string\n                            service:\n                              description: |-\n                                The name of the Service to be referenced.\n\n\n                                Leave it empty to reference the default Service. Set it to \"headless\" to reference the default headless Service.\n\n\n                                If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                and the resolved value will be presented in the following format: service1.name,service2.name...\n                              type: string\n                          required:\n                          - service\n                          type: object\n                      required:\n                      - cluster\n                      type: object\n                    name:\n                      description: |-\n                        Specifies the identifier of the service reference declaration.\n                        It corresponds to the serviceRefDeclaration name defined in either:\n\n\n                        - `componentDefinition.spec.serviceRefDeclarations[*].name`\n                        - `clusterDefinition.spec.componentDefs[*].serviceRefDeclarations[*].name` (deprecated)\n                      type: string\n                    namespace:\n                      description: |-\n                        Specifies the namespace of the referenced Cluster or the namespace of the referenced ServiceDescriptor object.\n                        If not provided, the referenced Cluster and ServiceDescriptor will be searched in the namespace of the current\n                        Cluster by default.\n                      type: string\n                    serviceDescriptor:\n                      description: |-\n                        Specifies the name of the ServiceDescriptor object that describes a service provided by external sources.\n\n\n                        When referencing a service provided by external sources, a ServiceDescriptor object is required to establish\n                        the service binding.\n                        The `serviceDescriptor.spec.serviceKind` and `serviceDescriptor.spec.serviceVersion` should match the serviceKind\n                        and serviceVersion declared in the definition.\n\n\n                        If both `cluster` and `serviceDescriptor` are specified, the `cluster` takes precedence.\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n              serviceVersion:\n                description: |-\n                  ServiceVersion specifies the version of the Service expected to be provisioned by this Component.\n                  The version should follow the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n                maxLength: 32\n                type: string\n              services:\n                description: Overrides Services defined in referenced ComponentDefinition.\n                items:\n                  description: |-\n                    ComponentService defines a service that would be exposed as an inter-component service within a Cluster.\n                    A Service defined in the ComponentService is expected to be accessed by other Components within the same Cluster.\n\n\n                    When a Component needs to use a ComponentService provided by another Component within the same Cluster,\n                    it can declare a variable in the `componentDefinition.spec.vars` section and bind it to the specific exposed address\n                    of the ComponentService using the `serviceVarRef` field.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        If ServiceType is LoadBalancer, cloud provider related parameters can be put here\n                        More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                      type: object\n                    disableAutoProvision:\n                      description: |-\n                        Indicates whether the automatic provisioning of the service should be disabled.\n\n\n                        If set to true, the service will not be automatically created at the component provisioning.\n                        Instead, you can enable the creation of this service by specifying it explicitly in the cluster API.\n                      type: boolean\n                    name:\n                      description: |-\n                        Name defines the name of the service.\n                        otherwise, it indicates the name of the service.\n                        Others can refer to this service by its name. (e.g., connection credential)\n                        Cannot be updated.\n                      maxLength: 25\n                      type: string\n                    podService:\n                      default: false\n                      description: |-\n                        Indicates whether to create a corresponding Service for each Pod of the selected Component.\n                        When set to true, a set of Services will be automatically generated for each Pod,\n                        and the `roleSelector` field will be ignored.\n\n\n                        The names of the generated Services will follow the same suffix naming pattern: `$(serviceName)-$(podOrdinal)`.\n                        The total number of generated Services will be equal to the number of replicas specified for the Component.\n\n\n                        Example usage:\n\n\n                        ```yaml\n                        name: my-service\n                        serviceName: my-service\n                        podService: true\n                        disableAutoProvision: true\n                        spec:\n                          type: NodePort\n                          ports:\n                          - name: http\n                            port: 80\n                            targetPort: 8080\n                        ```\n\n\n                        In this example, if the Component has 3 replicas, three Services will be generated:\n                        - my-service-0: Points to the first Pod (podOrdinal: 0)\n                        - my-service-1: Points to the second Pod (podOrdinal: 1)\n                        - my-service-2: Points to the third Pod (podOrdinal: 2)\n\n\n                        Each generated Service will have the specified spec configuration and will target its respective Pod.\n\n\n                        This feature is useful when you need to expose each Pod of a Component individually, allowing external access\n                        to specific instances of the Component.\n                      type: boolean\n                    roleSelector:\n                      description: \"Extends the above `serviceSpec.selector` by allowing\n                        you to specify defined role as selector for the service.\\nWhen\n                        `roleSelector` is set, it adds a label selector \\\"kubeblocks.io/role:\n                        {roleSelector}\\\"\\nto the `serviceSpec.selector`.\\nExample\n                        usage:\\n\\n\\n\\t  roleSelector: \\\"leader\\\"\\n\\n\\nIn this example,\n                        setting `roleSelector` to \\\"leader\\\" will add a label selector\\n\\\"kubeblocks.io/role:\n                        leader\\\" to the `serviceSpec.selector`.\\nThis means that the\n                        service will select and route traffic to Pods with the label\\n\\\"kubeblocks.io/role\\\"\n                        set to \\\"leader\\\".\\n\\n\\nNote that if `podService` sets to\n                        true, RoleSelector will be ignored.\\nThe `podService` flag\n                        takes precedence over `roleSelector` and generates a service\n                        for each Pod.\"\n                      type: string\n                    serviceName:\n                      description: |-\n                        ServiceName defines the name of the underlying service object.\n                        If not specified, the default service name with different patterns will be used:\n\n\n                        - CLUSTER_NAME: for cluster-level services\n                        - CLUSTER_NAME-COMPONENT_NAME: for component-level services\n\n\n                        Only one default service name is allowed.\n                        Cannot be updated.\n                      maxLength: 25\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    spec:\n                      description: |-\n                        Spec defines the behavior of a service.\n                        https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                      properties:\n                        allocateLoadBalancerNodePorts:\n                          description: |-\n                            allocateLoadBalancerNodePorts defines if NodePorts will be automatically\n                            allocated for services with type LoadBalancer.  Default is \"true\". It\n                            may be set to \"false\" if the cluster load-balancer does not rely on\n                            NodePorts.  If the caller requests specific NodePorts (by specifying a\n                            value), those requests will be respected, regardless of this field.\n                            This field may only be set for services with type LoadBalancer and will\n                            be cleared if the type is changed to any other type.\n                          type: boolean\n                        clusterIP:\n                          description: |-\n                            clusterIP is the IP address of the service and is usually assigned\n                            randomly. If an address is specified manually, is in-range (as per\n                            system configuration), and is not in use, it will be allocated to the\n                            service; otherwise creation of the service will fail. This field may not\n                            be changed through updates unless the type field is also being changed\n                            to ExternalName (which requires this field to be blank) or the type\n                            field is being changed from ExternalName (in which case this field may\n                            optionally be specified, as describe above).  Valid values are \"None\",\n                            empty string (\"\"), or a valid IP address. Setting this to \"None\" makes a\n                            \"headless service\" (no virtual IP), which is useful when direct endpoint\n                            connections are preferred and proxying is not required.  Only applies to\n                            types ClusterIP, NodePort, and LoadBalancer. If this field is specified\n                            when creating a Service of type ExternalName, creation will fail. This\n                            field will be wiped when updating a Service to type ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        clusterIPs:\n                          description: |-\n                            ClusterIPs is a list of IP addresses assigned to this service, and are\n                            usually assigned randomly.  If an address is specified manually, is\n                            in-range (as per system configuration), and is not in use, it will be\n                            allocated to the service; otherwise creation of the service will fail.\n                            This field may not be changed through updates unless the type field is\n                            also being changed to ExternalName (which requires this field to be\n                            empty) or the type field is being changed from ExternalName (in which\n                            case this field may optionally be specified, as describe above).  Valid\n                            values are \"None\", empty string (\"\"), or a valid IP address.  Setting\n                            this to \"None\" makes a \"headless service\" (no virtual IP), which is\n                            useful when direct endpoint connections are preferred and proxying is\n                            not required.  Only applies to types ClusterIP, NodePort, and\n                            LoadBalancer. If this field is specified when creating a Service of type\n                            ExternalName, creation will fail. This field will be wiped when updating\n                            a Service to type ExternalName.  If this field is not specified, it will\n                            be initialized from the clusterIP field.  If this field is specified,\n                            clients must ensure that clusterIPs[0] and clusterIP have the same\n                            value.\n\n\n                            This field may hold a maximum of two entries (dual-stack IPs, in either order).\n                            These IPs must correspond to the values of the ipFamilies field. Both\n                            clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        externalIPs:\n                          description: |-\n                            externalIPs is a list of IP addresses for which nodes in the cluster\n                            will also accept traffic for this service.  These IPs are not managed by\n                            Kubernetes.  The user is responsible for ensuring that traffic arrives\n                            at a node with this IP.  A common example is external load-balancers\n                            that are not part of the Kubernetes system.\n                          items:\n                            type: string\n                          type: array\n                        externalName:\n                          description: |-\n                            externalName is the external reference that discovery mechanisms will\n                            return as an alias for this service (e.g. a DNS CNAME record). No\n                            proxying will be involved.  Must be a lowercase RFC-1123 hostname\n                            (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".\n                          type: string\n                        externalTrafficPolicy:\n                          description: |-\n                            externalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on one of the Service's \"externally-facing\" addresses (NodePorts,\n                            ExternalIPs, and LoadBalancer IPs). If set to \"Local\", the proxy will configure\n                            the service in a way that assumes that external load balancers will take care\n                            of balancing the service traffic between nodes, and so each node will deliver\n                            traffic only to the node-local endpoints of the service, without masquerading\n                            the client source IP. (Traffic mistakenly sent to a node with no endpoints will\n                            be dropped.) The default value, \"Cluster\", uses the standard behavior of\n                            routing to all endpoints evenly (possibly modified by topology and other\n                            features). Note that traffic sent to an External IP or LoadBalancer IP from\n                            within the cluster will always get \"Cluster\" semantics, but clients sending to\n                            a NodePort from within the cluster may need to take traffic policy into account\n                            when picking a node.\n                          type: string\n                        healthCheckNodePort:\n                          description: |-\n                            healthCheckNodePort specifies the healthcheck nodePort for the service.\n                            This only applies when type is set to LoadBalancer and\n                            externalTrafficPolicy is set to Local. If a value is specified, is\n                            in-range, and is not in use, it will be used.  If not specified, a value\n                            will be automatically allocated.  External systems (e.g. load-balancers)\n                            can use this port to determine if a given node holds endpoints for this\n                            service or not.  If this field is specified when creating a Service\n                            which does not need it, creation will fail. This field will be wiped\n                            when updating a Service to no longer need it (e.g. changing type).\n                            This field cannot be updated once set.\n                          format: int32\n                          type: integer\n                        internalTrafficPolicy:\n                          description: |-\n                            InternalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on the ClusterIP. If set to \"Local\", the proxy will assume that pods\n                            only want to talk to endpoints of the service on the same node as the pod,\n                            dropping the traffic if there are no local endpoints. The default value,\n                            \"Cluster\", uses the standard behavior of routing to all endpoints evenly\n                            (possibly modified by topology and other features).\n                          type: string\n                        ipFamilies:\n                          description: |-\n                            IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this\n                            service. This field is usually assigned automatically based on cluster\n                            configuration and the ipFamilyPolicy field. If this field is specified\n                            manually, the requested family is available in the cluster,\n                            and ipFamilyPolicy allows it, it will be used; otherwise creation of\n                            the service will fail. This field is conditionally mutable: it allows\n                            for adding or removing a secondary IP family, but it does not allow\n                            changing the primary IP family of the Service. Valid values are \"IPv4\"\n                            and \"IPv6\".  This field only applies to Services of types ClusterIP,\n                            NodePort, and LoadBalancer, and does apply to \"headless\" services.\n                            This field will be wiped when updating a Service to type ExternalName.\n\n\n                            This field may hold a maximum of two entries (dual-stack families, in\n                            either order).  These families must correspond to the values of the\n                            clusterIPs field, if specified. Both clusterIPs and ipFamilies are\n                            governed by the ipFamilyPolicy field.\n                          items:\n                            description: |-\n                              IPFamily represents the IP Family (IPv4 or IPv6). This type is used\n                              to express the family of an IP expressed by a type (e.g. service.spec.ipFamilies).\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        ipFamilyPolicy:\n                          description: |-\n                            IPFamilyPolicy represents the dual-stack-ness requested or required by\n                            this Service. If there is no value provided, then this field will be set\n                            to SingleStack. Services can be \"SingleStack\" (a single IP family),\n                            \"PreferDualStack\" (two IP families on dual-stack configured clusters or\n                            a single IP family on single-stack clusters), or \"RequireDualStack\"\n                            (two IP families on dual-stack configured clusters, otherwise fail). The\n                            ipFamilies and clusterIPs fields depend on the value of this field. This\n                            field will be wiped when updating a service to type ExternalName.\n                          type: string\n                        loadBalancerClass:\n                          description: |-\n                            loadBalancerClass is the class of the load balancer implementation this Service belongs to.\n                            If specified, the value of this field must be a label-style identifier, with an optional prefix,\n                            e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users.\n                            This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load\n                            balancer implementation is used, today this is typically done through the cloud provider integration,\n                            but should apply for any default implementation. If set, it is assumed that a load balancer\n                            implementation is watching for Services with a matching class. Any default load balancer\n                            implementation (e.g. cloud providers) should ignore Services that set this field.\n                            This field can only be set when creating or updating a Service to type 'LoadBalancer'.\n                            Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.\n                          type: string\n                        loadBalancerIP:\n                          description: |-\n                            Only applies to Service Type: LoadBalancer.\n                            This feature depends on whether the underlying cloud-provider supports specifying\n                            the loadBalancerIP when a load balancer is created.\n                            This field will be ignored if the cloud-provider does not support the feature.\n                            Deprecated: This field was under-specified and its meaning varies across implementations.\n                            Using it is non-portable and it may not support dual-stack.\n                            Users are encouraged to use implementation-specific annotations when available.\n                          type: string\n                        loadBalancerSourceRanges:\n                          description: |-\n                            If specified and supported by the platform, this will restrict traffic through the cloud-provider\n                            load-balancer will be restricted to the specified client IPs. This field will be ignored if the\n                            cloud-provider does not support the feature.\"\n                            More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/\n                          items:\n                            type: string\n                          type: array\n                        ports:\n                          description: |-\n                            The list of ports that are exposed by this service.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            description: ServicePort contains information on service's\n                              port.\n                            properties:\n                              appProtocol:\n                                description: |-\n                                  The application protocol for this port.\n                                  This is used as a hint for implementations to offer richer behavior for protocols that they understand.\n                                  This field follows standard Kubernetes label syntax.\n                                  Valid values are either:\n\n\n                                  * Un-prefixed protocol names - reserved for IANA standard service names (as per\n                                  RFC-6335 and https://www.iana.org/assignments/service-names).\n\n\n                                  * Kubernetes-defined prefixed names:\n                                    * 'kubernetes.io/h2c' - HTTP/2 prior knowledge over cleartext as described in https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior-\n                                    * 'kubernetes.io/ws'  - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n                                    * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n\n                                  * Other protocols should use implementation-defined prefixed names such as\n                                  mycompany.com/my-custom-protocol.\n                                type: string\n                              name:\n                                description: |-\n                                  The name of this port within the service. This must be a DNS_LABEL.\n                                  All ports within a ServiceSpec must have unique names. When considering\n                                  the endpoints for a Service, this must match the 'name' field in the\n                                  EndpointPort.\n                                  Optional if only one ServicePort is defined on this service.\n                                type: string\n                              nodePort:\n                                description: |-\n                                  The port on each node on which this service is exposed when type is\n                                  NodePort or LoadBalancer.  Usually assigned by the system. If a value is\n                                  specified, in-range, and not in use it will be used, otherwise the\n                                  operation will fail.  If not specified, a port will be allocated if this\n                                  Service requires one.  If this field is specified when creating a\n                                  Service which does not need it, creation will fail. This field will be\n                                  wiped when updating a Service to no longer need it (e.g. changing type\n                                  from NodePort to ClusterIP).\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n                                format: int32\n                                type: integer\n                              port:\n                                description: The port that will be exposed by this\n                                  service.\n                                format: int32\n                                type: integer\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\".\n                                  Default is TCP.\n                                type: string\n                              targetPort:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Number or name of the port to access on the pods targeted by the service.\n                                  Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.\n                                  If this is a string, it will be looked up as a named port in the\n                                  target Pod's container ports. If this is not specified, the value\n                                  of the 'port' field is used (an identity map).\n                                  This field is ignored for services with clusterIP=None, and should be\n                                  omitted or set equal to the 'port' field.\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service\n                                x-kubernetes-int-or-string: true\n                            required:\n                            - port\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - port\n                          - protocol\n                          x-kubernetes-list-type: map\n                        publishNotReadyAddresses:\n                          description: |-\n                            publishNotReadyAddresses indicates that any agent which deals with endpoints for this\n                            Service should disregard any indications of ready/not-ready.\n                            The primary use case for setting this field is for a StatefulSet's Headless Service to\n                            propagate SRV DNS records for its Pods for the purpose of peer discovery.\n                            The Kubernetes controllers that generate Endpoints and EndpointSlice resources for\n                            Services interpret this to mean that all endpoints are considered \"ready\" even if the\n                            Pods themselves are not. Agents which consume only Kubernetes generated endpoints\n                            through the Endpoints or EndpointSlice resources can safely assume this behavior.\n                          type: boolean\n                        selector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            Route service traffic to pods with label keys and values matching this\n                            selector. If empty or not present, the service is assumed to have an\n                            external process managing its endpoints, which Kubernetes will not\n                            modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.\n                            Ignored if type is ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        sessionAffinity:\n                          description: |-\n                            Supports \"ClientIP\" and \"None\". Used to maintain session affinity.\n                            Enable client IP based session affinity.\n                            Must be ClientIP or None.\n                            Defaults to None.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        sessionAffinityConfig:\n                          description: sessionAffinityConfig contains the configurations\n                            of session affinity.\n                          properties:\n                            clientIP:\n                              description: clientIP contains the configurations of\n                                Client IP based session affinity.\n                              properties:\n                                timeoutSeconds:\n                                  description: |-\n                                    timeoutSeconds specifies the seconds of ClientIP type session sticky time.\n                                    The value must be >0 && <=86400(for 1 day) if ServiceAffinity == \"ClientIP\".\n                                    Default value is 10800(for 3 hours).\n                                  format: int32\n                                  type: integer\n                              type: object\n                          type: object\n                        type:\n                          description: |-\n                            type determines how the Service is exposed. Defaults to ClusterIP. Valid\n                            options are ExternalName, ClusterIP, NodePort, and LoadBalancer.\n                            \"ClusterIP\" allocates a cluster-internal IP address for load-balancing\n                            to endpoints. Endpoints are determined by the selector or if that is not\n                            specified, by manual construction of an Endpoints object or\n                            EndpointSlice objects. If clusterIP is \"None\", no virtual IP is\n                            allocated and the endpoints are published as a set of endpoints rather\n                            than a virtual IP.\n                            \"NodePort\" builds on ClusterIP and allocates a port on every node which\n                            routes to the same endpoints as the clusterIP.\n                            \"LoadBalancer\" builds on NodePort and creates an external load-balancer\n                            (if supported in the current cloud) which routes to the same endpoints\n                            as the clusterIP.\n                            \"ExternalName\" aliases this service to the specified externalName.\n                            Several other fields do not apply to ExternalName services.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types\n                          type: string\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              sidecars:\n                description: Specifies the sidecars to be injected into the Component.\n                items:\n                  properties:\n                    name:\n                      description: |-\n                        Name specifies the unique name of the sidecar.\n\n\n                        The name will be used as the name of the sidecar container in the Pod.\n                      type: string\n                    owner:\n                      description: |-\n                        Specifies the exact component definition that the sidecar belongs to.\n\n\n                        A sidecar will be updated when the owner component definition is updated only.\n                      type: string\n                    sidecarDef:\n                      description: Specifies the sidecar definition CR to be used\n                        to create the sidecar.\n                      type: string\n                  required:\n                  - name\n                  - owner\n                  - sidecarDef\n                  type: object\n                type: array\n              stop:\n                description: |-\n                  Stop the Component.\n                  If set, all the computing resources will be released.\n                type: boolean\n              systemAccounts:\n                description: Overrides system accounts defined in referenced ComponentDefinition.\n                items:\n                  properties:\n                    disabled:\n                      default: false\n                      description: Specifies whether the system account is disabled.\n                      type: boolean\n                    name:\n                      description: The name of the system account.\n                      type: string\n                    passwordConfig:\n                      description: |-\n                        Specifies the policy for generating the account's password.\n\n\n                        This field is immutable once set.\n                      properties:\n                        length:\n                          default: 16\n                          description: The length of the password.\n                          format: int32\n                          maximum: 32\n                          minimum: 8\n                          type: integer\n                        letterCase:\n                          default: MixedCases\n                          description: The case of the letters in the password.\n                          enum:\n                          - LowerCases\n                          - UpperCases\n                          - MixedCases\n                          type: string\n                        numDigits:\n                          default: 4\n                          description: The number of digits in the password.\n                          format: int32\n                          maximum: 8\n                          minimum: 0\n                          type: integer\n                        numSymbols:\n                          default: 0\n                          description: The number of symbols in the password.\n                          format: int32\n                          maximum: 8\n                          minimum: 0\n                          type: integer\n                        seed:\n                          description: |-\n                            Seed to generate the account's password.\n                            Cannot be updated.\n                          type: string\n                        symbolCharacters:\n                          description: |-\n                            The set of symbols allowed when generating password. If empty, kubeblocks will\n                            use a default symbol set, which is \"!@#&*\".\n                          type: string\n                      type: object\n                    secretRef:\n                      description: |-\n                        Refers to the secret from which data will be copied to create the new account.\n\n\n                        For user-specified passwords, the maximum length is limited to 64 bytes.\n\n\n                        This field is immutable once set.\n                      properties:\n                        name:\n                          description: The unique identifier of the secret.\n                          type: string\n                        namespace:\n                          description: The namespace where the secret is located.\n                          type: string\n                        password:\n                          default: password\n                          description: The key in the secret data that contains the\n                            password.\n                          type: string\n                      required:\n                      - name\n                      - namespace\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              terminationPolicy:\n                default: Delete\n                description: Specifies the behavior when a Component is deleted.\n                enum:\n                - DoNotTerminate\n                - Delete\n                - WipeOut\n                type: string\n              tlsConfig:\n                description: \"Specifies the TLS configuration for the Component, including:\\n\\n\\n-\n                  A boolean flag that indicates whether the Component should use Transport\n                  Layer Security (TLS) for secure communication.\\n- An optional field\n                  that specifies the configuration for the TLS certificates issuer\n                  when TLS is enabled.\\n  It allows defining the issuer name and the\n                  reference to the secret containing the TLS certificates and key.\\n\\t\n                  The secret should contain the CA certificate, TLS certificate, and\n                  private key in the specified keys.\"\n                properties:\n                  enable:\n                    default: false\n                    description: |-\n                      A boolean flag that indicates whether the Component should use Transport Layer Security (TLS)\n                      for secure communication.\n                      When set to true, the Component will be configured to use TLS encryption for its network connections.\n                      This ensures that the data transmitted between the Component and its clients or other Components is encrypted\n                      and protected from unauthorized access.\n                      If TLS is enabled, the Component may require additional configuration,\n                      such as specifying TLS certificates and keys, to properly set up the secure communication channel.\n                    type: boolean\n                  issuer:\n                    description: |-\n                      Specifies the configuration for the TLS certificates issuer.\n                      It allows defining the issuer name and the reference to the secret containing the TLS certificates and key.\n                      The secret should contain the CA certificate, TLS certificate, and private key in the specified keys.\n                      Required when TLS is enabled.\n                    properties:\n                      name:\n                        allOf:\n                        - enum:\n                          - KubeBlocks\n                          - UserProvided\n                        - enum:\n                          - KubeBlocks\n                          - UserProvided\n                        default: KubeBlocks\n                        description: |-\n                          The issuer for TLS certificates.\n                          It only allows two enum values: `KubeBlocks` and `UserProvided`.\n\n\n                          - `KubeBlocks` indicates that the self-signed TLS certificates generated by the KubeBlocks Operator will be used.\n                          - `UserProvided` means that the user is responsible for providing their own CA, Cert, and Key.\n                            In this case, the user-provided CA certificate, server certificate, and private key will be used\n                            for TLS communication.\n                        type: string\n                      secretRef:\n                        description: |-\n                          SecretRef is the reference to the secret that contains user-provided certificates.\n                          It is required when the issuer is set to `UserProvided`.\n                        properties:\n                          ca:\n                            description: Key of CA cert in Secret\n                            type: string\n                          cert:\n                            description: Key of Cert in Secret\n                            type: string\n                          key:\n                            description: Key of TLS private key in Secret\n                            type: string\n                          name:\n                            description: Name of the Secret that contains user-provided\n                              certificates.\n                            type: string\n                          namespace:\n                            description: |-\n                              The namespace where the secret is located.\n                              If not provided, the secret is assumed to be in the same namespace as the Cluster object.\n                            type: string\n                        required:\n                        - ca\n                        - cert\n                        - key\n                        - name\n                        type: object\n                    required:\n                    - name\n                    type: object\n                type: object\n              volumeClaimTemplates:\n                description: |-\n                  Specifies a list of PersistentVolumeClaim templates that define the storage requirements for the Component.\n                  Each template specifies the desired characteristics of a persistent volume, such as storage class,\n                  size, and access modes.\n                  These templates are used to dynamically provision persistent volumes for the Component.\n                items:\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: Specifies the annotations for the PVC of the volume.\n                      type: object\n                    labels:\n                      additionalProperties:\n                        type: string\n                      description: Specifies the labels for the PVC of the volume.\n                      type: object\n                    name:\n                      description: |-\n                        Refers to the name of a volumeMount defined in either:\n\n\n                        - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                        - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                        The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                      type: string\n                    spec:\n                      description: |-\n                        Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                        with the mount name specified in the `name` field.\n\n\n                        When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                        defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                      properties:\n                        accessModes:\n                          description: |-\n                            Contains the desired access modes the volume should have.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-preserve-unknown-fields: true\n                        resources:\n                          description: |-\n                            Represents the minimum resources the volume should have.\n                            If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                            are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                          properties:\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                          x-kubernetes-preserve-unknown-fields: true\n                        storageClassName:\n                          description: |-\n                            The name of the StorageClass required by the claim.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                          type: string\n                        volumeAttributesClassName:\n                          description: |-\n                            volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n\n\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                          type: string\n                        volumeMode:\n                          description: Defines what type of volume is required by\n                            the claim, either Block or Filesystem.\n                          type: string\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              volumes:\n                description: List of volumes to override.\n                items:\n                  description: Volume represents a named volume in a pod that may\n                    be accessed by any container in the pod.\n                  properties:\n                    awsElasticBlockStore:\n                      description: |-\n                        awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                        kubelet's host machine and then exposed to the pod.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type of the volume that you want to mount.\n                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        partition:\n                          description: |-\n                            partition is the partition in the volume that you want to mount.\n                            If omitted, the default is to mount by volume name.\n                            Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                            Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                          format: int32\n                          type: integer\n                        readOnly:\n                          description: |-\n                            readOnly value true will force the readOnly setting in VolumeMounts.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                          type: boolean\n                        volumeID:\n                          description: |-\n                            volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                          type: string\n                      required:\n                      - volumeID\n                      type: object\n                    azureDisk:\n                      description: azureDisk represents an Azure Data Disk mount on\n                        the host and bind mount to the pod.\n                      properties:\n                        cachingMode:\n                          description: 'cachingMode is the Host Caching mode: None,\n                            Read Only, Read Write.'\n                          type: string\n                        diskName:\n                          description: diskName is the Name of the data disk in the\n                            blob storage\n                          type: string\n                        diskURI:\n                          description: diskURI is the URI of data disk in the blob\n                            storage\n                          type: string\n                        fsType:\n                          description: |-\n                            fsType is Filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        kind:\n                          description: 'kind expected values are Shared: multiple\n                            blob disks per storage account  Dedicated: single blob\n                            disk per storage account  Managed: azure managed data\n                            disk (only in managed availability set). defaults to shared'\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly Defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                      required:\n                      - diskName\n                      - diskURI\n                      type: object\n                    azureFile:\n                      description: azureFile represents an Azure File Service mount\n                        on the host and bind mount to the pod.\n                      properties:\n                        readOnly:\n                          description: |-\n                            readOnly defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        secretName:\n                          description: secretName is the  name of secret that contains\n                            Azure Storage Account Name and Key\n                          type: string\n                        shareName:\n                          description: shareName is the azure share Name\n                          type: string\n                      required:\n                      - secretName\n                      - shareName\n                      type: object\n                    cephfs:\n                      description: cephFS represents a Ceph FS mount on the host that\n                        shares a pod's lifetime\n                      properties:\n                        monitors:\n                          description: |-\n                            monitors is Required: Monitors is a collection of Ceph monitors\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          items:\n                            type: string\n                          type: array\n                        path:\n                          description: 'path is Optional: Used as the mounted root,\n                            rather than the full Ceph tree, default is /'\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          type: boolean\n                        secretFile:\n                          description: |-\n                            secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          type: string\n                        secretRef:\n                          description: |-\n                            secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        user:\n                          description: |-\n                            user is optional: User is the rados user name, default is admin\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          type: string\n                      required:\n                      - monitors\n                      type: object\n                    cinder:\n                      description: |-\n                        cinder represents a cinder volume attached and mounted on kubelets host machine.\n                        More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef is optional: points to a secret object containing parameters used to connect\n                            to OpenStack.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        volumeID:\n                          description: |-\n                            volumeID used to identify the volume in cinder.\n                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                          type: string\n                      required:\n                      - volumeID\n                      type: object\n                    configMap:\n                      description: configMap represents a configMap that should populate\n                        this volume\n                      properties:\n                        defaultMode:\n                          description: |-\n                            defaultMode is optional: mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                            Defaults to 0644.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        items:\n                          description: |-\n                            items if unspecified, each key-value pair in the Data field of the referenced\n                            ConfigMap will be projected into the volume as a file whose name is the\n                            key and content is the value. If specified, the listed keys will be\n                            projected into the specified paths, and unlisted keys will not be\n                            present. If a key is specified which is not present in the ConfigMap,\n                            the volume setup will error unless it is marked optional. Paths must be\n                            relative and may not contain the '..' path or start with '..'.\n                          items:\n                            description: Maps a string key to a path within a volume.\n                            properties:\n                              key:\n                                description: key is the key to project.\n                                type: string\n                              mode:\n                                description: |-\n                                  mode is Optional: mode bits used to set permissions on this file.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  If not specified, the volume defaultMode will be used.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              path:\n                                description: |-\n                                  path is the relative path of the file to map the key to.\n                                  May not be an absolute path.\n                                  May not contain the path element '..'.\n                                  May not start with the string '..'.\n                                type: string\n                            required:\n                            - key\n                            - path\n                            type: object\n                          type: array\n                        name:\n                          description: |-\n                            Name of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            TODO: Add other useful fields. apiVersion, kind, uid?\n                          type: string\n                        optional:\n                          description: optional specify whether the ConfigMap or its\n                            keys must be defined\n                          type: boolean\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    csi:\n                      description: csi (Container Storage Interface) represents ephemeral\n                        storage that is handled by certain external CSI drivers (Beta\n                        feature).\n                      properties:\n                        driver:\n                          description: |-\n                            driver is the name of the CSI driver that handles this volume.\n                            Consult with your admin for the correct name as registered in the cluster.\n                          type: string\n                        fsType:\n                          description: |-\n                            fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                            If not provided, the empty value is passed to the associated CSI driver\n                            which will determine the default filesystem to apply.\n                          type: string\n                        nodePublishSecretRef:\n                          description: |-\n                            nodePublishSecretRef is a reference to the secret object containing\n                            sensitive information to pass to the CSI driver to complete the CSI\n                            NodePublishVolume and NodeUnpublishVolume calls.\n                            This field is optional, and  may be empty if no secret is required. If the\n                            secret object contains more than one secret, all secret references are passed.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        readOnly:\n                          description: |-\n                            readOnly specifies a read-only configuration for the volume.\n                            Defaults to false (read/write).\n                          type: boolean\n                        volumeAttributes:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            volumeAttributes stores driver-specific properties that are passed to the CSI\n                            driver. Consult your driver's documentation for supported values.\n                          type: object\n                      required:\n                      - driver\n                      type: object\n                    downwardAPI:\n                      description: downwardAPI represents downward API about the pod\n                        that should populate this volume\n                      properties:\n                        defaultMode:\n                          description: |-\n                            Optional: mode bits to use on created files by default. Must be a\n                            Optional: mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                            Defaults to 0644.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        items:\n                          description: Items is a list of downward API volume file\n                          items:\n                            description: DownwardAPIVolumeFile represents information\n                              to create the file containing the pod field\n                            properties:\n                              fieldRef:\n                                description: 'Required: Selects a field of the pod:\n                                  only annotations, labels, name and namespace are\n                                  supported.'\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              mode:\n                                description: |-\n                                  Optional: mode bits used to set permissions on this file, must be an octal value\n                                  between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  If not specified, the volume defaultMode will be used.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              path:\n                                description: 'Required: Path is  the relative path\n                                  name of the file to be created. Must not be absolute\n                                  or contain the ''..'' path. Must be utf-8 encoded.\n                                  The first item of the relative path must not start\n                                  with ''..'''\n                                type: string\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            required:\n                            - path\n                            type: object\n                          type: array\n                      type: object\n                    emptyDir:\n                      description: |-\n                        emptyDir represents a temporary directory that shares a pod's lifetime.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                      properties:\n                        medium:\n                          description: |-\n                            medium represents what type of storage medium should back this directory.\n                            The default is \"\" which means to use the node's default medium.\n                            Must be an empty string (default) or Memory.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                          type: string\n                        sizeLimit:\n                          anyOf:\n                          - type: integer\n                          - type: string\n                          description: |-\n                            sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                            The size limit is also applicable for memory medium.\n                            The maximum usage on memory medium EmptyDir would be the minimum value between\n                            the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                            The default is nil which means that the limit is undefined.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                          x-kubernetes-int-or-string: true\n                      type: object\n                    ephemeral:\n                      description: |-\n                        ephemeral represents a volume that is handled by a cluster storage driver.\n                        The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                        and deleted when the pod is removed.\n\n\n                        Use this if:\n                        a) the volume is only needed while the pod runs,\n                        b) features of normal volumes like restoring from snapshot or capacity\n                           tracking are needed,\n                        c) the storage driver is specified through a storage class, and\n                        d) the storage driver supports dynamic volume provisioning through\n                           a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                           information on the connection between this volume type\n                           and PersistentVolumeClaim).\n\n\n                        Use PersistentVolumeClaim or one of the vendor-specific\n                        APIs for volumes that persist for longer than the lifecycle\n                        of an individual pod.\n\n\n                        Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                        be used that way - see the documentation of the driver for\n                        more information.\n\n\n                        A pod can use both types of ephemeral volumes and\n                        persistent volumes at the same time.\n                      properties:\n                        volumeClaimTemplate:\n                          description: |-\n                            Will be used to create a stand-alone PVC to provision the volume.\n                            The pod in which this EphemeralVolumeSource is embedded will be the\n                            owner of the PVC, i.e. the PVC will be deleted together with the\n                            pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                            `<volume name>` is the name from the `PodSpec.Volumes` array\n                            entry. Pod validation will reject the pod if the concatenated name\n                            is not valid for a PVC (for example, too long).\n\n\n                            An existing PVC with that name that is not owned by the pod\n                            will *not* be used for the pod to avoid using an unrelated\n                            volume by mistake. Starting the pod is then blocked until\n                            the unrelated PVC is removed. If such a pre-created PVC is\n                            meant to be used by the pod, the PVC has to updated with an\n                            owner reference to the pod once the pod exists. Normally\n                            this should not be necessary, but it may be useful when\n                            manually reconstructing a broken cluster.\n\n\n                            This field is read-only and no changes will be made by Kubernetes\n                            to the PVC after it has been created.\n\n\n                            Required, must not be nil.\n                          properties:\n                            metadata:\n                              description: |-\n                                May contain labels and annotations that will be copied into the PVC\n                                when creating it. No other fields are allowed and will be rejected during\n                                validation.\n                              properties:\n                                annotations:\n                                  additionalProperties:\n                                    type: string\n                                  type: object\n                                finalizers:\n                                  items:\n                                    type: string\n                                  type: array\n                                labels:\n                                  additionalProperties:\n                                    type: string\n                                  type: object\n                                name:\n                                  type: string\n                                namespace:\n                                  type: string\n                              type: object\n                            spec:\n                              description: |-\n                                The specification for the PersistentVolumeClaim. The entire content is\n                                copied unchanged into the PVC that gets created from this\n                                template. The same fields as in a PersistentVolumeClaim\n                                are also valid here.\n                              properties:\n                                accessModes:\n                                  description: |-\n                                    accessModes contains the desired access modes the volume should have.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                  items:\n                                    type: string\n                                  type: array\n                                dataSource:\n                                  description: |-\n                                    dataSource field can be used to specify either:\n                                    * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                    * An existing PVC (PersistentVolumeClaim)\n                                    If the provisioner or an external controller can support the specified data source,\n                                    it will create a new volume based on the contents of the specified data source.\n                                    When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                    and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                    If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                  properties:\n                                    apiGroup:\n                                      description: |-\n                                        APIGroup is the group for the resource being referenced.\n                                        If APIGroup is not specified, the specified Kind must be in the core API group.\n                                        For any other third-party types, APIGroup is required.\n                                      type: string\n                                    kind:\n                                      description: Kind is the type of resource being\n                                        referenced\n                                      type: string\n                                    name:\n                                      description: Name is the name of resource being\n                                        referenced\n                                      type: string\n                                  required:\n                                  - kind\n                                  - name\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                dataSourceRef:\n                                  description: |-\n                                    dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                    volume is desired. This may be any object from a non-empty API group (non\n                                    core object) or a PersistentVolumeClaim object.\n                                    When this field is specified, volume binding will only succeed if the type of\n                                    the specified object matches some installed volume populator or dynamic\n                                    provisioner.\n                                    This field will replace the functionality of the dataSource field and as such\n                                    if both fields are non-empty, they must have the same value. For backwards\n                                    compatibility, when namespace isn't specified in dataSourceRef,\n                                    both fields (dataSource and dataSourceRef) will be set to the same\n                                    value automatically if one of them is empty and the other is non-empty.\n                                    When namespace is specified in dataSourceRef,\n                                    dataSource isn't set to the same value and must be empty.\n                                    There are three important differences between dataSource and dataSourceRef:\n                                    * While dataSource only allows two specific types of objects, dataSourceRef\n                                      allows any non-core object, as well as PersistentVolumeClaim objects.\n                                    * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                      preserves all values, and generates an error if a disallowed value is\n                                      specified.\n                                    * While dataSource only allows local objects, dataSourceRef allows objects\n                                      in any namespaces.\n                                    (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                    (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                  properties:\n                                    apiGroup:\n                                      description: |-\n                                        APIGroup is the group for the resource being referenced.\n                                        If APIGroup is not specified, the specified Kind must be in the core API group.\n                                        For any other third-party types, APIGroup is required.\n                                      type: string\n                                    kind:\n                                      description: Kind is the type of resource being\n                                        referenced\n                                      type: string\n                                    name:\n                                      description: Name is the name of resource being\n                                        referenced\n                                      type: string\n                                    namespace:\n                                      description: |-\n                                        Namespace is the namespace of resource being referenced\n                                        Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                        (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                      type: string\n                                  required:\n                                  - kind\n                                  - name\n                                  type: object\n                                resources:\n                                  description: |-\n                                    resources represents the minimum resources the volume should have.\n                                    If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                    that are lower than previous value but must still be higher than capacity recorded in the\n                                    status field of the claim.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                  properties:\n                                    limits:\n                                      additionalProperties:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      description: |-\n                                        Limits describes the maximum amount of compute resources allowed.\n                                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                      type: object\n                                    requests:\n                                      additionalProperties:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      description: |-\n                                        Requests describes the minimum amount of compute resources required.\n                                        If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                        otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                      type: object\n                                  type: object\n                                selector:\n                                  description: selector is a label query over volumes\n                                    to consider for binding.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                storageClassName:\n                                  description: |-\n                                    storageClassName is the name of the StorageClass required by the claim.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                  type: string\n                                volumeAttributesClassName:\n                                  description: |-\n                                    volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                    If specified, the CSI driver will create or update the volume with the attributes defined\n                                    in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                    it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                    will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                    If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                    will be set by the persistentvolume controller if it exists.\n                                    If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                    set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                    exists.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                    (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                  type: string\n                                volumeMode:\n                                  description: |-\n                                    volumeMode defines what type of volume is required by the claim.\n                                    Value of Filesystem is implied when not included in claim spec.\n                                  type: string\n                                volumeName:\n                                  description: volumeName is the binding reference\n                                    to the PersistentVolume backing this claim.\n                                  type: string\n                              type: object\n                          required:\n                          - spec\n                          type: object\n                      type: object\n                    fc:\n                      description: fc represents a Fibre Channel resource that is\n                        attached to a kubelet's host machine and then exposed to the\n                        pod.\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        lun:\n                          description: 'lun is Optional: FC target lun number'\n                          format: int32\n                          type: integer\n                        readOnly:\n                          description: |-\n                            readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        targetWWNs:\n                          description: 'targetWWNs is Optional: FC target worldwide\n                            names (WWNs)'\n                          items:\n                            type: string\n                          type: array\n                        wwids:\n                          description: |-\n                            wwids Optional: FC volume world wide identifiers (wwids)\n                            Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                          items:\n                            type: string\n                          type: array\n                      type: object\n                    flexVolume:\n                      description: |-\n                        flexVolume represents a generic volume resource that is\n                        provisioned/attached using an exec based plugin.\n                      properties:\n                        driver:\n                          description: driver is the name of the driver to use for\n                            this volume.\n                          type: string\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                          type: string\n                        options:\n                          additionalProperties:\n                            type: string\n                          description: 'options is Optional: this field holds extra\n                            command options if any.'\n                          type: object\n                        readOnly:\n                          description: |-\n                            readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef is Optional: secretRef is reference to the secret object containing\n                            sensitive information to pass to the plugin scripts. This may be\n                            empty if no secret object is specified. If the secret object\n                            contains more than one secret, all secrets are passed to the plugin\n                            scripts.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                      required:\n                      - driver\n                      type: object\n                    flocker:\n                      description: flocker represents a Flocker volume attached to\n                        a kubelet's host machine. This depends on the Flocker control\n                        service being running\n                      properties:\n                        datasetName:\n                          description: |-\n                            datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                            should be considered as deprecated\n                          type: string\n                        datasetUUID:\n                          description: datasetUUID is the UUID of the dataset. This\n                            is unique identifier of a Flocker dataset\n                          type: string\n                      type: object\n                    gcePersistentDisk:\n                      description: |-\n                        gcePersistentDisk represents a GCE Disk resource that is attached to a\n                        kubelet's host machine and then exposed to the pod.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is filesystem type of the volume that you want to mount.\n                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        partition:\n                          description: |-\n                            partition is the partition in the volume that you want to mount.\n                            If omitted, the default is to mount by volume name.\n                            Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                            Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                          format: int32\n                          type: integer\n                        pdName:\n                          description: |-\n                            pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the ReadOnly setting in VolumeMounts.\n                            Defaults to false.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                          type: boolean\n                      required:\n                      - pdName\n                      type: object\n                    gitRepo:\n                      description: |-\n                        gitRepo represents a git repository at a particular revision.\n                        DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                        EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                        into the Pod's container.\n                      properties:\n                        directory:\n                          description: |-\n                            directory is the target directory name.\n                            Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                            git repository.  Otherwise, if specified, the volume will contain the git repository in\n                            the subdirectory with the given name.\n                          type: string\n                        repository:\n                          description: repository is the URL\n                          type: string\n                        revision:\n                          description: revision is the commit hash for the specified\n                            revision.\n                          type: string\n                      required:\n                      - repository\n                      type: object\n                    glusterfs:\n                      description: |-\n                        glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                        More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                      properties:\n                        endpoints:\n                          description: |-\n                            endpoints is the endpoint name that details Glusterfs topology.\n                            More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                          type: string\n                        path:\n                          description: |-\n                            path is the Glusterfs volume path.\n                            More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                            Defaults to false.\n                            More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                          type: boolean\n                      required:\n                      - endpoints\n                      - path\n                      type: object\n                    hostPath:\n                      description: |-\n                        hostPath represents a pre-existing file or directory on the host\n                        machine that is directly exposed to the container. This is generally\n                        used for system agents or other privileged things that are allowed\n                        to see the host machine. Most containers will NOT need this.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                        ---\n                        TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                        mount host directories as read/write.\n                      properties:\n                        path:\n                          description: |-\n                            path of the directory on the host.\n                            If the path is a symlink, it will follow the link to the real path.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                          type: string\n                        type:\n                          description: |-\n                            type for HostPath Volume\n                            Defaults to \"\"\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                          type: string\n                      required:\n                      - path\n                      type: object\n                    iscsi:\n                      description: |-\n                        iscsi represents an ISCSI Disk resource that is attached to a\n                        kubelet's host machine and then exposed to the pod.\n                        More info: https://examples.k8s.io/volumes/iscsi/README.md\n                      properties:\n                        chapAuthDiscovery:\n                          description: chapAuthDiscovery defines whether support iSCSI\n                            Discovery CHAP authentication\n                          type: boolean\n                        chapAuthSession:\n                          description: chapAuthSession defines whether support iSCSI\n                            Session CHAP authentication\n                          type: boolean\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type of the volume that you want to mount.\n                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        initiatorName:\n                          description: |-\n                            initiatorName is the custom iSCSI Initiator Name.\n                            If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                            <target portal>:<volume name> will be created for the connection.\n                          type: string\n                        iqn:\n                          description: iqn is the target iSCSI Qualified Name.\n                          type: string\n                        iscsiInterface:\n                          description: |-\n                            iscsiInterface is the interface Name that uses an iSCSI transport.\n                            Defaults to 'default' (tcp).\n                          type: string\n                        lun:\n                          description: lun represents iSCSI Target Lun number.\n                          format: int32\n                          type: integer\n                        portals:\n                          description: |-\n                            portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                            is other than default (typically TCP ports 860 and 3260).\n                          items:\n                            type: string\n                          type: array\n                        readOnly:\n                          description: |-\n                            readOnly here will force the ReadOnly setting in VolumeMounts.\n                            Defaults to false.\n                          type: boolean\n                        secretRef:\n                          description: secretRef is the CHAP Secret for iSCSI target\n                            and initiator authentication\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        targetPortal:\n                          description: |-\n                            targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                            is other than default (typically TCP ports 860 and 3260).\n                          type: string\n                      required:\n                      - iqn\n                      - lun\n                      - targetPortal\n                      type: object\n                    name:\n                      description: |-\n                        name of the volume.\n                        Must be a DNS_LABEL and unique within the pod.\n                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                      type: string\n                    nfs:\n                      description: |-\n                        nfs represents an NFS mount on the host that shares a pod's lifetime\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                      properties:\n                        path:\n                          description: |-\n                            path that is exported by the NFS server.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the NFS export to be mounted with read-only permissions.\n                            Defaults to false.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                          type: boolean\n                        server:\n                          description: |-\n                            server is the hostname or IP address of the NFS server.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                          type: string\n                      required:\n                      - path\n                      - server\n                      type: object\n                    persistentVolumeClaim:\n                      description: |-\n                        persistentVolumeClaimVolumeSource represents a reference to a\n                        PersistentVolumeClaim in the same namespace.\n                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                      properties:\n                        claimName:\n                          description: |-\n                            claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly Will force the ReadOnly setting in VolumeMounts.\n                            Default false.\n                          type: boolean\n                      required:\n                      - claimName\n                      type: object\n                    photonPersistentDisk:\n                      description: photonPersistentDisk represents a PhotonController\n                        persistent disk attached and mounted on kubelets host machine\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        pdID:\n                          description: pdID is the ID that identifies Photon Controller\n                            persistent disk\n                          type: string\n                      required:\n                      - pdID\n                      type: object\n                    portworxVolume:\n                      description: portworxVolume represents a portworx volume attached\n                        and mounted on kubelets host machine\n                      properties:\n                        fsType:\n                          description: |-\n                            fSType represents the filesystem type to mount\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        volumeID:\n                          description: volumeID uniquely identifies a Portworx volume\n                          type: string\n                      required:\n                      - volumeID\n                      type: object\n                    projected:\n                      description: projected items for all in one resources secrets,\n                        configmaps, and downward API\n                      properties:\n                        defaultMode:\n                          description: |-\n                            defaultMode are the mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        sources:\n                          description: sources is the list of volume projections\n                          items:\n                            description: Projection that may be projected along with\n                              other supported volume types\n                            properties:\n                              clusterTrustBundle:\n                                description: |-\n                                  ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                  of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                  Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                  ClusterTrustBundle objects can either be selected by name, or by the\n                                  combination of signer name and a label selector.\n\n\n                                  Kubelet performs aggressive normalization of the PEM contents written\n                                  into the pod filesystem.  Esoteric PEM features such as inter-block\n                                  comments and block headers are stripped.  Certificates are deduplicated.\n                                  The ordering of certificates within the file is arbitrary, and Kubelet\n                                  may change the order over time.\n                                properties:\n                                  labelSelector:\n                                    description: |-\n                                      Select all ClusterTrustBundles that match this label selector.  Only has\n                                      effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                      interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                      everything\".\n                                    properties:\n                                      matchExpressions:\n                                        description: matchExpressions is a list of\n                                          label selector requirements. The requirements\n                                          are ANDed.\n                                        items:\n                                          description: |-\n                                            A label selector requirement is a selector that contains values, a key, and an operator that\n                                            relates the key and values.\n                                          properties:\n                                            key:\n                                              description: key is the label key that\n                                                the selector applies to.\n                                              type: string\n                                            operator:\n                                              description: |-\n                                                operator represents a key's relationship to a set of values.\n                                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                                              type: string\n                                            values:\n                                              description: |-\n                                                values is an array of string values. If the operator is In or NotIn,\n                                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                the values array must be empty. This array is replaced during a strategic\n                                                merge patch.\n                                              items:\n                                                type: string\n                                              type: array\n                                          required:\n                                          - key\n                                          - operator\n                                          type: object\n                                        type: array\n                                      matchLabels:\n                                        additionalProperties:\n                                          type: string\n                                        description: |-\n                                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                        type: object\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  name:\n                                    description: |-\n                                      Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                      with signerName and labelSelector.\n                                    type: string\n                                  optional:\n                                    description: |-\n                                      If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                      aren't available.  If using name, then the named ClusterTrustBundle is\n                                      allowed not to exist.  If using signerName, then the combination of\n                                      signerName and labelSelector is allowed to match zero\n                                      ClusterTrustBundles.\n                                    type: boolean\n                                  path:\n                                    description: Relative path from the volume root\n                                      to write the bundle.\n                                    type: string\n                                  signerName:\n                                    description: |-\n                                      Select all ClusterTrustBundles that match this signer name.\n                                      Mutually-exclusive with name.  The contents of all selected\n                                      ClusterTrustBundles will be unified and deduplicated.\n                                    type: string\n                                required:\n                                - path\n                                type: object\n                              configMap:\n                                description: configMap information about the configMap\n                                  data to project\n                                properties:\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      ConfigMap will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the ConfigMap,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional specify whether the ConfigMap\n                                      or its keys must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              downwardAPI:\n                                description: downwardAPI information about the downwardAPI\n                                  data to project\n                                properties:\n                                  items:\n                                    description: Items is a list of DownwardAPIVolume\n                                      file\n                                    items:\n                                      description: DownwardAPIVolumeFile represents\n                                        information to create the file containing\n                                        the pod field\n                                      properties:\n                                        fieldRef:\n                                          description: 'Required: Selects a field\n                                            of the pod: only annotations, labels,\n                                            name and namespace are supported.'\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        mode:\n                                          description: |-\n                                            Optional: mode bits used to set permissions on this file, must be an octal value\n                                            between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: 'Required: Path is  the relative\n                                            path name of the file to be created. Must\n                                            not be absolute or contain the ''..''\n                                            path. Must be utf-8 encoded. The first\n                                            item of the relative path must not start\n                                            with ''..'''\n                                          type: string\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      required:\n                                      - path\n                                      type: object\n                                    type: array\n                                type: object\n                              secret:\n                                description: secret information about the secret data\n                                  to project\n                                properties:\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      Secret will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the Secret,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional field specify whether the\n                                      Secret or its key must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              serviceAccountToken:\n                                description: serviceAccountToken is information about\n                                  the serviceAccountToken data to project\n                                properties:\n                                  audience:\n                                    description: |-\n                                      audience is the intended audience of the token. A recipient of a token\n                                      must identify itself with an identifier specified in the audience of the\n                                      token, and otherwise should reject the token. The audience defaults to the\n                                      identifier of the apiserver.\n                                    type: string\n                                  expirationSeconds:\n                                    description: |-\n                                      expirationSeconds is the requested duration of validity of the service\n                                      account token. As the token approaches expiration, the kubelet volume\n                                      plugin will proactively rotate the service account token. The kubelet will\n                                      start trying to rotate the token if the token is older than 80 percent of\n                                      its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                      and must be at least 10 minutes.\n                                    format: int64\n                                    type: integer\n                                  path:\n                                    description: |-\n                                      path is the path relative to the mount point of the file to project the\n                                      token into.\n                                    type: string\n                                required:\n                                - path\n                                type: object\n                            type: object\n                          type: array\n                      type: object\n                    quobyte:\n                      description: quobyte represents a Quobyte mount on the host\n                        that shares a pod's lifetime\n                      properties:\n                        group:\n                          description: |-\n                            group to map volume access to\n                            Default is no group\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                            Defaults to false.\n                          type: boolean\n                        registry:\n                          description: |-\n                            registry represents a single or multiple Quobyte Registry services\n                            specified as a string as host:port pair (multiple entries are separated with commas)\n                            which acts as the central registry for volumes\n                          type: string\n                        tenant:\n                          description: |-\n                            tenant owning the given Quobyte volume in the Backend\n                            Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                          type: string\n                        user:\n                          description: |-\n                            user to map volume access to\n                            Defaults to serivceaccount user\n                          type: string\n                        volume:\n                          description: volume is a string that references an already\n                            created Quobyte volume by name.\n                          type: string\n                      required:\n                      - registry\n                      - volume\n                      type: object\n                    rbd:\n                      description: |-\n                        rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                        More info: https://examples.k8s.io/volumes/rbd/README.md\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type of the volume that you want to mount.\n                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        image:\n                          description: |-\n                            image is the rados image name.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: string\n                        keyring:\n                          description: |-\n                            keyring is the path to key ring for RBDUser.\n                            Default is /etc/ceph/keyring.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: string\n                        monitors:\n                          description: |-\n                            monitors is a collection of Ceph monitors.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          items:\n                            type: string\n                          type: array\n                        pool:\n                          description: |-\n                            pool is the rados pool name.\n                            Default is rbd.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the ReadOnly setting in VolumeMounts.\n                            Defaults to false.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef is name of the authentication secret for RBDUser. If provided\n                            overrides keyring.\n                            Default is nil.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        user:\n                          description: |-\n                            user is the rados user name.\n                            Default is admin.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: string\n                      required:\n                      - image\n                      - monitors\n                      type: object\n                    scaleIO:\n                      description: scaleIO represents a ScaleIO persistent volume\n                        attached and mounted on Kubernetes nodes.\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\".\n                            Default is \"xfs\".\n                          type: string\n                        gateway:\n                          description: gateway is the host address of the ScaleIO\n                            API Gateway.\n                          type: string\n                        protectionDomain:\n                          description: protectionDomain is the name of the ScaleIO\n                            Protection Domain for the configured storage.\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly Defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef references to the secret for ScaleIO user and other\n                            sensitive information. If this is not provided, Login operation will fail.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        sslEnabled:\n                          description: sslEnabled Flag enable/disable SSL communication\n                            with Gateway, default false\n                          type: boolean\n                        storageMode:\n                          description: |-\n                            storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                            Default is ThinProvisioned.\n                          type: string\n                        storagePool:\n                          description: storagePool is the ScaleIO Storage Pool associated\n                            with the protection domain.\n                          type: string\n                        system:\n                          description: system is the name of the storage system as\n                            configured in ScaleIO.\n                          type: string\n                        volumeName:\n                          description: |-\n                            volumeName is the name of a volume already created in the ScaleIO system\n                            that is associated with this volume source.\n                          type: string\n                      required:\n                      - gateway\n                      - secretRef\n                      - system\n                      type: object\n                    secret:\n                      description: |-\n                        secret represents a secret that should populate this volume.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                      properties:\n                        defaultMode:\n                          description: |-\n                            defaultMode is Optional: mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values\n                            for mode bits. Defaults to 0644.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        items:\n                          description: |-\n                            items If unspecified, each key-value pair in the Data field of the referenced\n                            Secret will be projected into the volume as a file whose name is the\n                            key and content is the value. If specified, the listed keys will be\n                            projected into the specified paths, and unlisted keys will not be\n                            present. If a key is specified which is not present in the Secret,\n                            the volume setup will error unless it is marked optional. Paths must be\n                            relative and may not contain the '..' path or start with '..'.\n                          items:\n                            description: Maps a string key to a path within a volume.\n                            properties:\n                              key:\n                                description: key is the key to project.\n                                type: string\n                              mode:\n                                description: |-\n                                  mode is Optional: mode bits used to set permissions on this file.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  If not specified, the volume defaultMode will be used.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              path:\n                                description: |-\n                                  path is the relative path of the file to map the key to.\n                                  May not be an absolute path.\n                                  May not contain the path element '..'.\n                                  May not start with the string '..'.\n                                type: string\n                            required:\n                            - key\n                            - path\n                            type: object\n                          type: array\n                        optional:\n                          description: optional field specify whether the Secret or\n                            its keys must be defined\n                          type: boolean\n                        secretName:\n                          description: |-\n                            secretName is the name of the secret in the pod's namespace to use.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                          type: string\n                      type: object\n                    storageos:\n                      description: storageOS represents a StorageOS volume attached\n                        and mounted on Kubernetes nodes.\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef specifies the secret to use for obtaining the StorageOS API\n                            credentials.  If not specified, default values will be attempted.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        volumeName:\n                          description: |-\n                            volumeName is the human-readable name of the StorageOS volume.  Volume\n                            names are only unique within a namespace.\n                          type: string\n                        volumeNamespace:\n                          description: |-\n                            volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                            namespace is specified then the Pod's namespace will be used.  This allows the\n                            Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                            Set VolumeName to any name to override the default behaviour.\n                            Set to \"default\" if you are not using namespaces within StorageOS.\n                            Namespaces that do not pre-exist within StorageOS will be created.\n                          type: string\n                      type: object\n                    vsphereVolume:\n                      description: vsphereVolume represents a vSphere volume attached\n                        and mounted on kubelets host machine\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        storagePolicyID:\n                          description: storagePolicyID is the storage Policy Based\n                            Management (SPBM) profile ID associated with the StoragePolicyName.\n                          type: string\n                        storagePolicyName:\n                          description: storagePolicyName is the storage Policy Based\n                            Management (SPBM) profile name.\n                          type: string\n                        volumePath:\n                          description: volumePath is the path that identifies vSphere\n                            volume vmdk\n                          type: string\n                      required:\n                      - volumePath\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n            required:\n            - compDef\n            - replicas\n            type: object\n          status:\n            description: ComponentStatus represents the observed state of a Component\n              within the Cluster.\n            properties:\n              conditions:\n                description: |-\n                  Represents a list of detailed status of the Component object.\n                  Each condition in the list provides real-time information about certain aspect of the Component object.\n\n\n                  This field is crucial for administrators and developers to monitor and respond to changes within the Component.\n                  It provides a history of state transitions and a snapshot of the current state that can be used for\n                  automated logic or direct inspection.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n              message:\n                additionalProperties:\n                  type: string\n                description: |-\n                  A map that stores detailed message about the Component.\n                  Each entry in the map provides insights into specific elements of the Component, such as Pods or workloads.\n\n\n                  Keys in this map are formatted as `ObjectKind/Name`, where `ObjectKind` could be a type like Pod,\n                  and `Name` is the specific name of the object.\n                type: object\n              observedGeneration:\n                description: Specifies the most recent generation observed for this\n                  Component object.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Indicates the current phase of the Component, with each phase indicating specific conditions:\n\n\n                  - Creating: The initial phase for new Components, transitioning from 'empty'(\"\").\n                  - Running: All Pods are up-to-date and in a Running state.\n                  - Updating: The Component is currently being updated, with no failed Pods present.\n                  - Failed: A significant number of Pods have failed.\n                  - Stopping: All Pods are being terminated, with current replica count at zero.\n                  - Stopped: All associated Pods have been successfully deleted.\n                  - Starting: Pods are being started.\n                  - Deleting: The Component is being deleted.\n                enum:\n                - Creating\n                - Deleting\n                - Updating\n                - Stopping\n                - Starting\n                - Running\n                - Stopped\n                - Failed\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n  - additionalPrinterColumns:\n    - description: component definition\n      jsonPath: .spec.compDef\n      name: DEFINITION\n      type: string\n    - description: service version\n      jsonPath: .spec.serviceVersion\n      name: SERVICE-VERSION\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          Component is a fundamental building block of a Cluster object.\n          For example, a Redis Cluster can include Components like 'redis', 'sentinel', and potentially a proxy like 'twemproxy'.\n\n\n          The Component object is responsible for managing the lifecycle of all replicas within a Cluster component,\n          It supports a wide range of operations including provisioning, stopping, restarting, termination, upgrading,\n          configuration changes, vertical and horizontal scaling, failover, switchover, cross-node migration,\n          scheduling configuration, exposing Services, managing system accounts, enabling/disabling exporter,\n          and configuring log collection.\n\n\n          Component is an internal sub-object derived from the user-submitted Cluster object.\n          It is designed primarily to be used by the KubeBlocks controllers,\n          users are discouraged from modifying Component objects directly and should use them only for monitoring Component statuses.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ComponentSpec defines the desired state of Component.\n            properties:\n              affinity:\n                description: |-\n                  Specifies a group of affinity scheduling rules for the Component.\n                  It allows users to control how the Component's Pods are scheduled onto nodes in the Cluster.\n\n\n                  Deprecated since v0.10, replaced by the `schedulingPolicy` field.\n                properties:\n                  nodeLabels:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      Indicates the node labels that must be present on nodes for pods to be scheduled on them.\n                      It is a map where the keys are the label keys and the values are the corresponding label values.\n                      Pods will only be scheduled on nodes that have all the specified labels with the corresponding values.\n\n\n                      For example, if NodeLabels is set to {\"nodeType\": \"ssd\", \"environment\": \"production\"},\n                      pods will only be scheduled on nodes that have both the \"nodeType\" label with value \"ssd\"\n                      and the \"environment\" label with value \"production\".\n\n\n                      This field allows users to control Pod placement based on specific node labels.\n                      It can be used to ensure that Pods are scheduled on nodes with certain characteristics,\n                      such as specific hardware (e.g., SSD), environment (e.g., production, staging),\n                      or any other custom labels assigned to nodes.\n                    type: object\n                  podAntiAffinity:\n                    default: Preferred\n                    description: |-\n                      Specifies the anti-affinity level of Pods within a Component.\n                      It determines how pods should be spread across nodes to improve availability and performance.\n                      It can have the following values: `Preferred` and `Required`.\n                      The default value is `Preferred`.\n                    enum:\n                    - Preferred\n                    - Required\n                    type: string\n                  tenancy:\n                    default: SharedNode\n                    description: |-\n                      Determines the level of resource isolation between Pods.\n                      It can have the following values: `SharedNode` and `DedicatedNode`.\n\n\n                      - SharedNode: Allow that multiple Pods may share the same node, which is the default behavior of K8s.\n                      - DedicatedNode: Each Pod runs on a dedicated node, ensuring that no two Pods share the same node.\n                        In other words, if a Pod is already running on a node, no other Pods will be scheduled on that node.\n                        Which provides a higher level of isolation and resource guarantee for Pods.\n\n\n                       The default value is `SharedNode`.\n                    enum:\n                    - SharedNode\n                    - DedicatedNode\n                    type: string\n                  topologyKeys:\n                    description: |-\n                      Represents the key of node labels used to define the topology domain for Pod anti-affinity\n                      and Pod spread constraints.\n\n\n                      In K8s, a topology domain is a set of nodes that have the same value for a specific label key.\n                      Nodes with labels containing any of the specified TopologyKeys and identical values are considered\n                      to be in the same topology domain.\n\n\n                      Note: The concept of topology in the context of K8s TopologyKeys is different from the concept of\n                      topology in the ClusterDefinition.\n\n\n                      When a Pod has anti-affinity or spread constraints specified, Kubernetes will attempt to schedule the\n                      Pod on nodes with different values for the specified TopologyKeys.\n                      This ensures that Pods are spread across different topology domains, promoting high availability and\n                      reducing the impact of node failures.\n\n\n                      Some well-known label keys, such as `kubernetes.io/hostname` and `topology.kubernetes.io/zone`,\n                      are often used as TopologyKey.\n                      These keys represent the hostname and zone of a node, respectively.\n                      By including these keys in the TopologyKeys list, Pods will be spread across nodes with\n                      different hostnames or zones.\n\n\n                      In addition to the well-known keys, users can also specify custom label keys as TopologyKeys.\n                      This allows for more flexible and custom topology definitions based on the specific needs\n                      of the application or environment.\n\n\n                      The TopologyKeys field is a slice of strings, where each string represents a label key.\n                      The order of the keys in the slice does not matter.\n                    items:\n                      type: string\n                    type: array\n                    x-kubernetes-list-type: set\n                type: object\n              annotations:\n                additionalProperties:\n                  type: string\n                description: Specifies Annotations to override or add for underlying\n                  Pods, PVCs, Account & TLS Secrets, Services Owned by Component.\n                type: object\n              compDef:\n                description: Specifies the name of the referenced ComponentDefinition.\n                maxLength: 64\n                type: string\n              configs:\n                description: Specifies the configuration content of a config template.\n                items:\n                  description: ClusterComponentConfig represents a config with its\n                    source bound.\n                  properties:\n                    configMap:\n                      description: ConfigMap source for the config.\n                      properties:\n                        defaultMode:\n                          description: |-\n                            defaultMode is optional: mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                            Defaults to 0644.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        items:\n                          description: |-\n                            items if unspecified, each key-value pair in the Data field of the referenced\n                            ConfigMap will be projected into the volume as a file whose name is the\n                            key and content is the value. If specified, the listed keys will be\n                            projected into the specified paths, and unlisted keys will not be\n                            present. If a key is specified which is not present in the ConfigMap,\n                            the volume setup will error unless it is marked optional. Paths must be\n                            relative and may not contain the '..' path or start with '..'.\n                          items:\n                            description: Maps a string key to a path within a volume.\n                            properties:\n                              key:\n                                description: key is the key to project.\n                                type: string\n                              mode:\n                                description: |-\n                                  mode is Optional: mode bits used to set permissions on this file.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  If not specified, the volume defaultMode will be used.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              path:\n                                description: |-\n                                  path is the relative path of the file to map the key to.\n                                  May not be an absolute path.\n                                  May not contain the path element '..'.\n                                  May not start with the string '..'.\n                                type: string\n                            required:\n                            - key\n                            - path\n                            type: object\n                          type: array\n                        name:\n                          description: |-\n                            Name of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            TODO: Add other useful fields. apiVersion, kind, uid?\n                          type: string\n                        optional:\n                          description: optional specify whether the ConfigMap or its\n                            keys must be defined\n                          type: boolean\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    name:\n                      description: The name of the config.\n                      type: string\n                  type: object\n                type: array\n              disableExporter:\n                description: |-\n                  Determines whether metrics exporter information is annotated on the Component's headless Service.\n\n\n                  If set to true, the following annotations will not be patched into the Service:\n\n\n                  - \"monitor.kubeblocks.io/path\"\n                  - \"monitor.kubeblocks.io/port\"\n                  - \"monitor.kubeblocks.io/scheme\"\n\n\n                  These annotations allow the Prometheus installed by KubeBlocks to discover and scrape metrics from the exporter.\n                type: boolean\n              enabledLogs:\n                description: |-\n                  Specifies which types of logs should be collected for the Cluster.\n                  The log types are defined in the `componentDefinition.spec.logConfigs` field with the LogConfig entries.\n\n\n                  The elements in the `enabledLogs` array correspond to the names of the LogConfig entries.\n                  For example, if the `componentDefinition.spec.logConfigs` defines LogConfig entries with\n                  names \"slow_query_log\" and \"error_log\",\n                  you can enable the collection of these logs by including their names in the `enabledLogs` array:\n                  ```yaml\n                  enabledLogs:\n                  - slow_query_log\n                  - error_log\n                  ```\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n              env:\n                description: List of environment variables to add.\n                items:\n                  description: EnvVar represents an environment variable present in\n                    a Container.\n                  properties:\n                    name:\n                      description: Name of the environment variable. Must be a C_IDENTIFIER.\n                      type: string\n                    value:\n                      description: |-\n                        Variable references $(VAR_NAME) are expanded\n                        using the previously defined environment variables in the container and\n                        any service environment variables. If a variable cannot be resolved,\n                        the reference in the input string will be unchanged. Double $$ are reduced\n                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                        Escaped references will never be expanded, regardless of whether the variable\n                        exists or not.\n                        Defaults to \"\".\n                      type: string\n                    valueFrom:\n                      description: Source for the environment variable's value. Cannot\n                        be used if value is not empty.\n                      properties:\n                        configMapKeyRef:\n                          description: Selects a key of a ConfigMap.\n                          properties:\n                            key:\n                              description: The key to select.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the ConfigMap or its key\n                                must be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        fieldRef:\n                          description: |-\n                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                          properties:\n                            apiVersion:\n                              description: Version of the schema the FieldPath is\n                                written in terms of, defaults to \"v1\".\n                              type: string\n                            fieldPath:\n                              description: Path of the field to select in the specified\n                                API version.\n                              type: string\n                          required:\n                          - fieldPath\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        resourceFieldRef:\n                          description: |-\n                            Selects a resource of the container: only resources limits and requests\n                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                          properties:\n                            containerName:\n                              description: 'Container name: required for volumes,\n                                optional for env vars'\n                              type: string\n                            divisor:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: Specifies the output format of the exposed\n                                resources, defaults to \"1\"\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                            resource:\n                              description: 'Required: resource to select'\n                              type: string\n                          required:\n                          - resource\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        secretKeyRef:\n                          description: Selects a key of a secret in the pod's namespace\n                          properties:\n                            key:\n                              description: The key of the secret to select from.  Must\n                                be a valid secret key.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the Secret or its key must\n                                be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              instanceUpdateStrategy:\n                description: |-\n                  Indicates the InstanceUpdateStrategy that will be\n                  employed to update Pods in the InstanceSet when a revision is made to\n                  Template.\n                properties:\n                  maxUnavailable:\n                    anyOf:\n                    - type: integer\n                    - type: string\n                    description: |-\n                      The maximum number of pods that can be unavailable during the update.\n                      Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).\n                      Absolute number is calculated from percentage by rounding up. This can not be 0.\n                      Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,\n                      it will be counted towards MaxUnavailable.\n                    x-kubernetes-int-or-string: true\n                  partition:\n                    description: |-\n                      Partition indicates the number of pods that should be updated during a rolling update.\n                      The remaining pods will remain untouched. This is helpful in defining how many pods\n                      should participate in the update process. The update process will follow the order\n                      of pod names in descending lexicographical (dictionary) order. The default value is\n                      ComponentSpec.Replicas (i.e., update all pods).\n                    format: int32\n                    type: integer\n                type: object\n              instances:\n                description: |-\n                  Allows for the customization of configuration values for each instance within a Component.\n                  An Instance represent a single replica (Pod and associated K8s resources like PVCs, Services, and ConfigMaps).\n                  While instances typically share a common configuration as defined in the ClusterComponentSpec,\n                  they can require unique settings in various scenarios:\n\n\n                  For example:\n                  - A database Component might require different resource allocations for primary and secondary instances,\n                    with primaries needing more resources.\n                  - During a rolling upgrade, a Component may first update the image for one or a few instances,\n                    and then update the remaining instances after verifying that the updated instances are functioning correctly.\n\n\n                  InstanceTemplate allows for specifying these unique configurations per instance.\n                  Each instance's name is constructed using the pattern: $(component.name)-$(template.name)-$(ordinal),\n                  starting with an ordinal of 0.\n                  It is crucial to maintain unique names for each InstanceTemplate to avoid conflicts.\n\n\n                  The sum of replicas across all InstanceTemplates should not exceed the total number of Replicas specified for the Component.\n                  Any remaining replicas will be generated using the default template and will follow the default naming rules.\n                items:\n                  description: InstanceTemplate allows customization of individual\n                    replica configurations in a Component.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                        Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                      type: object\n                    env:\n                      description: |-\n                        Defines Env to override.\n                        Add new or override existing envs.\n                      items:\n                        description: EnvVar represents an environment variable present\n                          in a Container.\n                        properties:\n                          name:\n                            description: Name of the environment variable. Must be\n                              a C_IDENTIFIER.\n                            type: string\n                          value:\n                            description: |-\n                              Variable references $(VAR_NAME) are expanded\n                              using the previously defined environment variables in the container and\n                              any service environment variables. If a variable cannot be resolved,\n                              the reference in the input string will be unchanged. Double $$ are reduced\n                              to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                              \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                              Escaped references will never be expanded, regardless of whether the variable\n                              exists or not.\n                              Defaults to \"\".\n                            type: string\n                          valueFrom:\n                            description: Source for the environment variable's value.\n                              Cannot be used if value is not empty.\n                            properties:\n                              configMapKeyRef:\n                                description: Selects a key of a ConfigMap.\n                                properties:\n                                  key:\n                                    description: The key to select.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap or\n                                      its key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              fieldRef:\n                                description: |-\n                                  Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                  spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              secretKeyRef:\n                                description: Selects a key of a secret in the pod's\n                                  namespace\n                                properties:\n                                  key:\n                                    description: The key of the secret to select from.  Must\n                                      be a valid secret key.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret or its\n                                      key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    image:\n                      description: Specifies an override for the first container's\n                        image in the Pod.\n                      type: string\n                    labels:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                        Values for existing keys will be overwritten, and new keys will be added.\n                      type: object\n                    name:\n                      description: |-\n                        Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                        This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal\n                        using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                        The specified name overrides any default naming conventions or patterns.\n                      maxLength: 54\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    replicas:\n                      default: 1\n                      description: |-\n                        Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                        This field allows setting how many replicated instances of the Component,\n                        with the specific overrides in the InstanceTemplate, are created.\n                        The default value is 1. A value of 0 disables instance creation.\n                      format: int32\n                      minimum: 0\n                      type: integer\n                    resources:\n                      description: |-\n                        Specifies an override for the resource requirements of the first container in the Pod.\n                        This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                      properties:\n                        claims:\n                          description: |-\n                            Claims lists the names of resources, defined in spec.resourceClaims,\n                            that are used by this container.\n\n\n                            This is an alpha field and requires enabling the\n                            DynamicResourceAllocation feature gate.\n\n\n                            This field is immutable. It can only be set for containers.\n                          items:\n                            description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                            properties:\n                              name:\n                                description: |-\n                                  Name must match the name of one entry in pod.spec.resourceClaims of\n                                  the Pod where this field is used. It makes that resource available\n                                  inside a container.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        limits:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Limits describes the maximum amount of compute resources allowed.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                        requests:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Requests describes the minimum amount of compute resources required.\n                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                      type: object\n                    schedulingPolicy:\n                      description: Specifies the scheduling policy for the Component.\n                      properties:\n                        affinity:\n                          description: Specifies a group of affinity scheduling rules\n                            of the Cluster, including NodeAffinity, PodAffinity, and\n                            PodAntiAffinity.\n                          properties:\n                            nodeAffinity:\n                              description: Describes node affinity scheduling rules\n                                for the pod.\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: |-\n                                      An empty preferred scheduling term matches all objects with implicit weight 0\n                                      (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                    properties:\n                                      preference:\n                                        description: A node selector term, associated\n                                          with the corresponding weight.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      weight:\n                                        description: Weight associated with matching\n                                          the corresponding nodeSelectorTerm, in the\n                                          range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - preference\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to an update), the system\n                                    may or may not try to eventually evict the pod from its node.\n                                  properties:\n                                    nodeSelectorTerms:\n                                      description: Required. A list of node selector\n                                        terms. The terms are ORed.\n                                      items:\n                                        description: |-\n                                          A null or empty node selector term matches no objects. The requirements of\n                                          them are ANDed.\n                                          The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      type: array\n                                  required:\n                                  - nodeSelectorTerms\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                              type: object\n                            podAffinity:\n                              description: Describes pod affinity scheduling rules\n                                (e.g. co-locate this pod in the same node, zone, etc.\n                                as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                            podAntiAffinity:\n                              description: Describes pod anti-affinity scheduling\n                                rules (e.g. avoid putting this pod in the same node,\n                                zone, etc. as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the anti-affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the anti-affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the anti-affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                          type: object\n                        nodeName:\n                          description: |-\n                            NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                            the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                            requirements.\n                          type: string\n                        nodeSelector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            NodeSelector is a selector which must be true for the Pod to fit on a node.\n                            Selector which must match a node's labels for the Pod to be scheduled on that node.\n                            More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        schedulerName:\n                          description: |-\n                            If specified, the Pod will be dispatched by specified scheduler.\n                            If not specified, the Pod will be dispatched by default scheduler.\n                          type: string\n                        tolerations:\n                          description: |-\n                            Allows Pods to be scheduled onto nodes with matching taints.\n                            Each toleration in the array allows the Pod to tolerate node taints based on\n                            specified `key`, `value`, `effect`, and `operator`.\n\n\n                            - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                            - The `operator` determines how the toleration matches the taint.\n\n\n                            Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                          items:\n                            description: |-\n                              The pod this Toleration is attached to tolerates any taint that matches\n                              the triple <key,value,effect> using the matching operator <operator>.\n                            properties:\n                              effect:\n                                description: |-\n                                  Effect indicates the taint effect to match. Empty means match all taint effects.\n                                  When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                type: string\n                              key:\n                                description: |-\n                                  Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                  If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                type: string\n                              operator:\n                                description: |-\n                                  Operator represents a key's relationship to the value.\n                                  Valid operators are Exists and Equal. Defaults to Equal.\n                                  Exists is equivalent to wildcard for value, so that a pod can\n                                  tolerate all taints of a particular category.\n                                type: string\n                              tolerationSeconds:\n                                description: |-\n                                  TolerationSeconds represents the period of time the toleration (which must be\n                                  of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                  it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                  negative values will be treated as 0 (evict immediately) by the system.\n                                format: int64\n                                type: integer\n                              value:\n                                description: |-\n                                  Value is the taint value the toleration matches to.\n                                  If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                type: string\n                            type: object\n                          type: array\n                        topologySpreadConstraints:\n                          description: |-\n                            TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                            domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                            All topologySpreadConstraints are ANDed.\n                          items:\n                            description: TopologySpreadConstraint specifies how to\n                              spread matching pods among the given topology.\n                            properties:\n                              labelSelector:\n                                description: |-\n                                  LabelSelector is used to find matching pods.\n                                  Pods that match this label selector are counted to determine the number of pods\n                                  in their corresponding topology domain.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              matchLabelKeys:\n                                description: |-\n                                  MatchLabelKeys is a set of pod label keys to select the pods over which\n                                  spreading will be calculated. The keys are used to lookup values from the\n                                  incoming pod labels, those key-value labels are ANDed with labelSelector\n                                  to select the group of existing pods over which spreading will be calculated\n                                  for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                  MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                  Keys that don't exist in the incoming pod labels will\n                                  be ignored. A null or empty list means only match against labelSelector.\n\n\n                                  This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              maxSkew:\n                                description: |-\n                                  MaxSkew describes the degree to which pods may be unevenly distributed.\n                                  When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                  between the number of matching pods in the target topology and the global minimum.\n                                  The global minimum is the minimum number of matching pods in an eligible domain\n                                  or zero if the number of eligible domains is less than MinDomains.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 2/2/1:\n                                  In this case, the global minimum is 1.\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |   P   |\n                                  - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                  scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                  violate MaxSkew(1).\n                                  - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                  When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                  to topologies that satisfy it.\n                                  It's a required field. Default value is 1 and 0 is not allowed.\n                                format: int32\n                                type: integer\n                              minDomains:\n                                description: |-\n                                  MinDomains indicates a minimum number of eligible domains.\n                                  When the number of eligible domains with matching topology keys is less than minDomains,\n                                  Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                  And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                  this value has no effect on scheduling.\n                                  As a result, when the number of eligible domains is less than minDomains,\n                                  scheduler won't schedule more than maxSkew Pods to those domains.\n                                  If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                  Valid values are integers greater than 0.\n                                  When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                  For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                  labelSelector spread as 2/2/2:\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |  P P  |\n                                  The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                  In this situation, new pod with the same labelSelector cannot be scheduled,\n                                  because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                  it will violate MaxSkew.\n\n\n                                  This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                format: int32\n                                type: integer\n                              nodeAffinityPolicy:\n                                description: |-\n                                  NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                  when calculating pod topology spread skew. Options are:\n                                  - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                  - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                  If this value is nil, the behavior is equivalent to the Honor policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              nodeTaintsPolicy:\n                                description: |-\n                                  NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                  pod topology spread skew. Options are:\n                                  - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                  has a toleration, are included.\n                                  - Ignore: node taints are ignored. All nodes are included.\n\n\n                                  If this value is nil, the behavior is equivalent to the Ignore policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              topologyKey:\n                                description: |-\n                                  TopologyKey is the key of node labels. Nodes that have a label with this key\n                                  and identical values are considered to be in the same topology.\n                                  We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                  of pods into each bucket.\n                                  We define a domain as a particular instance of a topology.\n                                  Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                  nodeAffinityPolicy and nodeTaintsPolicy.\n                                  e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                  And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                  It's a required field.\n                                type: string\n                              whenUnsatisfiable:\n                                description: |-\n                                  WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                  the spread constraint.\n                                  - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                  - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                    but giving higher precedence to topologies that would help reduce the\n                                    skew.\n                                  A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                  if and only if every possible node assignment for that pod would violate\n                                  \"MaxSkew\" on some topology.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 3/1/1:\n                                  | zone1 | zone2 | zone3 |\n                                  | P P P |   P   |   P   |\n                                  If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                  to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                  MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                  won't make it *more* imbalanced.\n                                  It's a required field.\n                                type: string\n                            required:\n                            - maxSkew\n                            - topologyKey\n                            - whenUnsatisfiable\n                            type: object\n                          type: array\n                      type: object\n                    volumeClaimTemplates:\n                      description: |-\n                        Defines VolumeClaimTemplates to override.\n                        Add new or override existing volume claim templates.\n                      items:\n                        properties:\n                          annotations:\n                            additionalProperties:\n                              type: string\n                            description: Specifies the annotations for the PVC of\n                              the volume.\n                            type: object\n                          labels:\n                            additionalProperties:\n                              type: string\n                            description: Specifies the labels for the PVC of the volume.\n                            type: object\n                          name:\n                            description: |-\n                              Refers to the name of a volumeMount defined in either:\n\n\n                              - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                              - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                              The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                            type: string\n                          spec:\n                            description: |-\n                              Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                              with the mount name specified in the `name` field.\n\n\n                              When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                              defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                            properties:\n                              accessModes:\n                                description: |-\n                                  Contains the desired access modes the volume should have.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-preserve-unknown-fields: true\n                              resources:\n                                description: |-\n                                  Represents the minimum resources the volume should have.\n                                  If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                  are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                properties:\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                                x-kubernetes-preserve-unknown-fields: true\n                              storageClassName:\n                                description: |-\n                                  The name of the StorageClass required by the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                type: string\n                              volumeMode:\n                                description: Defines what type of volume is required\n                                  by the claim, either Block or Filesystem.\n                                type: string\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    volumeMounts:\n                      description: |-\n                        Defines VolumeMounts to override.\n                        Add new or override existing volume mounts of the first container in the Pod.\n                      items:\n                        description: VolumeMount describes a mounting of a Volume\n                          within a container.\n                        properties:\n                          mountPath:\n                            description: |-\n                              Path within the container at which the volume should be mounted.  Must\n                              not contain ':'.\n                            type: string\n                          mountPropagation:\n                            description: |-\n                              mountPropagation determines how mounts are propagated from the host\n                              to container and the other way around.\n                              When not set, MountPropagationNone is used.\n                              This field is beta in 1.10.\n                            type: string\n                          name:\n                            description: This must match the Name of a Volume.\n                            type: string\n                          readOnly:\n                            description: |-\n                              Mounted read-only if true, read-write otherwise (false or unspecified).\n                              Defaults to false.\n                            type: boolean\n                          subPath:\n                            description: |-\n                              Path within the volume from which the container's volume should be mounted.\n                              Defaults to \"\" (volume's root).\n                            type: string\n                          subPathExpr:\n                            description: |-\n                              Expanded path within the volume from which the container's volume should be mounted.\n                              Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                              Defaults to \"\" (volume's root).\n                              SubPathExpr and SubPath are mutually exclusive.\n                            type: string\n                        required:\n                        - mountPath\n                        - name\n                        type: object\n                      type: array\n                    volumes:\n                      description: |-\n                        Defines Volumes to override.\n                        Add new or override existing volumes.\n                      items:\n                        description: Volume represents a named volume in a pod that\n                          may be accessed by any container in the pod.\n                        properties:\n                          awsElasticBlockStore:\n                            description: |-\n                              awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              partition:\n                                description: |-\n                                  partition is the partition in the volume that you want to mount.\n                                  If omitted, the default is to mount by volume name.\n                                  Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                  Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                format: int32\n                                type: integer\n                              readOnly:\n                                description: |-\n                                  readOnly value true will force the readOnly setting in VolumeMounts.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                type: boolean\n                              volumeID:\n                                description: |-\n                                  volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          azureDisk:\n                            description: azureDisk represents an Azure Data Disk mount\n                              on the host and bind mount to the pod.\n                            properties:\n                              cachingMode:\n                                description: 'cachingMode is the Host Caching mode:\n                                  None, Read Only, Read Write.'\n                                type: string\n                              diskName:\n                                description: diskName is the Name of the data disk\n                                  in the blob storage\n                                type: string\n                              diskURI:\n                                description: diskURI is the URI of data disk in the\n                                  blob storage\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType is Filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              kind:\n                                description: 'kind expected values are Shared: multiple\n                                  blob disks per storage account  Dedicated: single\n                                  blob disk per storage account  Managed: azure managed\n                                  data disk (only in managed availability set). defaults\n                                  to shared'\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                            required:\n                            - diskName\n                            - diskURI\n                            type: object\n                          azureFile:\n                            description: azureFile represents an Azure File Service\n                              mount on the host and bind mount to the pod.\n                            properties:\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretName:\n                                description: secretName is the  name of secret that\n                                  contains Azure Storage Account Name and Key\n                                type: string\n                              shareName:\n                                description: shareName is the azure share Name\n                                type: string\n                            required:\n                            - secretName\n                            - shareName\n                            type: object\n                          cephfs:\n                            description: cephFS represents a Ceph FS mount on the\n                              host that shares a pod's lifetime\n                            properties:\n                              monitors:\n                                description: |-\n                                  monitors is Required: Monitors is a collection of Ceph monitors\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                items:\n                                  type: string\n                                type: array\n                              path:\n                                description: 'path is Optional: Used as the mounted\n                                  root, rather than the full Ceph tree, default is\n                                  /'\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: boolean\n                              secretFile:\n                                description: |-\n                                  secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: string\n                              secretRef:\n                                description: |-\n                                  secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              user:\n                                description: |-\n                                  user is optional: User is the rados user name, default is admin\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: string\n                            required:\n                            - monitors\n                            type: object\n                          cinder:\n                            description: |-\n                              cinder represents a cinder volume attached and mounted on kubelets host machine.\n                              More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is optional: points to a secret object containing parameters used to connect\n                                  to OpenStack.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              volumeID:\n                                description: |-\n                                  volumeID used to identify the volume in cinder.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          configMap:\n                            description: configMap represents a configMap that should\n                              populate this volume\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items if unspecified, each key-value pair in the Data field of the referenced\n                                  ConfigMap will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the ConfigMap,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: optional specify whether the ConfigMap\n                                  or its keys must be defined\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          csi:\n                            description: csi (Container Storage Interface) represents\n                              ephemeral storage that is handled by certain external\n                              CSI drivers (Beta feature).\n                            properties:\n                              driver:\n                                description: |-\n                                  driver is the name of the CSI driver that handles this volume.\n                                  Consult with your admin for the correct name as registered in the cluster.\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                  If not provided, the empty value is passed to the associated CSI driver\n                                  which will determine the default filesystem to apply.\n                                type: string\n                              nodePublishSecretRef:\n                                description: |-\n                                  nodePublishSecretRef is a reference to the secret object containing\n                                  sensitive information to pass to the CSI driver to complete the CSI\n                                  NodePublishVolume and NodeUnpublishVolume calls.\n                                  This field is optional, and  may be empty if no secret is required. If the\n                                  secret object contains more than one secret, all secret references are passed.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              readOnly:\n                                description: |-\n                                  readOnly specifies a read-only configuration for the volume.\n                                  Defaults to false (read/write).\n                                type: boolean\n                              volumeAttributes:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  volumeAttributes stores driver-specific properties that are passed to the CSI\n                                  driver. Consult your driver's documentation for supported values.\n                                type: object\n                            required:\n                            - driver\n                            type: object\n                          downwardAPI:\n                            description: downwardAPI represents downward API about\n                              the pod that should populate this volume\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  Optional: mode bits to use on created files by default. Must be a\n                                  Optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: Items is a list of downward API volume\n                                  file\n                                items:\n                                  description: DownwardAPIVolumeFile represents information\n                                    to create the file containing the pod field\n                                  properties:\n                                    fieldRef:\n                                      description: 'Required: Selects a field of the\n                                        pod: only annotations, labels, name and namespace\n                                        are supported.'\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    mode:\n                                      description: |-\n                                        Optional: mode bits used to set permissions on this file, must be an octal value\n                                        between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: 'Required: Path is  the relative\n                                        path name of the file to be created. Must\n                                        not be absolute or contain the ''..'' path.\n                                        Must be utf-8 encoded. The first item of the\n                                        relative path must not start with ''..'''\n                                      type: string\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  required:\n                                  - path\n                                  type: object\n                                type: array\n                            type: object\n                          emptyDir:\n                            description: |-\n                              emptyDir represents a temporary directory that shares a pod's lifetime.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                            properties:\n                              medium:\n                                description: |-\n                                  medium represents what type of storage medium should back this directory.\n                                  The default is \"\" which means to use the node's default medium.\n                                  Must be an empty string (default) or Memory.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                type: string\n                              sizeLimit:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                  The size limit is also applicable for memory medium.\n                                  The maximum usage on memory medium EmptyDir would be the minimum value between\n                                  the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                  The default is nil which means that the limit is undefined.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                            type: object\n                          ephemeral:\n                            description: |-\n                              ephemeral represents a volume that is handled by a cluster storage driver.\n                              The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                              and deleted when the pod is removed.\n\n\n                              Use this if:\n                              a) the volume is only needed while the pod runs,\n                              b) features of normal volumes like restoring from snapshot or capacity\n                                 tracking are needed,\n                              c) the storage driver is specified through a storage class, and\n                              d) the storage driver supports dynamic volume provisioning through\n                                 a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                 information on the connection between this volume type\n                                 and PersistentVolumeClaim).\n\n\n                              Use PersistentVolumeClaim or one of the vendor-specific\n                              APIs for volumes that persist for longer than the lifecycle\n                              of an individual pod.\n\n\n                              Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                              be used that way - see the documentation of the driver for\n                              more information.\n\n\n                              A pod can use both types of ephemeral volumes and\n                              persistent volumes at the same time.\n                            properties:\n                              volumeClaimTemplate:\n                                description: |-\n                                  Will be used to create a stand-alone PVC to provision the volume.\n                                  The pod in which this EphemeralVolumeSource is embedded will be the\n                                  owner of the PVC, i.e. the PVC will be deleted together with the\n                                  pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                  `<volume name>` is the name from the `PodSpec.Volumes` array\n                                  entry. Pod validation will reject the pod if the concatenated name\n                                  is not valid for a PVC (for example, too long).\n\n\n                                  An existing PVC with that name that is not owned by the pod\n                                  will *not* be used for the pod to avoid using an unrelated\n                                  volume by mistake. Starting the pod is then blocked until\n                                  the unrelated PVC is removed. If such a pre-created PVC is\n                                  meant to be used by the pod, the PVC has to updated with an\n                                  owner reference to the pod once the pod exists. Normally\n                                  this should not be necessary, but it may be useful when\n                                  manually reconstructing a broken cluster.\n\n\n                                  This field is read-only and no changes will be made by Kubernetes\n                                  to the PVC after it has been created.\n\n\n                                  Required, must not be nil.\n                                properties:\n                                  metadata:\n                                    description: |-\n                                      May contain labels and annotations that will be copied into the PVC\n                                      when creating it. No other fields are allowed and will be rejected during\n                                      validation.\n                                    properties:\n                                      annotations:\n                                        additionalProperties:\n                                          type: string\n                                        type: object\n                                      finalizers:\n                                        items:\n                                          type: string\n                                        type: array\n                                      labels:\n                                        additionalProperties:\n                                          type: string\n                                        type: object\n                                      name:\n                                        type: string\n                                      namespace:\n                                        type: string\n                                    type: object\n                                  spec:\n                                    description: |-\n                                      The specification for the PersistentVolumeClaim. The entire content is\n                                      copied unchanged into the PVC that gets created from this\n                                      template. The same fields as in a PersistentVolumeClaim\n                                      are also valid here.\n                                    properties:\n                                      accessModes:\n                                        description: |-\n                                          accessModes contains the desired access modes the volume should have.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                        items:\n                                          type: string\n                                        type: array\n                                      dataSource:\n                                        description: |-\n                                          dataSource field can be used to specify either:\n                                          * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                          * An existing PVC (PersistentVolumeClaim)\n                                          If the provisioner or an external controller can support the specified data source,\n                                          it will create a new volume based on the contents of the specified data source.\n                                          When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                          and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                          If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                        properties:\n                                          apiGroup:\n                                            description: |-\n                                              APIGroup is the group for the resource being referenced.\n                                              If APIGroup is not specified, the specified Kind must be in the core API group.\n                                              For any other third-party types, APIGroup is required.\n                                            type: string\n                                          kind:\n                                            description: Kind is the type of resource\n                                              being referenced\n                                            type: string\n                                          name:\n                                            description: Name is the name of resource\n                                              being referenced\n                                            type: string\n                                        required:\n                                        - kind\n                                        - name\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      dataSourceRef:\n                                        description: |-\n                                          dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                          volume is desired. This may be any object from a non-empty API group (non\n                                          core object) or a PersistentVolumeClaim object.\n                                          When this field is specified, volume binding will only succeed if the type of\n                                          the specified object matches some installed volume populator or dynamic\n                                          provisioner.\n                                          This field will replace the functionality of the dataSource field and as such\n                                          if both fields are non-empty, they must have the same value. For backwards\n                                          compatibility, when namespace isn't specified in dataSourceRef,\n                                          both fields (dataSource and dataSourceRef) will be set to the same\n                                          value automatically if one of them is empty and the other is non-empty.\n                                          When namespace is specified in dataSourceRef,\n                                          dataSource isn't set to the same value and must be empty.\n                                          There are three important differences between dataSource and dataSourceRef:\n                                          * While dataSource only allows two specific types of objects, dataSourceRef\n                                            allows any non-core object, as well as PersistentVolumeClaim objects.\n                                          * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                            preserves all values, and generates an error if a disallowed value is\n                                            specified.\n                                          * While dataSource only allows local objects, dataSourceRef allows objects\n                                            in any namespaces.\n                                          (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                          (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                        properties:\n                                          apiGroup:\n                                            description: |-\n                                              APIGroup is the group for the resource being referenced.\n                                              If APIGroup is not specified, the specified Kind must be in the core API group.\n                                              For any other third-party types, APIGroup is required.\n                                            type: string\n                                          kind:\n                                            description: Kind is the type of resource\n                                              being referenced\n                                            type: string\n                                          name:\n                                            description: Name is the name of resource\n                                              being referenced\n                                            type: string\n                                          namespace:\n                                            description: |-\n                                              Namespace is the namespace of resource being referenced\n                                              Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                              (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                            type: string\n                                        required:\n                                        - kind\n                                        - name\n                                        type: object\n                                      resources:\n                                        description: |-\n                                          resources represents the minimum resources the volume should have.\n                                          If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                          that are lower than previous value but must still be higher than capacity recorded in the\n                                          status field of the claim.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                        properties:\n                                          limits:\n                                            additionalProperties:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            description: |-\n                                              Limits describes the maximum amount of compute resources allowed.\n                                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                            type: object\n                                          requests:\n                                            additionalProperties:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            description: |-\n                                              Requests describes the minimum amount of compute resources required.\n                                              If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                              otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                            type: object\n                                        type: object\n                                      selector:\n                                        description: selector is a label query over\n                                          volumes to consider for binding.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      storageClassName:\n                                        description: |-\n                                          storageClassName is the name of the StorageClass required by the claim.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                        type: string\n                                      volumeAttributesClassName:\n                                        description: |-\n                                          volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                          If specified, the CSI driver will create or update the volume with the attributes defined\n                                          in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                          it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                          will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                          If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                          will be set by the persistentvolume controller if it exists.\n                                          If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                          set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                          exists.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                          (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                        type: string\n                                      volumeMode:\n                                        description: |-\n                                          volumeMode defines what type of volume is required by the claim.\n                                          Value of Filesystem is implied when not included in claim spec.\n                                        type: string\n                                      volumeName:\n                                        description: volumeName is the binding reference\n                                          to the PersistentVolume backing this claim.\n                                        type: string\n                                    type: object\n                                required:\n                                - spec\n                                type: object\n                            type: object\n                          fc:\n                            description: fc represents a Fibre Channel resource that\n                              is attached to a kubelet's host machine and then exposed\n                              to the pod.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              lun:\n                                description: 'lun is Optional: FC target lun number'\n                                format: int32\n                                type: integer\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              targetWWNs:\n                                description: 'targetWWNs is Optional: FC target worldwide\n                                  names (WWNs)'\n                                items:\n                                  type: string\n                                type: array\n                              wwids:\n                                description: |-\n                                  wwids Optional: FC volume world wide identifiers (wwids)\n                                  Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          flexVolume:\n                            description: |-\n                              flexVolume represents a generic volume resource that is\n                              provisioned/attached using an exec based plugin.\n                            properties:\n                              driver:\n                                description: driver is the name of the driver to use\n                                  for this volume.\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                type: string\n                              options:\n                                additionalProperties:\n                                  type: string\n                                description: 'options is Optional: this field holds\n                                  extra command options if any.'\n                                type: object\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is Optional: secretRef is reference to the secret object containing\n                                  sensitive information to pass to the plugin scripts. This may be\n                                  empty if no secret object is specified. If the secret object\n                                  contains more than one secret, all secrets are passed to the plugin\n                                  scripts.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            required:\n                            - driver\n                            type: object\n                          flocker:\n                            description: flocker represents a Flocker volume attached\n                              to a kubelet's host machine. This depends on the Flocker\n                              control service being running\n                            properties:\n                              datasetName:\n                                description: |-\n                                  datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                  should be considered as deprecated\n                                type: string\n                              datasetUUID:\n                                description: datasetUUID is the UUID of the dataset.\n                                  This is unique identifier of a Flocker dataset\n                                type: string\n                            type: object\n                          gcePersistentDisk:\n                            description: |-\n                              gcePersistentDisk represents a GCE Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              partition:\n                                description: |-\n                                  partition is the partition in the volume that you want to mount.\n                                  If omitted, the default is to mount by volume name.\n                                  Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                  Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                format: int32\n                                type: integer\n                              pdName:\n                                description: |-\n                                  pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                type: boolean\n                            required:\n                            - pdName\n                            type: object\n                          gitRepo:\n                            description: |-\n                              gitRepo represents a git repository at a particular revision.\n                              DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                              EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                              into the Pod's container.\n                            properties:\n                              directory:\n                                description: |-\n                                  directory is the target directory name.\n                                  Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                  git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                  the subdirectory with the given name.\n                                type: string\n                              repository:\n                                description: repository is the URL\n                                type: string\n                              revision:\n                                description: revision is the commit hash for the specified\n                                  revision.\n                                type: string\n                            required:\n                            - repository\n                            type: object\n                          glusterfs:\n                            description: |-\n                              glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                              More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                            properties:\n                              endpoints:\n                                description: |-\n                                  endpoints is the endpoint name that details Glusterfs topology.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: string\n                              path:\n                                description: |-\n                                  path is the Glusterfs volume path.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                  Defaults to false.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: boolean\n                            required:\n                            - endpoints\n                            - path\n                            type: object\n                          hostPath:\n                            description: |-\n                              hostPath represents a pre-existing file or directory on the host\n                              machine that is directly exposed to the container. This is generally\n                              used for system agents or other privileged things that are allowed\n                              to see the host machine. Most containers will NOT need this.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                              ---\n                              TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                              mount host directories as read/write.\n                            properties:\n                              path:\n                                description: |-\n                                  path of the directory on the host.\n                                  If the path is a symlink, it will follow the link to the real path.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                type: string\n                              type:\n                                description: |-\n                                  type for HostPath Volume\n                                  Defaults to \"\"\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                type: string\n                            required:\n                            - path\n                            type: object\n                          iscsi:\n                            description: |-\n                              iscsi represents an ISCSI Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://examples.k8s.io/volumes/iscsi/README.md\n                            properties:\n                              chapAuthDiscovery:\n                                description: chapAuthDiscovery defines whether support\n                                  iSCSI Discovery CHAP authentication\n                                type: boolean\n                              chapAuthSession:\n                                description: chapAuthSession defines whether support\n                                  iSCSI Session CHAP authentication\n                                type: boolean\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              initiatorName:\n                                description: |-\n                                  initiatorName is the custom iSCSI Initiator Name.\n                                  If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                  <target portal>:<volume name> will be created for the connection.\n                                type: string\n                              iqn:\n                                description: iqn is the target iSCSI Qualified Name.\n                                type: string\n                              iscsiInterface:\n                                description: |-\n                                  iscsiInterface is the interface Name that uses an iSCSI transport.\n                                  Defaults to 'default' (tcp).\n                                type: string\n                              lun:\n                                description: lun represents iSCSI Target Lun number.\n                                format: int32\n                                type: integer\n                              portals:\n                                description: |-\n                                  portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                  is other than default (typically TCP ports 860 and 3260).\n                                items:\n                                  type: string\n                                type: array\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                type: boolean\n                              secretRef:\n                                description: secretRef is the CHAP Secret for iSCSI\n                                  target and initiator authentication\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              targetPortal:\n                                description: |-\n                                  targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                  is other than default (typically TCP ports 860 and 3260).\n                                type: string\n                            required:\n                            - iqn\n                            - lun\n                            - targetPortal\n                            type: object\n                          name:\n                            description: |-\n                              name of the volume.\n                              Must be a DNS_LABEL and unique within the pod.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            type: string\n                          nfs:\n                            description: |-\n                              nfs represents an NFS mount on the host that shares a pod's lifetime\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                            properties:\n                              path:\n                                description: |-\n                                  path that is exported by the NFS server.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the NFS export to be mounted with read-only permissions.\n                                  Defaults to false.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: boolean\n                              server:\n                                description: |-\n                                  server is the hostname or IP address of the NFS server.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: string\n                            required:\n                            - path\n                            - server\n                            type: object\n                          persistentVolumeClaim:\n                            description: |-\n                              persistentVolumeClaimVolumeSource represents a reference to a\n                              PersistentVolumeClaim in the same namespace.\n                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                            properties:\n                              claimName:\n                                description: |-\n                                  claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Will force the ReadOnly setting in VolumeMounts.\n                                  Default false.\n                                type: boolean\n                            required:\n                            - claimName\n                            type: object\n                          photonPersistentDisk:\n                            description: photonPersistentDisk represents a PhotonController\n                              persistent disk attached and mounted on kubelets host\n                              machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              pdID:\n                                description: pdID is the ID that identifies Photon\n                                  Controller persistent disk\n                                type: string\n                            required:\n                            - pdID\n                            type: object\n                          portworxVolume:\n                            description: portworxVolume represents a portworx volume\n                              attached and mounted on kubelets host machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fSType represents the filesystem type to mount\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              volumeID:\n                                description: volumeID uniquely identifies a Portworx\n                                  volume\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          projected:\n                            description: projected items for all in one resources\n                              secrets, configmaps, and downward API\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode are the mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              sources:\n                                description: sources is the list of volume projections\n                                items:\n                                  description: Projection that may be projected along\n                                    with other supported volume types\n                                  properties:\n                                    clusterTrustBundle:\n                                      description: |-\n                                        ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                        of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                        Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                        ClusterTrustBundle objects can either be selected by name, or by the\n                                        combination of signer name and a label selector.\n\n\n                                        Kubelet performs aggressive normalization of the PEM contents written\n                                        into the pod filesystem.  Esoteric PEM features such as inter-block\n                                        comments and block headers are stripped.  Certificates are deduplicated.\n                                        The ordering of certificates within the file is arbitrary, and Kubelet\n                                        may change the order over time.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            Select all ClusterTrustBundles that match this label selector.  Only has\n                                            effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                            interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                            everything\".\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        name:\n                                          description: |-\n                                            Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                            with signerName and labelSelector.\n                                          type: string\n                                        optional:\n                                          description: |-\n                                            If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                            aren't available.  If using name, then the named ClusterTrustBundle is\n                                            allowed not to exist.  If using signerName, then the combination of\n                                            signerName and labelSelector is allowed to match zero\n                                            ClusterTrustBundles.\n                                          type: boolean\n                                        path:\n                                          description: Relative path from the volume\n                                            root to write the bundle.\n                                          type: string\n                                        signerName:\n                                          description: |-\n                                            Select all ClusterTrustBundles that match this signer name.\n                                            Mutually-exclusive with name.  The contents of all selected\n                                            ClusterTrustBundles will be unified and deduplicated.\n                                          type: string\n                                      required:\n                                      - path\n                                      type: object\n                                    configMap:\n                                      description: configMap information about the\n                                        configMap data to project\n                                      properties:\n                                        items:\n                                          description: |-\n                                            items if unspecified, each key-value pair in the Data field of the referenced\n                                            ConfigMap will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the ConfigMap,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: optional specify whether the\n                                            ConfigMap or its keys must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    downwardAPI:\n                                      description: downwardAPI information about the\n                                        downwardAPI data to project\n                                      properties:\n                                        items:\n                                          description: Items is a list of DownwardAPIVolume\n                                            file\n                                          items:\n                                            description: DownwardAPIVolumeFile represents\n                                              information to create the file containing\n                                              the pod field\n                                            properties:\n                                              fieldRef:\n                                                description: 'Required: Selects a\n                                                  field of the pod: only annotations,\n                                                  labels, name and namespace are supported.'\n                                                properties:\n                                                  apiVersion:\n                                                    description: Version of the schema\n                                                      the FieldPath is written in\n                                                      terms of, defaults to \"v1\".\n                                                    type: string\n                                                  fieldPath:\n                                                    description: Path of the field\n                                                      to select in the specified API\n                                                      version.\n                                                    type: string\n                                                required:\n                                                - fieldPath\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              mode:\n                                                description: |-\n                                                  Optional: mode bits used to set permissions on this file, must be an octal value\n                                                  between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: 'Required: Path is  the\n                                                  relative path name of the file to\n                                                  be created. Must not be absolute\n                                                  or contain the ''..'' path. Must\n                                                  be utf-8 encoded. The first item\n                                                  of the relative path must not start\n                                                  with ''..'''\n                                                type: string\n                                              resourceFieldRef:\n                                                description: |-\n                                                  Selects a resource of the container: only resources limits and requests\n                                                  (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                properties:\n                                                  containerName:\n                                                    description: 'Container name:\n                                                      required for volumes, optional\n                                                      for env vars'\n                                                    type: string\n                                                  divisor:\n                                                    anyOf:\n                                                    - type: integer\n                                                    - type: string\n                                                    description: Specifies the output\n                                                      format of the exposed resources,\n                                                      defaults to \"1\"\n                                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                    x-kubernetes-int-or-string: true\n                                                  resource:\n                                                    description: 'Required: resource\n                                                      to select'\n                                                    type: string\n                                                required:\n                                                - resource\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                            required:\n                                            - path\n                                            type: object\n                                          type: array\n                                      type: object\n                                    secret:\n                                      description: secret information about the secret\n                                        data to project\n                                      properties:\n                                        items:\n                                          description: |-\n                                            items if unspecified, each key-value pair in the Data field of the referenced\n                                            Secret will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the Secret,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: optional field specify whether\n                                            the Secret or its key must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    serviceAccountToken:\n                                      description: serviceAccountToken is information\n                                        about the serviceAccountToken data to project\n                                      properties:\n                                        audience:\n                                          description: |-\n                                            audience is the intended audience of the token. A recipient of a token\n                                            must identify itself with an identifier specified in the audience of the\n                                            token, and otherwise should reject the token. The audience defaults to the\n                                            identifier of the apiserver.\n                                          type: string\n                                        expirationSeconds:\n                                          description: |-\n                                            expirationSeconds is the requested duration of validity of the service\n                                            account token. As the token approaches expiration, the kubelet volume\n                                            plugin will proactively rotate the service account token. The kubelet will\n                                            start trying to rotate the token if the token is older than 80 percent of\n                                            its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                            and must be at least 10 minutes.\n                                          format: int64\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the path relative to the mount point of the file to project the\n                                            token into.\n                                          type: string\n                                      required:\n                                      - path\n                                      type: object\n                                  type: object\n                                type: array\n                            type: object\n                          quobyte:\n                            description: quobyte represents a Quobyte mount on the\n                              host that shares a pod's lifetime\n                            properties:\n                              group:\n                                description: |-\n                                  group to map volume access to\n                                  Default is no group\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                  Defaults to false.\n                                type: boolean\n                              registry:\n                                description: |-\n                                  registry represents a single or multiple Quobyte Registry services\n                                  specified as a string as host:port pair (multiple entries are separated with commas)\n                                  which acts as the central registry for volumes\n                                type: string\n                              tenant:\n                                description: |-\n                                  tenant owning the given Quobyte volume in the Backend\n                                  Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                type: string\n                              user:\n                                description: |-\n                                  user to map volume access to\n                                  Defaults to serivceaccount user\n                                type: string\n                              volume:\n                                description: volume is a string that references an\n                                  already created Quobyte volume by name.\n                                type: string\n                            required:\n                            - registry\n                            - volume\n                            type: object\n                          rbd:\n                            description: |-\n                              rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                              More info: https://examples.k8s.io/volumes/rbd/README.md\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              image:\n                                description: |-\n                                  image is the rados image name.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              keyring:\n                                description: |-\n                                  keyring is the path to key ring for RBDUser.\n                                  Default is /etc/ceph/keyring.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              monitors:\n                                description: |-\n                                  monitors is a collection of Ceph monitors.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                items:\n                                  type: string\n                                type: array\n                              pool:\n                                description: |-\n                                  pool is the rados pool name.\n                                  Default is rbd.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is name of the authentication secret for RBDUser. If provided\n                                  overrides keyring.\n                                  Default is nil.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              user:\n                                description: |-\n                                  user is the rados user name.\n                                  Default is admin.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                            required:\n                            - image\n                            - monitors\n                            type: object\n                          scaleIO:\n                            description: scaleIO represents a ScaleIO persistent volume\n                              attached and mounted on Kubernetes nodes.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                  Default is \"xfs\".\n                                type: string\n                              gateway:\n                                description: gateway is the host address of the ScaleIO\n                                  API Gateway.\n                                type: string\n                              protectionDomain:\n                                description: protectionDomain is the name of the ScaleIO\n                                  Protection Domain for the configured storage.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef references to the secret for ScaleIO user and other\n                                  sensitive information. If this is not provided, Login operation will fail.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              sslEnabled:\n                                description: sslEnabled Flag enable/disable SSL communication\n                                  with Gateway, default false\n                                type: boolean\n                              storageMode:\n                                description: |-\n                                  storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                  Default is ThinProvisioned.\n                                type: string\n                              storagePool:\n                                description: storagePool is the ScaleIO Storage Pool\n                                  associated with the protection domain.\n                                type: string\n                              system:\n                                description: system is the name of the storage system\n                                  as configured in ScaleIO.\n                                type: string\n                              volumeName:\n                                description: |-\n                                  volumeName is the name of a volume already created in the ScaleIO system\n                                  that is associated with this volume source.\n                                type: string\n                            required:\n                            - gateway\n                            - secretRef\n                            - system\n                            type: object\n                          secret:\n                            description: |-\n                              secret represents a secret that should populate this volume.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values\n                                  for mode bits. Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items If unspecified, each key-value pair in the Data field of the referenced\n                                  Secret will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the Secret,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              optional:\n                                description: optional field specify whether the Secret\n                                  or its keys must be defined\n                                type: boolean\n                              secretName:\n                                description: |-\n                                  secretName is the name of the secret in the pod's namespace to use.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                type: string\n                            type: object\n                          storageos:\n                            description: storageOS represents a StorageOS volume attached\n                              and mounted on Kubernetes nodes.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef specifies the secret to use for obtaining the StorageOS API\n                                  credentials.  If not specified, default values will be attempted.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              volumeName:\n                                description: |-\n                                  volumeName is the human-readable name of the StorageOS volume.  Volume\n                                  names are only unique within a namespace.\n                                type: string\n                              volumeNamespace:\n                                description: |-\n                                  volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                  namespace is specified then the Pod's namespace will be used.  This allows the\n                                  Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                  Set VolumeName to any name to override the default behaviour.\n                                  Set to \"default\" if you are not using namespaces within StorageOS.\n                                  Namespaces that do not pre-exist within StorageOS will be created.\n                                type: string\n                            type: object\n                          vsphereVolume:\n                            description: vsphereVolume represents a vSphere volume\n                              attached and mounted on kubelets host machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              storagePolicyID:\n                                description: storagePolicyID is the storage Policy\n                                  Based Management (SPBM) profile ID associated with\n                                  the StoragePolicyName.\n                                type: string\n                              storagePolicyName:\n                                description: storagePolicyName is the storage Policy\n                                  Based Management (SPBM) profile name.\n                                type: string\n                              volumePath:\n                                description: volumePath is the path that identifies\n                                  vSphere volume vmdk\n                                type: string\n                            required:\n                            - volumePath\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                  required:\n                  - name\n                  type: object\n                type: array\n              labels:\n                additionalProperties:\n                  type: string\n                description: Specifies Labels to override or add for underlying Pods,\n                  PVCs, Account & TLS Secrets, Services Owned by Component.\n                type: object\n              offlineInstances:\n                description: |-\n                  Specifies the names of instances to be transitioned to offline status.\n\n\n                  Marking an instance as offline results in the following:\n\n\n                  1. The associated Pod is stopped, and its PersistentVolumeClaim (PVC) is retained for potential\n                     future reuse or data recovery, but it is no longer actively used.\n                  2. The ordinal number assigned to this instance is preserved, ensuring it remains unique\n                     and avoiding conflicts with new instances.\n\n\n                  Setting instances to offline allows for a controlled scale-in process, preserving their data and maintaining\n                  ordinal consistency within the Cluster.\n                  Note that offline instances and their associated resources, such as PVCs, are not automatically deleted.\n                  The administrator must manually manage the cleanup and removal of these resources when they are no longer needed.\n                items:\n                  type: string\n                type: array\n              parallelPodManagementConcurrency:\n                anyOf:\n                - type: integer\n                - type: string\n                description: |-\n                  Controls the concurrency of pods during initial scale up, when replacing pods on nodes,\n                  or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.\n                  The default Concurrency is 100%.\n                x-kubernetes-int-or-string: true\n              podUpdatePolicy:\n                description: |-\n                  PodUpdatePolicy indicates how pods should be updated\n\n\n                  - `StrictInPlace` indicates that only allows in-place upgrades.\n                  Any attempt to modify other fields will be rejected.\n                  - `PreferInPlace` indicates that we will first attempt an in-place upgrade of the Pod.\n                  If that fails, it will fall back to the ReCreate, where pod will be recreated.\n                  Default value is \"PreferInPlace\"\n                type: string\n              replicas:\n                default: 1\n                description: Specifies the desired number of replicas in the Component\n                  for enhancing availability and durability, or load balancing.\n                format: int32\n                minimum: 0\n                type: integer\n              resources:\n                description: |-\n                  Specifies the resources required by the Component.\n                  It allows defining the CPU, memory requirements and limits for the Component's containers.\n                properties:\n                  claims:\n                    description: |-\n                      Claims lists the names of resources, defined in spec.resourceClaims,\n                      that are used by this container.\n\n\n                      This is an alpha field and requires enabling the\n                      DynamicResourceAllocation feature gate.\n\n\n                      This field is immutable. It can only be set for containers.\n                    items:\n                      description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                      properties:\n                        name:\n                          description: |-\n                            Name must match the name of one entry in pod.spec.resourceClaims of\n                            the Pod where this field is used. It makes that resource available\n                            inside a container.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                  limits:\n                    additionalProperties:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                      x-kubernetes-int-or-string: true\n                    description: |-\n                      Limits describes the maximum amount of compute resources allowed.\n                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                    type: object\n                  requests:\n                    additionalProperties:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                      x-kubernetes-int-or-string: true\n                    description: |-\n                      Requests describes the minimum amount of compute resources required.\n                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                    type: object\n                type: object\n                x-kubernetes-preserve-unknown-fields: true\n              runtimeClassName:\n                description: Defines runtimeClassName for all Pods managed by this\n                  Component.\n                type: string\n              schedulingPolicy:\n                description: Specifies the scheduling policy for the Component.\n                properties:\n                  affinity:\n                    description: Specifies a group of affinity scheduling rules of\n                      the Cluster, including NodeAffinity, PodAffinity, and PodAntiAffinity.\n                    properties:\n                      nodeAffinity:\n                        description: Describes node affinity scheduling rules for\n                          the pod.\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: |-\n                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                              properties:\n                                preference:\n                                  description: A node selector term, associated with\n                                    the corresponding weight.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                weight:\n                                  description: Weight associated with matching the\n                                    corresponding nodeSelectorTerm, in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - preference\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to an update), the system\n                              may or may not try to eventually evict the pod from its node.\n                            properties:\n                              nodeSelectorTerms:\n                                description: Required. A list of node selector terms.\n                                  The terms are ORed.\n                                items:\n                                  description: |-\n                                    A null or empty node selector term matches no objects. The requirements of\n                                    them are ANDed.\n                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                  properties:\n                                    matchExpressions:\n                                      description: A list of node selector requirements\n                                        by node's labels.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchFields:\n                                      description: A list of node selector requirements\n                                        by node's fields.\n                                      items:\n                                        description: |-\n                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                          that relates the key and values.\n                                        properties:\n                                          key:\n                                            description: The label key that the selector\n                                              applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              Represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              An array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                              array must have a single element, which will be interpreted as an integer.\n                                              This array is replaced during a strategic merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                type: array\n                            required:\n                            - nodeSelectorTerms\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                      podAffinity:\n                        description: Describes pod affinity scheduling rules (e.g.\n                          co-locate this pod in the same node, zone, etc. as some\n                          other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                      podAntiAffinity:\n                        description: Describes pod anti-affinity scheduling rules\n                          (e.g. avoid putting this pod in the same node, zone, etc.\n                          as some other pod(s)).\n                        properties:\n                          preferredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              The scheduler will prefer to schedule pods to nodes that satisfy\n                              the anti-affinity expressions specified by this field, but it may choose\n                              a node that violates one or more of the expressions. The node that is\n                              most preferred is the one with the greatest sum of weights, i.e.\n                              for each node that meets all of the scheduling requirements (resource\n                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                              compute a sum by iterating through the elements of this field and adding\n                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                              node(s) with the highest sum are the most preferred.\n                            items:\n                              description: The weights of all of the matched WeightedPodAffinityTerm\n                                fields are added per-node to find the most preferred\n                                node(s)\n                              properties:\n                                podAffinityTerm:\n                                  description: Required. A pod affinity term, associated\n                                    with the corresponding weight.\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                weight:\n                                  description: |-\n                                    weight associated with matching the corresponding podAffinityTerm,\n                                    in the range 1-100.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - podAffinityTerm\n                              - weight\n                              type: object\n                            type: array\n                          requiredDuringSchedulingIgnoredDuringExecution:\n                            description: |-\n                              If the anti-affinity requirements specified by this field are not met at\n                              scheduling time, the pod will not be scheduled onto the node.\n                              If the anti-affinity requirements specified by this field cease to be met\n                              at some point during pod execution (e.g. due to a pod label update), the\n                              system may or may not try to eventually evict the pod from its node.\n                              When there are multiple elements, the lists of nodes corresponding to each\n                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                            items:\n                              description: |-\n                                Defines a set of pods (namely those matching the labelSelector\n                                relative to the given namespace(s)) that this pod should be\n                                co-located (affinity) or not co-located (anti-affinity) with,\n                                where co-located is defined as running on a node whose value of\n                                the label with key <topologyKey> matches that of any node on which\n                                a pod of the set of pods is running\n                              properties:\n                                labelSelector:\n                                  description: |-\n                                    A label query over a set of resources, in this case pods.\n                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                matchLabelKeys:\n                                  description: |-\n                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                mismatchLabelKeys:\n                                  description: |-\n                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                    be taken into consideration. The keys are used to lookup values from the\n                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                    to select the group of existing pods which pods will be taken into consideration\n                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                    pod labels will be ignored. The default value is empty.\n                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                  items:\n                                    type: string\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                                namespaceSelector:\n                                  description: |-\n                                    A label query over the set of namespaces that the term applies to.\n                                    The term is applied to the union of the namespaces selected by this field\n                                    and the ones listed in the namespaces field.\n                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                    An empty selector ({}) matches all namespaces.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                namespaces:\n                                  description: |-\n                                    namespaces specifies a static list of namespace names that the term applies to.\n                                    The term is applied to the union of the namespaces listed in this field\n                                    and the ones selected by namespaceSelector.\n                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                  items:\n                                    type: string\n                                  type: array\n                                topologyKey:\n                                  description: |-\n                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                    selected pods is running.\n                                    Empty topologyKey is not allowed.\n                                  type: string\n                              required:\n                              - topologyKey\n                              type: object\n                            type: array\n                        type: object\n                    type: object\n                  nodeName:\n                    description: |-\n                      NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                      the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                      requirements.\n                    type: string\n                  nodeSelector:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      NodeSelector is a selector which must be true for the Pod to fit on a node.\n                      Selector which must match a node's labels for the Pod to be scheduled on that node.\n                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  schedulerName:\n                    description: |-\n                      If specified, the Pod will be dispatched by specified scheduler.\n                      If not specified, the Pod will be dispatched by default scheduler.\n                    type: string\n                  tolerations:\n                    description: |-\n                      Allows Pods to be scheduled onto nodes with matching taints.\n                      Each toleration in the array allows the Pod to tolerate node taints based on\n                      specified `key`, `value`, `effect`, and `operator`.\n\n\n                      - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                      - The `operator` determines how the toleration matches the taint.\n\n\n                      Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                    items:\n                      description: |-\n                        The pod this Toleration is attached to tolerates any taint that matches\n                        the triple <key,value,effect> using the matching operator <operator>.\n                      properties:\n                        effect:\n                          description: |-\n                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                          type: string\n                        key:\n                          description: |-\n                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                          type: string\n                        operator:\n                          description: |-\n                            Operator represents a key's relationship to the value.\n                            Valid operators are Exists and Equal. Defaults to Equal.\n                            Exists is equivalent to wildcard for value, so that a pod can\n                            tolerate all taints of a particular category.\n                          type: string\n                        tolerationSeconds:\n                          description: |-\n                            TolerationSeconds represents the period of time the toleration (which must be\n                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                            negative values will be treated as 0 (evict immediately) by the system.\n                          format: int64\n                          type: integer\n                        value:\n                          description: |-\n                            Value is the taint value the toleration matches to.\n                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                          type: string\n                      type: object\n                    type: array\n                  topologySpreadConstraints:\n                    description: |-\n                      TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                      domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                      All topologySpreadConstraints are ANDed.\n                    items:\n                      description: TopologySpreadConstraint specifies how to spread\n                        matching pods among the given topology.\n                      properties:\n                        labelSelector:\n                          description: |-\n                            LabelSelector is used to find matching pods.\n                            Pods that match this label selector are counted to determine the number of pods\n                            in their corresponding topology domain.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        matchLabelKeys:\n                          description: |-\n                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                            spreading will be calculated. The keys are used to lookup values from the\n                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                            to select the group of existing pods over which spreading will be calculated\n                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                            Keys that don't exist in the incoming pod labels will\n                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        maxSkew:\n                          description: |-\n                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                            between the number of matching pods in the target topology and the global minimum.\n                            The global minimum is the minimum number of matching pods in an eligible domain\n                            or zero if the number of eligible domains is less than MinDomains.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 2/2/1:\n                            In this case, the global minimum is 1.\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |   P   |\n                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                            violate MaxSkew(1).\n                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                            to topologies that satisfy it.\n                            It's a required field. Default value is 1 and 0 is not allowed.\n                          format: int32\n                          type: integer\n                        minDomains:\n                          description: |-\n                            MinDomains indicates a minimum number of eligible domains.\n                            When the number of eligible domains with matching topology keys is less than minDomains,\n                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                            this value has no effect on scheduling.\n                            As a result, when the number of eligible domains is less than minDomains,\n                            scheduler won't schedule more than maxSkew Pods to those domains.\n                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                            Valid values are integers greater than 0.\n                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                            labelSelector spread as 2/2/2:\n                            | zone1 | zone2 | zone3 |\n                            |  P P  |  P P  |  P P  |\n                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                            it will violate MaxSkew.\n\n\n                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                          format: int32\n                          type: integer\n                        nodeAffinityPolicy:\n                          description: |-\n                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                            when calculating pod topology spread skew. Options are:\n                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                            If this value is nil, the behavior is equivalent to the Honor policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        nodeTaintsPolicy:\n                          description: |-\n                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                            pod topology spread skew. Options are:\n                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                            has a toleration, are included.\n                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                          type: string\n                        topologyKey:\n                          description: |-\n                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                            and identical values are considered to be in the same topology.\n                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                            of pods into each bucket.\n                            We define a domain as a particular instance of a topology.\n                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                            nodeAffinityPolicy and nodeTaintsPolicy.\n                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                            It's a required field.\n                          type: string\n                        whenUnsatisfiable:\n                          description: |-\n                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                            the spread constraint.\n                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                              but giving higher precedence to topologies that would help reduce the\n                              skew.\n                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                            if and only if every possible node assignment for that pod would violate\n                            \"MaxSkew\" on some topology.\n                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                            labelSelector spread as 3/1/1:\n                            | zone1 | zone2 | zone3 |\n                            | P P P |   P   |   P   |\n                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                            won't make it *more* imbalanced.\n                            It's a required field.\n                          type: string\n                      required:\n                      - maxSkew\n                      - topologyKey\n                      - whenUnsatisfiable\n                      type: object\n                    type: array\n                type: object\n              serviceAccountName:\n                description: |-\n                  Specifies the name of the ServiceAccount required by the running Component.\n                  This ServiceAccount is used to grant necessary permissions for the Component's Pods to interact\n                  with other Kubernetes resources, such as modifying Pod labels or sending events.\n\n\n                  Defaults:\n                  If not specified, KubeBlocks automatically assigns a default ServiceAccount named \"kb-{cluster.name}\",\n                  bound to a default role defined during KubeBlocks installation.\n\n\n                  Future Changes:\n                  Future versions might change the default ServiceAccount creation strategy to one per Component,\n                  potentially revising the naming to \"kb-{cluster.name}-{component.name}\".\n\n\n                  Users can override the automatic ServiceAccount assignment by explicitly setting the name of\n                  an existed ServiceAccount in this field.\n                type: string\n              serviceRefs:\n                description: |-\n                  Defines a list of ServiceRef for a Component, enabling access to both external services and\n                  Services provided by other Clusters.\n\n\n                  Types of services:\n\n\n                  - External services: Not managed by KubeBlocks or managed by a different KubeBlocks operator;\n                    Require a ServiceDescriptor for connection details.\n                  - Services provided by a Cluster: Managed by the same KubeBlocks operator;\n                    identified using Cluster, Component and Service names.\n\n\n                  ServiceRefs with identical `serviceRef.name` in the same Cluster are considered the same.\n\n\n                  Example:\n                  ```yaml\n                  serviceRefs:\n                    - name: \"redis-sentinel\"\n                      serviceDescriptor:\n                        name: \"external-redis-sentinel\"\n                    - name: \"postgres-cluster\"\n                      clusterServiceSelector:\n                        cluster: \"my-postgres-cluster\"\n                        service:\n                          component: \"postgresql\"\n                  ```\n                  The example above includes ServiceRefs to an external Redis Sentinel service and a PostgreSQL Cluster.\n                items:\n                  properties:\n                    cluster:\n                      description: |-\n                        Specifies the name of the KubeBlocks Cluster being referenced.\n                        This is used when services from another KubeBlocks Cluster are consumed.\n\n\n                        By default, the referenced KubeBlocks Cluster's `clusterDefinition.spec.connectionCredential`\n                        will be utilized to bind to the current Component. This credential should include:\n                        `endpoint`, `port`, `username`, and `password`.\n\n\n                        Note:\n\n\n                        - The `ServiceKind` and `ServiceVersion` specified in the service reference within the\n                          ClusterDefinition are not validated when using this approach.\n                        - If both `cluster` and `serviceDescriptor` are present, `cluster` will take precedence.\n\n\n                        Deprecated since v0.9 since `clusterDefinition.spec.connectionCredential` is deprecated,\n                        use `clusterServiceSelector` instead.\n                        This field is maintained for backward compatibility and its use is discouraged.\n                        Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.\n                      type: string\n                    clusterServiceSelector:\n                      description: |-\n                        References a service provided by another KubeBlocks Cluster.\n                        It specifies the ClusterService and the account credentials needed for access.\n                      properties:\n                        cluster:\n                          description: The name of the Cluster being referenced.\n                          type: string\n                        credential:\n                          description: |-\n                            Specifies the SystemAccount to authenticate and establish a connection with the referenced Cluster.\n                            The SystemAccount should be defined in `componentDefinition.spec.systemAccounts`\n                            of the Component providing the service in the referenced Cluster.\n                          properties:\n                            component:\n                              description: The name of the Component where the credential\n                                resides in.\n                              type: string\n                            name:\n                              description: The name of the credential (SystemAccount)\n                                to reference.\n                              type: string\n                          required:\n                          - component\n                          - name\n                          type: object\n                        service:\n                          description: Identifies a ClusterService from the list of\n                            Services defined in `cluster.spec.services` of the referenced\n                            Cluster.\n                          properties:\n                            component:\n                              description: |-\n                                The name of the Component where the Service resides in.\n\n\n                                It is required when referencing a Component's Service.\n                              type: string\n                            port:\n                              description: |-\n                                The port name of the Service to be referenced.\n\n\n                                If there is a non-zero node-port exist for the matched Service port, the node-port will be selected first.\n\n\n                                If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                and the resolved value will be presented in the following format: service1.name:port1,service2.name:port2...\n                              type: string\n                            service:\n                              description: |-\n                                The name of the Service to be referenced.\n\n\n                                Leave it empty to reference the default Service. Set it to \"headless\" to reference the default headless Service.\n\n\n                                If the referenced Service is of pod-service type (a Service per Pod), there will be multiple Service objects matched,\n                                and the resolved value will be presented in the following format: service1.name,service2.name...\n                              type: string\n                          required:\n                          - service\n                          type: object\n                      required:\n                      - cluster\n                      type: object\n                    name:\n                      description: |-\n                        Specifies the identifier of the service reference declaration.\n                        It corresponds to the serviceRefDeclaration name defined in either:\n\n\n                        - `componentDefinition.spec.serviceRefDeclarations[*].name`\n                        - `clusterDefinition.spec.componentDefs[*].serviceRefDeclarations[*].name` (deprecated)\n                      type: string\n                    namespace:\n                      description: |-\n                        Specifies the namespace of the referenced Cluster or the namespace of the referenced ServiceDescriptor object.\n                        If not provided, the referenced Cluster and ServiceDescriptor will be searched in the namespace of the current\n                        Cluster by default.\n                      type: string\n                    serviceDescriptor:\n                      description: |-\n                        Specifies the name of the ServiceDescriptor object that describes a service provided by external sources.\n\n\n                        When referencing a service provided by external sources, a ServiceDescriptor object is required to establish\n                        the service binding.\n                        The `serviceDescriptor.spec.serviceKind` and `serviceDescriptor.spec.serviceVersion` should match the serviceKind\n                        and serviceVersion declared in the definition.\n\n\n                        If both `cluster` and `serviceDescriptor` are specified, the `cluster` takes precedence.\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n              serviceVersion:\n                description: |-\n                  ServiceVersion specifies the version of the Service expected to be provisioned by this Component.\n                  The version should follow the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n                maxLength: 32\n                type: string\n              services:\n                description: |-\n                  Overrides Services defined in referenced ComponentDefinition and exposes endpoints that can be accessed\n                  by clients.\n                items:\n                  description: |-\n                    ComponentService defines a service that would be exposed as an inter-component service within a Cluster.\n                    A Service defined in the ComponentService is expected to be accessed by other Components within the same Cluster.\n\n\n                    When a Component needs to use a ComponentService provided by another Component within the same Cluster,\n                    it can declare a variable in the `componentDefinition.spec.vars` section and bind it to the specific exposed address\n                    of the ComponentService using the `serviceVarRef` field.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        If ServiceType is LoadBalancer, cloud provider related parameters can be put here\n                        More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                      type: object\n                    disableAutoProvision:\n                      description: |-\n                        Indicates whether the automatic provisioning of the service should be disabled.\n\n\n                        If set to true, the service will not be automatically created at the component provisioning.\n                        Instead, you can enable the creation of this service by specifying it explicitly in the cluster API.\n                      type: boolean\n                    name:\n                      description: |-\n                        Name defines the name of the service.\n                        otherwise, it indicates the name of the service.\n                        Others can refer to this service by its name. (e.g., connection credential)\n                        Cannot be updated.\n                      maxLength: 25\n                      type: string\n                    podService:\n                      default: false\n                      description: |-\n                        Indicates whether to create a corresponding Service for each Pod of the selected Component.\n                        When set to true, a set of Services will be automatically generated for each Pod,\n                        and the `roleSelector` field will be ignored.\n\n\n                        The names of the generated Services will follow the same suffix naming pattern: `$(serviceName)-$(podOrdinal)`.\n                        The total number of generated Services will be equal to the number of replicas specified for the Component.\n\n\n                        Example usage:\n\n\n                        ```yaml\n                        name: my-service\n                        serviceName: my-service\n                        podService: true\n                        disableAutoProvision: true\n                        spec:\n                          type: NodePort\n                          ports:\n                          - name: http\n                            port: 80\n                            targetPort: 8080\n                        ```\n\n\n                        In this example, if the Component has 3 replicas, three Services will be generated:\n                        - my-service-0: Points to the first Pod (podOrdinal: 0)\n                        - my-service-1: Points to the second Pod (podOrdinal: 1)\n                        - my-service-2: Points to the third Pod (podOrdinal: 2)\n\n\n                        Each generated Service will have the specified spec configuration and will target its respective Pod.\n\n\n                        This feature is useful when you need to expose each Pod of a Component individually, allowing external access\n                        to specific instances of the Component.\n                      type: boolean\n                    roleSelector:\n                      description: \"Extends the above `serviceSpec.selector` by allowing\n                        you to specify defined role as selector for the service.\\nWhen\n                        `roleSelector` is set, it adds a label selector \\\"kubeblocks.io/role:\n                        {roleSelector}\\\"\\nto the `serviceSpec.selector`.\\nExample\n                        usage:\\n\\n\\n\\t  roleSelector: \\\"leader\\\"\\n\\n\\nIn this example,\n                        setting `roleSelector` to \\\"leader\\\" will add a label selector\\n\\\"kubeblocks.io/role:\n                        leader\\\" to the `serviceSpec.selector`.\\nThis means that the\n                        service will select and route traffic to Pods with the label\\n\\\"kubeblocks.io/role\\\"\n                        set to \\\"leader\\\".\\n\\n\\nNote that if `podService` sets to\n                        true, RoleSelector will be ignored.\\nThe `podService` flag\n                        takes precedence over `roleSelector` and generates a service\n                        for each Pod.\"\n                      type: string\n                    serviceName:\n                      description: |-\n                        ServiceName defines the name of the underlying service object.\n                        If not specified, the default service name with different patterns will be used:\n\n\n                        - CLUSTER_NAME: for cluster-level services\n                        - CLUSTER_NAME-COMPONENT_NAME: for component-level services\n\n\n                        Only one default service name is allowed.\n                        Cannot be updated.\n                      maxLength: 25\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    spec:\n                      description: |-\n                        Spec defines the behavior of a service.\n                        https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                      properties:\n                        allocateLoadBalancerNodePorts:\n                          description: |-\n                            allocateLoadBalancerNodePorts defines if NodePorts will be automatically\n                            allocated for services with type LoadBalancer.  Default is \"true\". It\n                            may be set to \"false\" if the cluster load-balancer does not rely on\n                            NodePorts.  If the caller requests specific NodePorts (by specifying a\n                            value), those requests will be respected, regardless of this field.\n                            This field may only be set for services with type LoadBalancer and will\n                            be cleared if the type is changed to any other type.\n                          type: boolean\n                        clusterIP:\n                          description: |-\n                            clusterIP is the IP address of the service and is usually assigned\n                            randomly. If an address is specified manually, is in-range (as per\n                            system configuration), and is not in use, it will be allocated to the\n                            service; otherwise creation of the service will fail. This field may not\n                            be changed through updates unless the type field is also being changed\n                            to ExternalName (which requires this field to be blank) or the type\n                            field is being changed from ExternalName (in which case this field may\n                            optionally be specified, as describe above).  Valid values are \"None\",\n                            empty string (\"\"), or a valid IP address. Setting this to \"None\" makes a\n                            \"headless service\" (no virtual IP), which is useful when direct endpoint\n                            connections are preferred and proxying is not required.  Only applies to\n                            types ClusterIP, NodePort, and LoadBalancer. If this field is specified\n                            when creating a Service of type ExternalName, creation will fail. This\n                            field will be wiped when updating a Service to type ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        clusterIPs:\n                          description: |-\n                            ClusterIPs is a list of IP addresses assigned to this service, and are\n                            usually assigned randomly.  If an address is specified manually, is\n                            in-range (as per system configuration), and is not in use, it will be\n                            allocated to the service; otherwise creation of the service will fail.\n                            This field may not be changed through updates unless the type field is\n                            also being changed to ExternalName (which requires this field to be\n                            empty) or the type field is being changed from ExternalName (in which\n                            case this field may optionally be specified, as describe above).  Valid\n                            values are \"None\", empty string (\"\"), or a valid IP address.  Setting\n                            this to \"None\" makes a \"headless service\" (no virtual IP), which is\n                            useful when direct endpoint connections are preferred and proxying is\n                            not required.  Only applies to types ClusterIP, NodePort, and\n                            LoadBalancer. If this field is specified when creating a Service of type\n                            ExternalName, creation will fail. This field will be wiped when updating\n                            a Service to type ExternalName.  If this field is not specified, it will\n                            be initialized from the clusterIP field.  If this field is specified,\n                            clients must ensure that clusterIPs[0] and clusterIP have the same\n                            value.\n\n\n                            This field may hold a maximum of two entries (dual-stack IPs, in either order).\n                            These IPs must correspond to the values of the ipFamilies field. Both\n                            clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        externalIPs:\n                          description: |-\n                            externalIPs is a list of IP addresses for which nodes in the cluster\n                            will also accept traffic for this service.  These IPs are not managed by\n                            Kubernetes.  The user is responsible for ensuring that traffic arrives\n                            at a node with this IP.  A common example is external load-balancers\n                            that are not part of the Kubernetes system.\n                          items:\n                            type: string\n                          type: array\n                        externalName:\n                          description: |-\n                            externalName is the external reference that discovery mechanisms will\n                            return as an alias for this service (e.g. a DNS CNAME record). No\n                            proxying will be involved.  Must be a lowercase RFC-1123 hostname\n                            (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".\n                          type: string\n                        externalTrafficPolicy:\n                          description: |-\n                            externalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on one of the Service's \"externally-facing\" addresses (NodePorts,\n                            ExternalIPs, and LoadBalancer IPs). If set to \"Local\", the proxy will configure\n                            the service in a way that assumes that external load balancers will take care\n                            of balancing the service traffic between nodes, and so each node will deliver\n                            traffic only to the node-local endpoints of the service, without masquerading\n                            the client source IP. (Traffic mistakenly sent to a node with no endpoints will\n                            be dropped.) The default value, \"Cluster\", uses the standard behavior of\n                            routing to all endpoints evenly (possibly modified by topology and other\n                            features). Note that traffic sent to an External IP or LoadBalancer IP from\n                            within the cluster will always get \"Cluster\" semantics, but clients sending to\n                            a NodePort from within the cluster may need to take traffic policy into account\n                            when picking a node.\n                          type: string\n                        healthCheckNodePort:\n                          description: |-\n                            healthCheckNodePort specifies the healthcheck nodePort for the service.\n                            This only applies when type is set to LoadBalancer and\n                            externalTrafficPolicy is set to Local. If a value is specified, is\n                            in-range, and is not in use, it will be used.  If not specified, a value\n                            will be automatically allocated.  External systems (e.g. load-balancers)\n                            can use this port to determine if a given node holds endpoints for this\n                            service or not.  If this field is specified when creating a Service\n                            which does not need it, creation will fail. This field will be wiped\n                            when updating a Service to no longer need it (e.g. changing type).\n                            This field cannot be updated once set.\n                          format: int32\n                          type: integer\n                        internalTrafficPolicy:\n                          description: |-\n                            InternalTrafficPolicy describes how nodes distribute service traffic they\n                            receive on the ClusterIP. If set to \"Local\", the proxy will assume that pods\n                            only want to talk to endpoints of the service on the same node as the pod,\n                            dropping the traffic if there are no local endpoints. The default value,\n                            \"Cluster\", uses the standard behavior of routing to all endpoints evenly\n                            (possibly modified by topology and other features).\n                          type: string\n                        ipFamilies:\n                          description: |-\n                            IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this\n                            service. This field is usually assigned automatically based on cluster\n                            configuration and the ipFamilyPolicy field. If this field is specified\n                            manually, the requested family is available in the cluster,\n                            and ipFamilyPolicy allows it, it will be used; otherwise creation of\n                            the service will fail. This field is conditionally mutable: it allows\n                            for adding or removing a secondary IP family, but it does not allow\n                            changing the primary IP family of the Service. Valid values are \"IPv4\"\n                            and \"IPv6\".  This field only applies to Services of types ClusterIP,\n                            NodePort, and LoadBalancer, and does apply to \"headless\" services.\n                            This field will be wiped when updating a Service to type ExternalName.\n\n\n                            This field may hold a maximum of two entries (dual-stack families, in\n                            either order).  These families must correspond to the values of the\n                            clusterIPs field, if specified. Both clusterIPs and ipFamilies are\n                            governed by the ipFamilyPolicy field.\n                          items:\n                            description: |-\n                              IPFamily represents the IP Family (IPv4 or IPv6). This type is used\n                              to express the family of an IP expressed by a type (e.g. service.spec.ipFamilies).\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: atomic\n                        ipFamilyPolicy:\n                          description: |-\n                            IPFamilyPolicy represents the dual-stack-ness requested or required by\n                            this Service. If there is no value provided, then this field will be set\n                            to SingleStack. Services can be \"SingleStack\" (a single IP family),\n                            \"PreferDualStack\" (two IP families on dual-stack configured clusters or\n                            a single IP family on single-stack clusters), or \"RequireDualStack\"\n                            (two IP families on dual-stack configured clusters, otherwise fail). The\n                            ipFamilies and clusterIPs fields depend on the value of this field. This\n                            field will be wiped when updating a service to type ExternalName.\n                          type: string\n                        loadBalancerClass:\n                          description: |-\n                            loadBalancerClass is the class of the load balancer implementation this Service belongs to.\n                            If specified, the value of this field must be a label-style identifier, with an optional prefix,\n                            e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users.\n                            This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load\n                            balancer implementation is used, today this is typically done through the cloud provider integration,\n                            but should apply for any default implementation. If set, it is assumed that a load balancer\n                            implementation is watching for Services with a matching class. Any default load balancer\n                            implementation (e.g. cloud providers) should ignore Services that set this field.\n                            This field can only be set when creating or updating a Service to type 'LoadBalancer'.\n                            Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.\n                          type: string\n                        loadBalancerIP:\n                          description: |-\n                            Only applies to Service Type: LoadBalancer.\n                            This feature depends on whether the underlying cloud-provider supports specifying\n                            the loadBalancerIP when a load balancer is created.\n                            This field will be ignored if the cloud-provider does not support the feature.\n                            Deprecated: This field was under-specified and its meaning varies across implementations.\n                            Using it is non-portable and it may not support dual-stack.\n                            Users are encouraged to use implementation-specific annotations when available.\n                          type: string\n                        loadBalancerSourceRanges:\n                          description: |-\n                            If specified and supported by the platform, this will restrict traffic through the cloud-provider\n                            load-balancer will be restricted to the specified client IPs. This field will be ignored if the\n                            cloud-provider does not support the feature.\"\n                            More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/\n                          items:\n                            type: string\n                          type: array\n                        ports:\n                          description: |-\n                            The list of ports that are exposed by this service.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          items:\n                            description: ServicePort contains information on service's\n                              port.\n                            properties:\n                              appProtocol:\n                                description: |-\n                                  The application protocol for this port.\n                                  This is used as a hint for implementations to offer richer behavior for protocols that they understand.\n                                  This field follows standard Kubernetes label syntax.\n                                  Valid values are either:\n\n\n                                  * Un-prefixed protocol names - reserved for IANA standard service names (as per\n                                  RFC-6335 and https://www.iana.org/assignments/service-names).\n\n\n                                  * Kubernetes-defined prefixed names:\n                                    * 'kubernetes.io/h2c' - HTTP/2 prior knowledge over cleartext as described in https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior-\n                                    * 'kubernetes.io/ws'  - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n                                    * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n\n                                  * Other protocols should use implementation-defined prefixed names such as\n                                  mycompany.com/my-custom-protocol.\n                                type: string\n                              name:\n                                description: |-\n                                  The name of this port within the service. This must be a DNS_LABEL.\n                                  All ports within a ServiceSpec must have unique names. When considering\n                                  the endpoints for a Service, this must match the 'name' field in the\n                                  EndpointPort.\n                                  Optional if only one ServicePort is defined on this service.\n                                type: string\n                              nodePort:\n                                description: |-\n                                  The port on each node on which this service is exposed when type is\n                                  NodePort or LoadBalancer.  Usually assigned by the system. If a value is\n                                  specified, in-range, and not in use it will be used, otherwise the\n                                  operation will fail.  If not specified, a port will be allocated if this\n                                  Service requires one.  If this field is specified when creating a\n                                  Service which does not need it, creation will fail. This field will be\n                                  wiped when updating a Service to no longer need it (e.g. changing type\n                                  from NodePort to ClusterIP).\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n                                format: int32\n                                type: integer\n                              port:\n                                description: The port that will be exposed by this\n                                  service.\n                                format: int32\n                                type: integer\n                              protocol:\n                                default: TCP\n                                description: |-\n                                  The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\".\n                                  Default is TCP.\n                                type: string\n                              targetPort:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  Number or name of the port to access on the pods targeted by the service.\n                                  Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.\n                                  If this is a string, it will be looked up as a named port in the\n                                  target Pod's container ports. If this is not specified, the value\n                                  of the 'port' field is used (an identity map).\n                                  This field is ignored for services with clusterIP=None, and should be\n                                  omitted or set equal to the 'port' field.\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service\n                                x-kubernetes-int-or-string: true\n                            required:\n                            - port\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - port\n                          - protocol\n                          x-kubernetes-list-type: map\n                        publishNotReadyAddresses:\n                          description: |-\n                            publishNotReadyAddresses indicates that any agent which deals with endpoints for this\n                            Service should disregard any indications of ready/not-ready.\n                            The primary use case for setting this field is for a StatefulSet's Headless Service to\n                            propagate SRV DNS records for its Pods for the purpose of peer discovery.\n                            The Kubernetes controllers that generate Endpoints and EndpointSlice resources for\n                            Services interpret this to mean that all endpoints are considered \"ready\" even if the\n                            Pods themselves are not. Agents which consume only Kubernetes generated endpoints\n                            through the Endpoints or EndpointSlice resources can safely assume this behavior.\n                          type: boolean\n                        selector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            Route service traffic to pods with label keys and values matching this\n                            selector. If empty or not present, the service is assumed to have an\n                            external process managing its endpoints, which Kubernetes will not\n                            modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.\n                            Ignored if type is ExternalName.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        sessionAffinity:\n                          description: |-\n                            Supports \"ClientIP\" and \"None\". Used to maintain session affinity.\n                            Enable client IP based session affinity.\n                            Must be ClientIP or None.\n                            Defaults to None.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                          type: string\n                        sessionAffinityConfig:\n                          description: sessionAffinityConfig contains the configurations\n                            of session affinity.\n                          properties:\n                            clientIP:\n                              description: clientIP contains the configurations of\n                                Client IP based session affinity.\n                              properties:\n                                timeoutSeconds:\n                                  description: |-\n                                    timeoutSeconds specifies the seconds of ClientIP type session sticky time.\n                                    The value must be >0 && <=86400(for 1 day) if ServiceAffinity == \"ClientIP\".\n                                    Default value is 10800(for 3 hours).\n                                  format: int32\n                                  type: integer\n                              type: object\n                          type: object\n                        type:\n                          description: |-\n                            type determines how the Service is exposed. Defaults to ClusterIP. Valid\n                            options are ExternalName, ClusterIP, NodePort, and LoadBalancer.\n                            \"ClusterIP\" allocates a cluster-internal IP address for load-balancing\n                            to endpoints. Endpoints are determined by the selector or if that is not\n                            specified, by manual construction of an Endpoints object or\n                            EndpointSlice objects. If clusterIP is \"None\", no virtual IP is\n                            allocated and the endpoints are published as a set of endpoints rather\n                            than a virtual IP.\n                            \"NodePort\" builds on ClusterIP and allocates a port on every node which\n                            routes to the same endpoints as the clusterIP.\n                            \"LoadBalancer\" builds on NodePort and creates an external load-balancer\n                            (if supported in the current cloud) which routes to the same endpoints\n                            as the clusterIP.\n                            \"ExternalName\" aliases this service to the specified externalName.\n                            Several other fields do not apply to ExternalName services.\n                            More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types\n                          type: string\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              stop:\n                description: |-\n                  Stop the Component.\n                  If set, all the computing resources will be released.\n                type: boolean\n              systemAccounts:\n                description: Overrides system accounts defined in referenced ComponentDefinition.\n                items:\n                  properties:\n                    name:\n                      description: The name of the system account.\n                      type: string\n                    passwordConfig:\n                      description: |-\n                        Specifies the policy for generating the account's password.\n\n\n                        This field is immutable once set.\n                      properties:\n                        length:\n                          default: 16\n                          description: The length of the password.\n                          format: int32\n                          maximum: 32\n                          minimum: 8\n                          type: integer\n                        letterCase:\n                          default: MixedCases\n                          description: The case of the letters in the password.\n                          enum:\n                          - LowerCases\n                          - UpperCases\n                          - MixedCases\n                          type: string\n                        numDigits:\n                          default: 4\n                          description: The number of digits in the password.\n                          format: int32\n                          maximum: 8\n                          minimum: 0\n                          type: integer\n                        numSymbols:\n                          default: 0\n                          description: The number of symbols in the password.\n                          format: int32\n                          maximum: 8\n                          minimum: 0\n                          type: integer\n                        seed:\n                          description: |-\n                            Seed to generate the account's password.\n                            Cannot be updated.\n                          type: string\n                      type: object\n                    secretRef:\n                      description: |-\n                        Refers to the secret from which data will be copied to create the new account.\n\n\n                        This field is immutable once set.\n                      properties:\n                        name:\n                          description: The unique identifier of the secret.\n                          type: string\n                        namespace:\n                          description: The namespace where the secret is located.\n                          type: string\n                      required:\n                      - name\n                      - namespace\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              tlsConfig:\n                description: \"Specifies the TLS configuration for the Component, including:\\n\\n\\n-\n                  A boolean flag that indicates whether the Component should use Transport\n                  Layer Security (TLS) for secure communication.\\n- An optional field\n                  that specifies the configuration for the TLS certificates issuer\n                  when TLS is enabled.\\n  It allows defining the issuer name and the\n                  reference to the secret containing the TLS certificates and key.\\n\\t\n                  The secret should contain the CA certificate, TLS certificate, and\n                  private key in the specified keys.\"\n                properties:\n                  enable:\n                    default: false\n                    description: |-\n                      A boolean flag that indicates whether the Component should use Transport Layer Security (TLS)\n                      for secure communication.\n                      When set to true, the Component will be configured to use TLS encryption for its network connections.\n                      This ensures that the data transmitted between the Component and its clients or other Components is encrypted\n                      and protected from unauthorized access.\n                      If TLS is enabled, the Component may require additional configuration,\n                      such as specifying TLS certificates and keys, to properly set up the secure communication channel.\n                    type: boolean\n                  issuer:\n                    description: |-\n                      Specifies the configuration for the TLS certificates issuer.\n                      It allows defining the issuer name and the reference to the secret containing the TLS certificates and key.\n                      The secret should contain the CA certificate, TLS certificate, and private key in the specified keys.\n                      Required when TLS is enabled.\n                    properties:\n                      name:\n                        allOf:\n                        - enum:\n                          - KubeBlocks\n                          - UserProvided\n                        - enum:\n                          - KubeBlocks\n                          - UserProvided\n                        default: KubeBlocks\n                        description: |-\n                          The issuer for TLS certificates.\n                          It only allows two enum values: `KubeBlocks` and `UserProvided`.\n\n\n                          - `KubeBlocks` indicates that the self-signed TLS certificates generated by the KubeBlocks Operator will be used.\n                          - `UserProvided` means that the user is responsible for providing their own CA, Cert, and Key.\n                            In this case, the user-provided CA certificate, server certificate, and private key will be used\n                            for TLS communication.\n                        type: string\n                      secretRef:\n                        description: |-\n                          SecretRef is the reference to the secret that contains user-provided certificates.\n                          It is required when the issuer is set to `UserProvided`.\n                        properties:\n                          ca:\n                            description: Key of CA cert in Secret\n                            type: string\n                          cert:\n                            description: Key of Cert in Secret\n                            type: string\n                          key:\n                            description: Key of TLS private key in Secret\n                            type: string\n                          name:\n                            description: Name of the Secret that contains user-provided\n                              certificates.\n                            type: string\n                        required:\n                        - ca\n                        - cert\n                        - key\n                        - name\n                        type: object\n                    required:\n                    - name\n                    type: object\n                type: object\n              tolerations:\n                description: |-\n                  Allows Pods to be scheduled onto nodes with matching taints.\n                  Each toleration in the array allows the Pod to tolerate node taints based on\n                  specified `key`, `value`, `effect`, and `operator`.\n\n\n                  - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                  - The `operator` determines how the toleration matches the taint.\n\n\n                  Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n\n\n                  Deprecated since v0.10, replaced by the `schedulingPolicy` field.\n                items:\n                  description: |-\n                    The pod this Toleration is attached to tolerates any taint that matches\n                    the triple <key,value,effect> using the matching operator <operator>.\n                  properties:\n                    effect:\n                      description: |-\n                        Effect indicates the taint effect to match. Empty means match all taint effects.\n                        When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                      type: string\n                    key:\n                      description: |-\n                        Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                        If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                      type: string\n                    operator:\n                      description: |-\n                        Operator represents a key's relationship to the value.\n                        Valid operators are Exists and Equal. Defaults to Equal.\n                        Exists is equivalent to wildcard for value, so that a pod can\n                        tolerate all taints of a particular category.\n                      type: string\n                    tolerationSeconds:\n                      description: |-\n                        TolerationSeconds represents the period of time the toleration (which must be\n                        of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                        it is not set, which means tolerate the taint forever (do not evict). Zero and\n                        negative values will be treated as 0 (evict immediately) by the system.\n                      format: int64\n                      type: integer\n                    value:\n                      description: |-\n                        Value is the taint value the toleration matches to.\n                        If the operator is Exists, the value should be empty, otherwise just a regular string.\n                      type: string\n                  type: object\n                type: array\n              volumeClaimTemplates:\n                description: |-\n                  Specifies a list of PersistentVolumeClaim templates that define the storage requirements for the Component.\n                  Each template specifies the desired characteristics of a persistent volume, such as storage class,\n                  size, and access modes.\n                  These templates are used to dynamically provision persistent volumes for the Component.\n                items:\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: Specifies the annotations for the PVC of the volume.\n                      type: object\n                    labels:\n                      additionalProperties:\n                        type: string\n                      description: Specifies the labels for the PVC of the volume.\n                      type: object\n                    name:\n                      description: |-\n                        Refers to the name of a volumeMount defined in either:\n\n\n                        - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                        - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                        The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                      type: string\n                    spec:\n                      description: |-\n                        Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                        with the mount name specified in the `name` field.\n\n\n                        When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                        defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                      properties:\n                        accessModes:\n                          description: |-\n                            Contains the desired access modes the volume should have.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-preserve-unknown-fields: true\n                        resources:\n                          description: |-\n                            Represents the minimum resources the volume should have.\n                            If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                            are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                          properties:\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                          x-kubernetes-preserve-unknown-fields: true\n                        storageClassName:\n                          description: |-\n                            The name of the StorageClass required by the claim.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                          type: string\n                        volumeMode:\n                          description: Defines what type of volume is required by\n                            the claim, either Block or Filesystem.\n                          type: string\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              volumes:\n                description: List of volumes to override.\n                items:\n                  description: Volume represents a named volume in a pod that may\n                    be accessed by any container in the pod.\n                  properties:\n                    awsElasticBlockStore:\n                      description: |-\n                        awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                        kubelet's host machine and then exposed to the pod.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type of the volume that you want to mount.\n                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        partition:\n                          description: |-\n                            partition is the partition in the volume that you want to mount.\n                            If omitted, the default is to mount by volume name.\n                            Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                            Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                          format: int32\n                          type: integer\n                        readOnly:\n                          description: |-\n                            readOnly value true will force the readOnly setting in VolumeMounts.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                          type: boolean\n                        volumeID:\n                          description: |-\n                            volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                          type: string\n                      required:\n                      - volumeID\n                      type: object\n                    azureDisk:\n                      description: azureDisk represents an Azure Data Disk mount on\n                        the host and bind mount to the pod.\n                      properties:\n                        cachingMode:\n                          description: 'cachingMode is the Host Caching mode: None,\n                            Read Only, Read Write.'\n                          type: string\n                        diskName:\n                          description: diskName is the Name of the data disk in the\n                            blob storage\n                          type: string\n                        diskURI:\n                          description: diskURI is the URI of data disk in the blob\n                            storage\n                          type: string\n                        fsType:\n                          description: |-\n                            fsType is Filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        kind:\n                          description: 'kind expected values are Shared: multiple\n                            blob disks per storage account  Dedicated: single blob\n                            disk per storage account  Managed: azure managed data\n                            disk (only in managed availability set). defaults to shared'\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly Defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                      required:\n                      - diskName\n                      - diskURI\n                      type: object\n                    azureFile:\n                      description: azureFile represents an Azure File Service mount\n                        on the host and bind mount to the pod.\n                      properties:\n                        readOnly:\n                          description: |-\n                            readOnly defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        secretName:\n                          description: secretName is the  name of secret that contains\n                            Azure Storage Account Name and Key\n                          type: string\n                        shareName:\n                          description: shareName is the azure share Name\n                          type: string\n                      required:\n                      - secretName\n                      - shareName\n                      type: object\n                    cephfs:\n                      description: cephFS represents a Ceph FS mount on the host that\n                        shares a pod's lifetime\n                      properties:\n                        monitors:\n                          description: |-\n                            monitors is Required: Monitors is a collection of Ceph monitors\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          items:\n                            type: string\n                          type: array\n                        path:\n                          description: 'path is Optional: Used as the mounted root,\n                            rather than the full Ceph tree, default is /'\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          type: boolean\n                        secretFile:\n                          description: |-\n                            secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          type: string\n                        secretRef:\n                          description: |-\n                            secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        user:\n                          description: |-\n                            user is optional: User is the rados user name, default is admin\n                            More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                          type: string\n                      required:\n                      - monitors\n                      type: object\n                    cinder:\n                      description: |-\n                        cinder represents a cinder volume attached and mounted on kubelets host machine.\n                        More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef is optional: points to a secret object containing parameters used to connect\n                            to OpenStack.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        volumeID:\n                          description: |-\n                            volumeID used to identify the volume in cinder.\n                            More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                          type: string\n                      required:\n                      - volumeID\n                      type: object\n                    configMap:\n                      description: configMap represents a configMap that should populate\n                        this volume\n                      properties:\n                        defaultMode:\n                          description: |-\n                            defaultMode is optional: mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                            Defaults to 0644.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        items:\n                          description: |-\n                            items if unspecified, each key-value pair in the Data field of the referenced\n                            ConfigMap will be projected into the volume as a file whose name is the\n                            key and content is the value. If specified, the listed keys will be\n                            projected into the specified paths, and unlisted keys will not be\n                            present. If a key is specified which is not present in the ConfigMap,\n                            the volume setup will error unless it is marked optional. Paths must be\n                            relative and may not contain the '..' path or start with '..'.\n                          items:\n                            description: Maps a string key to a path within a volume.\n                            properties:\n                              key:\n                                description: key is the key to project.\n                                type: string\n                              mode:\n                                description: |-\n                                  mode is Optional: mode bits used to set permissions on this file.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  If not specified, the volume defaultMode will be used.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              path:\n                                description: |-\n                                  path is the relative path of the file to map the key to.\n                                  May not be an absolute path.\n                                  May not contain the path element '..'.\n                                  May not start with the string '..'.\n                                type: string\n                            required:\n                            - key\n                            - path\n                            type: object\n                          type: array\n                        name:\n                          description: |-\n                            Name of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            TODO: Add other useful fields. apiVersion, kind, uid?\n                          type: string\n                        optional:\n                          description: optional specify whether the ConfigMap or its\n                            keys must be defined\n                          type: boolean\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    csi:\n                      description: csi (Container Storage Interface) represents ephemeral\n                        storage that is handled by certain external CSI drivers (Beta\n                        feature).\n                      properties:\n                        driver:\n                          description: |-\n                            driver is the name of the CSI driver that handles this volume.\n                            Consult with your admin for the correct name as registered in the cluster.\n                          type: string\n                        fsType:\n                          description: |-\n                            fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                            If not provided, the empty value is passed to the associated CSI driver\n                            which will determine the default filesystem to apply.\n                          type: string\n                        nodePublishSecretRef:\n                          description: |-\n                            nodePublishSecretRef is a reference to the secret object containing\n                            sensitive information to pass to the CSI driver to complete the CSI\n                            NodePublishVolume and NodeUnpublishVolume calls.\n                            This field is optional, and  may be empty if no secret is required. If the\n                            secret object contains more than one secret, all secret references are passed.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        readOnly:\n                          description: |-\n                            readOnly specifies a read-only configuration for the volume.\n                            Defaults to false (read/write).\n                          type: boolean\n                        volumeAttributes:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            volumeAttributes stores driver-specific properties that are passed to the CSI\n                            driver. Consult your driver's documentation for supported values.\n                          type: object\n                      required:\n                      - driver\n                      type: object\n                    downwardAPI:\n                      description: downwardAPI represents downward API about the pod\n                        that should populate this volume\n                      properties:\n                        defaultMode:\n                          description: |-\n                            Optional: mode bits to use on created files by default. Must be a\n                            Optional: mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                            Defaults to 0644.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        items:\n                          description: Items is a list of downward API volume file\n                          items:\n                            description: DownwardAPIVolumeFile represents information\n                              to create the file containing the pod field\n                            properties:\n                              fieldRef:\n                                description: 'Required: Selects a field of the pod:\n                                  only annotations, labels, name and namespace are\n                                  supported.'\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              mode:\n                                description: |-\n                                  Optional: mode bits used to set permissions on this file, must be an octal value\n                                  between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  If not specified, the volume defaultMode will be used.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              path:\n                                description: 'Required: Path is  the relative path\n                                  name of the file to be created. Must not be absolute\n                                  or contain the ''..'' path. Must be utf-8 encoded.\n                                  The first item of the relative path must not start\n                                  with ''..'''\n                                type: string\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            required:\n                            - path\n                            type: object\n                          type: array\n                      type: object\n                    emptyDir:\n                      description: |-\n                        emptyDir represents a temporary directory that shares a pod's lifetime.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                      properties:\n                        medium:\n                          description: |-\n                            medium represents what type of storage medium should back this directory.\n                            The default is \"\" which means to use the node's default medium.\n                            Must be an empty string (default) or Memory.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                          type: string\n                        sizeLimit:\n                          anyOf:\n                          - type: integer\n                          - type: string\n                          description: |-\n                            sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                            The size limit is also applicable for memory medium.\n                            The maximum usage on memory medium EmptyDir would be the minimum value between\n                            the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                            The default is nil which means that the limit is undefined.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                          x-kubernetes-int-or-string: true\n                      type: object\n                    ephemeral:\n                      description: |-\n                        ephemeral represents a volume that is handled by a cluster storage driver.\n                        The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                        and deleted when the pod is removed.\n\n\n                        Use this if:\n                        a) the volume is only needed while the pod runs,\n                        b) features of normal volumes like restoring from snapshot or capacity\n                           tracking are needed,\n                        c) the storage driver is specified through a storage class, and\n                        d) the storage driver supports dynamic volume provisioning through\n                           a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                           information on the connection between this volume type\n                           and PersistentVolumeClaim).\n\n\n                        Use PersistentVolumeClaim or one of the vendor-specific\n                        APIs for volumes that persist for longer than the lifecycle\n                        of an individual pod.\n\n\n                        Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                        be used that way - see the documentation of the driver for\n                        more information.\n\n\n                        A pod can use both types of ephemeral volumes and\n                        persistent volumes at the same time.\n                      properties:\n                        volumeClaimTemplate:\n                          description: |-\n                            Will be used to create a stand-alone PVC to provision the volume.\n                            The pod in which this EphemeralVolumeSource is embedded will be the\n                            owner of the PVC, i.e. the PVC will be deleted together with the\n                            pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                            `<volume name>` is the name from the `PodSpec.Volumes` array\n                            entry. Pod validation will reject the pod if the concatenated name\n                            is not valid for a PVC (for example, too long).\n\n\n                            An existing PVC with that name that is not owned by the pod\n                            will *not* be used for the pod to avoid using an unrelated\n                            volume by mistake. Starting the pod is then blocked until\n                            the unrelated PVC is removed. If such a pre-created PVC is\n                            meant to be used by the pod, the PVC has to updated with an\n                            owner reference to the pod once the pod exists. Normally\n                            this should not be necessary, but it may be useful when\n                            manually reconstructing a broken cluster.\n\n\n                            This field is read-only and no changes will be made by Kubernetes\n                            to the PVC after it has been created.\n\n\n                            Required, must not be nil.\n                          properties:\n                            metadata:\n                              description: |-\n                                May contain labels and annotations that will be copied into the PVC\n                                when creating it. No other fields are allowed and will be rejected during\n                                validation.\n                              properties:\n                                annotations:\n                                  additionalProperties:\n                                    type: string\n                                  type: object\n                                finalizers:\n                                  items:\n                                    type: string\n                                  type: array\n                                labels:\n                                  additionalProperties:\n                                    type: string\n                                  type: object\n                                name:\n                                  type: string\n                                namespace:\n                                  type: string\n                              type: object\n                            spec:\n                              description: |-\n                                The specification for the PersistentVolumeClaim. The entire content is\n                                copied unchanged into the PVC that gets created from this\n                                template. The same fields as in a PersistentVolumeClaim\n                                are also valid here.\n                              properties:\n                                accessModes:\n                                  description: |-\n                                    accessModes contains the desired access modes the volume should have.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                  items:\n                                    type: string\n                                  type: array\n                                dataSource:\n                                  description: |-\n                                    dataSource field can be used to specify either:\n                                    * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                    * An existing PVC (PersistentVolumeClaim)\n                                    If the provisioner or an external controller can support the specified data source,\n                                    it will create a new volume based on the contents of the specified data source.\n                                    When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                    and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                    If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                  properties:\n                                    apiGroup:\n                                      description: |-\n                                        APIGroup is the group for the resource being referenced.\n                                        If APIGroup is not specified, the specified Kind must be in the core API group.\n                                        For any other third-party types, APIGroup is required.\n                                      type: string\n                                    kind:\n                                      description: Kind is the type of resource being\n                                        referenced\n                                      type: string\n                                    name:\n                                      description: Name is the name of resource being\n                                        referenced\n                                      type: string\n                                  required:\n                                  - kind\n                                  - name\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                dataSourceRef:\n                                  description: |-\n                                    dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                    volume is desired. This may be any object from a non-empty API group (non\n                                    core object) or a PersistentVolumeClaim object.\n                                    When this field is specified, volume binding will only succeed if the type of\n                                    the specified object matches some installed volume populator or dynamic\n                                    provisioner.\n                                    This field will replace the functionality of the dataSource field and as such\n                                    if both fields are non-empty, they must have the same value. For backwards\n                                    compatibility, when namespace isn't specified in dataSourceRef,\n                                    both fields (dataSource and dataSourceRef) will be set to the same\n                                    value automatically if one of them is empty and the other is non-empty.\n                                    When namespace is specified in dataSourceRef,\n                                    dataSource isn't set to the same value and must be empty.\n                                    There are three important differences between dataSource and dataSourceRef:\n                                    * While dataSource only allows two specific types of objects, dataSourceRef\n                                      allows any non-core object, as well as PersistentVolumeClaim objects.\n                                    * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                      preserves all values, and generates an error if a disallowed value is\n                                      specified.\n                                    * While dataSource only allows local objects, dataSourceRef allows objects\n                                      in any namespaces.\n                                    (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                    (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                  properties:\n                                    apiGroup:\n                                      description: |-\n                                        APIGroup is the group for the resource being referenced.\n                                        If APIGroup is not specified, the specified Kind must be in the core API group.\n                                        For any other third-party types, APIGroup is required.\n                                      type: string\n                                    kind:\n                                      description: Kind is the type of resource being\n                                        referenced\n                                      type: string\n                                    name:\n                                      description: Name is the name of resource being\n                                        referenced\n                                      type: string\n                                    namespace:\n                                      description: |-\n                                        Namespace is the namespace of resource being referenced\n                                        Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                        (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                      type: string\n                                  required:\n                                  - kind\n                                  - name\n                                  type: object\n                                resources:\n                                  description: |-\n                                    resources represents the minimum resources the volume should have.\n                                    If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                    that are lower than previous value but must still be higher than capacity recorded in the\n                                    status field of the claim.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                  properties:\n                                    limits:\n                                      additionalProperties:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      description: |-\n                                        Limits describes the maximum amount of compute resources allowed.\n                                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                      type: object\n                                    requests:\n                                      additionalProperties:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      description: |-\n                                        Requests describes the minimum amount of compute resources required.\n                                        If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                        otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                      type: object\n                                  type: object\n                                selector:\n                                  description: selector is a label query over volumes\n                                    to consider for binding.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                storageClassName:\n                                  description: |-\n                                    storageClassName is the name of the StorageClass required by the claim.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                  type: string\n                                volumeAttributesClassName:\n                                  description: |-\n                                    volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                    If specified, the CSI driver will create or update the volume with the attributes defined\n                                    in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                    it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                    will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                    If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                    will be set by the persistentvolume controller if it exists.\n                                    If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                    set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                    exists.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                    (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                  type: string\n                                volumeMode:\n                                  description: |-\n                                    volumeMode defines what type of volume is required by the claim.\n                                    Value of Filesystem is implied when not included in claim spec.\n                                  type: string\n                                volumeName:\n                                  description: volumeName is the binding reference\n                                    to the PersistentVolume backing this claim.\n                                  type: string\n                              type: object\n                          required:\n                          - spec\n                          type: object\n                      type: object\n                    fc:\n                      description: fc represents a Fibre Channel resource that is\n                        attached to a kubelet's host machine and then exposed to the\n                        pod.\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        lun:\n                          description: 'lun is Optional: FC target lun number'\n                          format: int32\n                          type: integer\n                        readOnly:\n                          description: |-\n                            readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        targetWWNs:\n                          description: 'targetWWNs is Optional: FC target worldwide\n                            names (WWNs)'\n                          items:\n                            type: string\n                          type: array\n                        wwids:\n                          description: |-\n                            wwids Optional: FC volume world wide identifiers (wwids)\n                            Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                          items:\n                            type: string\n                          type: array\n                      type: object\n                    flexVolume:\n                      description: |-\n                        flexVolume represents a generic volume resource that is\n                        provisioned/attached using an exec based plugin.\n                      properties:\n                        driver:\n                          description: driver is the name of the driver to use for\n                            this volume.\n                          type: string\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                          type: string\n                        options:\n                          additionalProperties:\n                            type: string\n                          description: 'options is Optional: this field holds extra\n                            command options if any.'\n                          type: object\n                        readOnly:\n                          description: |-\n                            readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef is Optional: secretRef is reference to the secret object containing\n                            sensitive information to pass to the plugin scripts. This may be\n                            empty if no secret object is specified. If the secret object\n                            contains more than one secret, all secrets are passed to the plugin\n                            scripts.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                      required:\n                      - driver\n                      type: object\n                    flocker:\n                      description: flocker represents a Flocker volume attached to\n                        a kubelet's host machine. This depends on the Flocker control\n                        service being running\n                      properties:\n                        datasetName:\n                          description: |-\n                            datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                            should be considered as deprecated\n                          type: string\n                        datasetUUID:\n                          description: datasetUUID is the UUID of the dataset. This\n                            is unique identifier of a Flocker dataset\n                          type: string\n                      type: object\n                    gcePersistentDisk:\n                      description: |-\n                        gcePersistentDisk represents a GCE Disk resource that is attached to a\n                        kubelet's host machine and then exposed to the pod.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is filesystem type of the volume that you want to mount.\n                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        partition:\n                          description: |-\n                            partition is the partition in the volume that you want to mount.\n                            If omitted, the default is to mount by volume name.\n                            Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                            Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                          format: int32\n                          type: integer\n                        pdName:\n                          description: |-\n                            pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the ReadOnly setting in VolumeMounts.\n                            Defaults to false.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                          type: boolean\n                      required:\n                      - pdName\n                      type: object\n                    gitRepo:\n                      description: |-\n                        gitRepo represents a git repository at a particular revision.\n                        DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                        EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                        into the Pod's container.\n                      properties:\n                        directory:\n                          description: |-\n                            directory is the target directory name.\n                            Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                            git repository.  Otherwise, if specified, the volume will contain the git repository in\n                            the subdirectory with the given name.\n                          type: string\n                        repository:\n                          description: repository is the URL\n                          type: string\n                        revision:\n                          description: revision is the commit hash for the specified\n                            revision.\n                          type: string\n                      required:\n                      - repository\n                      type: object\n                    glusterfs:\n                      description: |-\n                        glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                        More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                      properties:\n                        endpoints:\n                          description: |-\n                            endpoints is the endpoint name that details Glusterfs topology.\n                            More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                          type: string\n                        path:\n                          description: |-\n                            path is the Glusterfs volume path.\n                            More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                            Defaults to false.\n                            More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                          type: boolean\n                      required:\n                      - endpoints\n                      - path\n                      type: object\n                    hostPath:\n                      description: |-\n                        hostPath represents a pre-existing file or directory on the host\n                        machine that is directly exposed to the container. This is generally\n                        used for system agents or other privileged things that are allowed\n                        to see the host machine. Most containers will NOT need this.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                        ---\n                        TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                        mount host directories as read/write.\n                      properties:\n                        path:\n                          description: |-\n                            path of the directory on the host.\n                            If the path is a symlink, it will follow the link to the real path.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                          type: string\n                        type:\n                          description: |-\n                            type for HostPath Volume\n                            Defaults to \"\"\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                          type: string\n                      required:\n                      - path\n                      type: object\n                    iscsi:\n                      description: |-\n                        iscsi represents an ISCSI Disk resource that is attached to a\n                        kubelet's host machine and then exposed to the pod.\n                        More info: https://examples.k8s.io/volumes/iscsi/README.md\n                      properties:\n                        chapAuthDiscovery:\n                          description: chapAuthDiscovery defines whether support iSCSI\n                            Discovery CHAP authentication\n                          type: boolean\n                        chapAuthSession:\n                          description: chapAuthSession defines whether support iSCSI\n                            Session CHAP authentication\n                          type: boolean\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type of the volume that you want to mount.\n                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        initiatorName:\n                          description: |-\n                            initiatorName is the custom iSCSI Initiator Name.\n                            If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                            <target portal>:<volume name> will be created for the connection.\n                          type: string\n                        iqn:\n                          description: iqn is the target iSCSI Qualified Name.\n                          type: string\n                        iscsiInterface:\n                          description: |-\n                            iscsiInterface is the interface Name that uses an iSCSI transport.\n                            Defaults to 'default' (tcp).\n                          type: string\n                        lun:\n                          description: lun represents iSCSI Target Lun number.\n                          format: int32\n                          type: integer\n                        portals:\n                          description: |-\n                            portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                            is other than default (typically TCP ports 860 and 3260).\n                          items:\n                            type: string\n                          type: array\n                        readOnly:\n                          description: |-\n                            readOnly here will force the ReadOnly setting in VolumeMounts.\n                            Defaults to false.\n                          type: boolean\n                        secretRef:\n                          description: secretRef is the CHAP Secret for iSCSI target\n                            and initiator authentication\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        targetPortal:\n                          description: |-\n                            targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                            is other than default (typically TCP ports 860 and 3260).\n                          type: string\n                      required:\n                      - iqn\n                      - lun\n                      - targetPortal\n                      type: object\n                    name:\n                      description: |-\n                        name of the volume.\n                        Must be a DNS_LABEL and unique within the pod.\n                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                      type: string\n                    nfs:\n                      description: |-\n                        nfs represents an NFS mount on the host that shares a pod's lifetime\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                      properties:\n                        path:\n                          description: |-\n                            path that is exported by the NFS server.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the NFS export to be mounted with read-only permissions.\n                            Defaults to false.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                          type: boolean\n                        server:\n                          description: |-\n                            server is the hostname or IP address of the NFS server.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                          type: string\n                      required:\n                      - path\n                      - server\n                      type: object\n                    persistentVolumeClaim:\n                      description: |-\n                        persistentVolumeClaimVolumeSource represents a reference to a\n                        PersistentVolumeClaim in the same namespace.\n                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                      properties:\n                        claimName:\n                          description: |-\n                            claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly Will force the ReadOnly setting in VolumeMounts.\n                            Default false.\n                          type: boolean\n                      required:\n                      - claimName\n                      type: object\n                    photonPersistentDisk:\n                      description: photonPersistentDisk represents a PhotonController\n                        persistent disk attached and mounted on kubelets host machine\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        pdID:\n                          description: pdID is the ID that identifies Photon Controller\n                            persistent disk\n                          type: string\n                      required:\n                      - pdID\n                      type: object\n                    portworxVolume:\n                      description: portworxVolume represents a portworx volume attached\n                        and mounted on kubelets host machine\n                      properties:\n                        fsType:\n                          description: |-\n                            fSType represents the filesystem type to mount\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        volumeID:\n                          description: volumeID uniquely identifies a Portworx volume\n                          type: string\n                      required:\n                      - volumeID\n                      type: object\n                    projected:\n                      description: projected items for all in one resources secrets,\n                        configmaps, and downward API\n                      properties:\n                        defaultMode:\n                          description: |-\n                            defaultMode are the mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        sources:\n                          description: sources is the list of volume projections\n                          items:\n                            description: Projection that may be projected along with\n                              other supported volume types\n                            properties:\n                              clusterTrustBundle:\n                                description: |-\n                                  ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                  of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                  Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                  ClusterTrustBundle objects can either be selected by name, or by the\n                                  combination of signer name and a label selector.\n\n\n                                  Kubelet performs aggressive normalization of the PEM contents written\n                                  into the pod filesystem.  Esoteric PEM features such as inter-block\n                                  comments and block headers are stripped.  Certificates are deduplicated.\n                                  The ordering of certificates within the file is arbitrary, and Kubelet\n                                  may change the order over time.\n                                properties:\n                                  labelSelector:\n                                    description: |-\n                                      Select all ClusterTrustBundles that match this label selector.  Only has\n                                      effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                      interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                      everything\".\n                                    properties:\n                                      matchExpressions:\n                                        description: matchExpressions is a list of\n                                          label selector requirements. The requirements\n                                          are ANDed.\n                                        items:\n                                          description: |-\n                                            A label selector requirement is a selector that contains values, a key, and an operator that\n                                            relates the key and values.\n                                          properties:\n                                            key:\n                                              description: key is the label key that\n                                                the selector applies to.\n                                              type: string\n                                            operator:\n                                              description: |-\n                                                operator represents a key's relationship to a set of values.\n                                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                                              type: string\n                                            values:\n                                              description: |-\n                                                values is an array of string values. If the operator is In or NotIn,\n                                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                the values array must be empty. This array is replaced during a strategic\n                                                merge patch.\n                                              items:\n                                                type: string\n                                              type: array\n                                          required:\n                                          - key\n                                          - operator\n                                          type: object\n                                        type: array\n                                      matchLabels:\n                                        additionalProperties:\n                                          type: string\n                                        description: |-\n                                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                        type: object\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  name:\n                                    description: |-\n                                      Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                      with signerName and labelSelector.\n                                    type: string\n                                  optional:\n                                    description: |-\n                                      If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                      aren't available.  If using name, then the named ClusterTrustBundle is\n                                      allowed not to exist.  If using signerName, then the combination of\n                                      signerName and labelSelector is allowed to match zero\n                                      ClusterTrustBundles.\n                                    type: boolean\n                                  path:\n                                    description: Relative path from the volume root\n                                      to write the bundle.\n                                    type: string\n                                  signerName:\n                                    description: |-\n                                      Select all ClusterTrustBundles that match this signer name.\n                                      Mutually-exclusive with name.  The contents of all selected\n                                      ClusterTrustBundles will be unified and deduplicated.\n                                    type: string\n                                required:\n                                - path\n                                type: object\n                              configMap:\n                                description: configMap information about the configMap\n                                  data to project\n                                properties:\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      ConfigMap will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the ConfigMap,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional specify whether the ConfigMap\n                                      or its keys must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              downwardAPI:\n                                description: downwardAPI information about the downwardAPI\n                                  data to project\n                                properties:\n                                  items:\n                                    description: Items is a list of DownwardAPIVolume\n                                      file\n                                    items:\n                                      description: DownwardAPIVolumeFile represents\n                                        information to create the file containing\n                                        the pod field\n                                      properties:\n                                        fieldRef:\n                                          description: 'Required: Selects a field\n                                            of the pod: only annotations, labels,\n                                            name and namespace are supported.'\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        mode:\n                                          description: |-\n                                            Optional: mode bits used to set permissions on this file, must be an octal value\n                                            between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: 'Required: Path is  the relative\n                                            path name of the file to be created. Must\n                                            not be absolute or contain the ''..''\n                                            path. Must be utf-8 encoded. The first\n                                            item of the relative path must not start\n                                            with ''..'''\n                                          type: string\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      required:\n                                      - path\n                                      type: object\n                                    type: array\n                                type: object\n                              secret:\n                                description: secret information about the secret data\n                                  to project\n                                properties:\n                                  items:\n                                    description: |-\n                                      items if unspecified, each key-value pair in the Data field of the referenced\n                                      Secret will be projected into the volume as a file whose name is the\n                                      key and content is the value. If specified, the listed keys will be\n                                      projected into the specified paths, and unlisted keys will not be\n                                      present. If a key is specified which is not present in the Secret,\n                                      the volume setup will error unless it is marked optional. Paths must be\n                                      relative and may not contain the '..' path or start with '..'.\n                                    items:\n                                      description: Maps a string key to a path within\n                                        a volume.\n                                      properties:\n                                        key:\n                                          description: key is the key to project.\n                                          type: string\n                                        mode:\n                                          description: |-\n                                            mode is Optional: mode bits used to set permissions on this file.\n                                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                            YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                            If not specified, the volume defaultMode will be used.\n                                            This might be in conflict with other options that affect the file\n                                            mode, like fsGroup, and the result can be other mode bits set.\n                                          format: int32\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the relative path of the file to map the key to.\n                                            May not be an absolute path.\n                                            May not contain the path element '..'.\n                                            May not start with the string '..'.\n                                          type: string\n                                      required:\n                                      - key\n                                      - path\n                                      type: object\n                                    type: array\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: optional field specify whether the\n                                      Secret or its key must be defined\n                                    type: boolean\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              serviceAccountToken:\n                                description: serviceAccountToken is information about\n                                  the serviceAccountToken data to project\n                                properties:\n                                  audience:\n                                    description: |-\n                                      audience is the intended audience of the token. A recipient of a token\n                                      must identify itself with an identifier specified in the audience of the\n                                      token, and otherwise should reject the token. The audience defaults to the\n                                      identifier of the apiserver.\n                                    type: string\n                                  expirationSeconds:\n                                    description: |-\n                                      expirationSeconds is the requested duration of validity of the service\n                                      account token. As the token approaches expiration, the kubelet volume\n                                      plugin will proactively rotate the service account token. The kubelet will\n                                      start trying to rotate the token if the token is older than 80 percent of\n                                      its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                      and must be at least 10 minutes.\n                                    format: int64\n                                    type: integer\n                                  path:\n                                    description: |-\n                                      path is the path relative to the mount point of the file to project the\n                                      token into.\n                                    type: string\n                                required:\n                                - path\n                                type: object\n                            type: object\n                          type: array\n                      type: object\n                    quobyte:\n                      description: quobyte represents a Quobyte mount on the host\n                        that shares a pod's lifetime\n                      properties:\n                        group:\n                          description: |-\n                            group to map volume access to\n                            Default is no group\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                            Defaults to false.\n                          type: boolean\n                        registry:\n                          description: |-\n                            registry represents a single or multiple Quobyte Registry services\n                            specified as a string as host:port pair (multiple entries are separated with commas)\n                            which acts as the central registry for volumes\n                          type: string\n                        tenant:\n                          description: |-\n                            tenant owning the given Quobyte volume in the Backend\n                            Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                          type: string\n                        user:\n                          description: |-\n                            user to map volume access to\n                            Defaults to serivceaccount user\n                          type: string\n                        volume:\n                          description: volume is a string that references an already\n                            created Quobyte volume by name.\n                          type: string\n                      required:\n                      - registry\n                      - volume\n                      type: object\n                    rbd:\n                      description: |-\n                        rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                        More info: https://examples.k8s.io/volumes/rbd/README.md\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type of the volume that you want to mount.\n                            Tip: Ensure that the filesystem type is supported by the host operating system.\n                            Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                            TODO: how do we prevent errors in the filesystem from compromising the machine\n                          type: string\n                        image:\n                          description: |-\n                            image is the rados image name.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: string\n                        keyring:\n                          description: |-\n                            keyring is the path to key ring for RBDUser.\n                            Default is /etc/ceph/keyring.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: string\n                        monitors:\n                          description: |-\n                            monitors is a collection of Ceph monitors.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          items:\n                            type: string\n                          type: array\n                        pool:\n                          description: |-\n                            pool is the rados pool name.\n                            Default is rbd.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly here will force the ReadOnly setting in VolumeMounts.\n                            Defaults to false.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef is name of the authentication secret for RBDUser. If provided\n                            overrides keyring.\n                            Default is nil.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        user:\n                          description: |-\n                            user is the rados user name.\n                            Default is admin.\n                            More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                          type: string\n                      required:\n                      - image\n                      - monitors\n                      type: object\n                    scaleIO:\n                      description: scaleIO represents a ScaleIO persistent volume\n                        attached and mounted on Kubernetes nodes.\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\".\n                            Default is \"xfs\".\n                          type: string\n                        gateway:\n                          description: gateway is the host address of the ScaleIO\n                            API Gateway.\n                          type: string\n                        protectionDomain:\n                          description: protectionDomain is the name of the ScaleIO\n                            Protection Domain for the configured storage.\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly Defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef references to the secret for ScaleIO user and other\n                            sensitive information. If this is not provided, Login operation will fail.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        sslEnabled:\n                          description: sslEnabled Flag enable/disable SSL communication\n                            with Gateway, default false\n                          type: boolean\n                        storageMode:\n                          description: |-\n                            storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                            Default is ThinProvisioned.\n                          type: string\n                        storagePool:\n                          description: storagePool is the ScaleIO Storage Pool associated\n                            with the protection domain.\n                          type: string\n                        system:\n                          description: system is the name of the storage system as\n                            configured in ScaleIO.\n                          type: string\n                        volumeName:\n                          description: |-\n                            volumeName is the name of a volume already created in the ScaleIO system\n                            that is associated with this volume source.\n                          type: string\n                      required:\n                      - gateway\n                      - secretRef\n                      - system\n                      type: object\n                    secret:\n                      description: |-\n                        secret represents a secret that should populate this volume.\n                        More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                      properties:\n                        defaultMode:\n                          description: |-\n                            defaultMode is Optional: mode bits used to set permissions on created files by default.\n                            Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                            YAML accepts both octal and decimal values, JSON requires decimal values\n                            for mode bits. Defaults to 0644.\n                            Directories within the path are not affected by this setting.\n                            This might be in conflict with other options that affect the file\n                            mode, like fsGroup, and the result can be other mode bits set.\n                          format: int32\n                          type: integer\n                        items:\n                          description: |-\n                            items If unspecified, each key-value pair in the Data field of the referenced\n                            Secret will be projected into the volume as a file whose name is the\n                            key and content is the value. If specified, the listed keys will be\n                            projected into the specified paths, and unlisted keys will not be\n                            present. If a key is specified which is not present in the Secret,\n                            the volume setup will error unless it is marked optional. Paths must be\n                            relative and may not contain the '..' path or start with '..'.\n                          items:\n                            description: Maps a string key to a path within a volume.\n                            properties:\n                              key:\n                                description: key is the key to project.\n                                type: string\n                              mode:\n                                description: |-\n                                  mode is Optional: mode bits used to set permissions on this file.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  If not specified, the volume defaultMode will be used.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              path:\n                                description: |-\n                                  path is the relative path of the file to map the key to.\n                                  May not be an absolute path.\n                                  May not contain the path element '..'.\n                                  May not start with the string '..'.\n                                type: string\n                            required:\n                            - key\n                            - path\n                            type: object\n                          type: array\n                        optional:\n                          description: optional field specify whether the Secret or\n                            its keys must be defined\n                          type: boolean\n                        secretName:\n                          description: |-\n                            secretName is the name of the secret in the pod's namespace to use.\n                            More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                          type: string\n                      type: object\n                    storageos:\n                      description: storageOS represents a StorageOS volume attached\n                        and mounted on Kubernetes nodes.\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is the filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        readOnly:\n                          description: |-\n                            readOnly defaults to false (read/write). ReadOnly here will force\n                            the ReadOnly setting in VolumeMounts.\n                          type: boolean\n                        secretRef:\n                          description: |-\n                            secretRef specifies the secret to use for obtaining the StorageOS API\n                            credentials.  If not specified, default values will be attempted.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        volumeName:\n                          description: |-\n                            volumeName is the human-readable name of the StorageOS volume.  Volume\n                            names are only unique within a namespace.\n                          type: string\n                        volumeNamespace:\n                          description: |-\n                            volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                            namespace is specified then the Pod's namespace will be used.  This allows the\n                            Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                            Set VolumeName to any name to override the default behaviour.\n                            Set to \"default\" if you are not using namespaces within StorageOS.\n                            Namespaces that do not pre-exist within StorageOS will be created.\n                          type: string\n                      type: object\n                    vsphereVolume:\n                      description: vsphereVolume represents a vSphere volume attached\n                        and mounted on kubelets host machine\n                      properties:\n                        fsType:\n                          description: |-\n                            fsType is filesystem type to mount.\n                            Must be a filesystem type supported by the host operating system.\n                            Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                          type: string\n                        storagePolicyID:\n                          description: storagePolicyID is the storage Policy Based\n                            Management (SPBM) profile ID associated with the StoragePolicyName.\n                          type: string\n                        storagePolicyName:\n                          description: storagePolicyName is the storage Policy Based\n                            Management (SPBM) profile name.\n                          type: string\n                        volumePath:\n                          description: volumePath is the path that identifies vSphere\n                            volume vmdk\n                          type: string\n                      required:\n                      - volumePath\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n            required:\n            - compDef\n            - replicas\n            type: object\n          status:\n            description: ComponentStatus represents the observed state of a Component\n              within the Cluster.\n            properties:\n              conditions:\n                description: |-\n                  Represents a list of detailed status of the Component object.\n                  Each condition in the list provides real-time information about certain aspect of the Component object.\n\n\n                  This field is crucial for administrators and developers to monitor and respond to changes within the Component.\n                  It provides a history of state transitions and a snapshot of the current state that can be used for\n                  automated logic or direct inspection.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n              message:\n                additionalProperties:\n                  type: string\n                description: |-\n                  A map that stores detailed message about the Component.\n                  Each entry in the map provides insights into specific elements of the Component, such as Pods or workloads.\n\n\n                  Keys in this map are formatted as `ObjectKind/Name`, where `ObjectKind` could be a type like Pod,\n                  and `Name` is the specific name of the object.\n                type: object\n              observedGeneration:\n                description: Specifies the most recent generation observed for this\n                  Component object.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Indicates the current phase of the Component, with each phase indicating specific conditions:\n\n\n                  - Creating: The initial phase for new Components, transitioning from 'empty'(\"\").\n                  - Running: All Pods in a Running state.\n                  - Updating: The Component is currently being updated, with no failed Pods present.\n                  - Abnormal: Some Pods have failed, indicating a potentially unstable state.\n                    However, the cluster remains available as long as a quorum of members is functioning.\n                  - Failed: A significant number of Pods or critical Pods have failed\n                    The cluster may be non-functional or may offer only limited services (e.g, read-only).\n                  - Stopping: All Pods are being terminated, with current replica count at zero.\n                  - Stopped: All associated Pods have been successfully deleted.\n                  - Deleting: The Component is being deleted.\n                enum:\n                - Creating\n                - Running\n                - Updating\n                - Stopping\n                - Stopped\n                - Deleting\n                - Failed\n                - Abnormal\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: false\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: componentversions.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ComponentVersion\n    listKind: ComponentVersionList\n    plural: componentversions\n    shortNames:\n    - cmpv\n    singular: componentversion\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: service versions\n      jsonPath: .status.serviceVersions\n      name: Versions\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: Status\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: ComponentVersion is the Schema for the componentversions API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ComponentVersionSpec defines the desired state of ComponentVersion\n            properties:\n              compatibilityRules:\n                description: CompatibilityRules defines compatibility rules between\n                  sets of component definitions and releases.\n                items:\n                  description: ComponentVersionCompatibilityRule defines the compatibility\n                    between a set of component definitions and a set of releases.\n                  properties:\n                    compDefs:\n                      description: |-\n                        CompDefs specifies names for the component definitions associated with this ComponentVersion.\n                        Each name in the list can represent an exact name, a name prefix, or a regular expression pattern.\n\n\n                        For example:\n\n\n                        - \"mysql-8.0.30-v1alpha1\": Matches the exact name \"mysql-8.0.30-v1alpha1\"\n                        - \"mysql-8.0.30\": Matches all names starting with \"mysql-8.0.30\"\n                        - \"^mysql-8.0.\\d{1,2}$\": Matches all names starting with \"mysql-8.0.\" followed by one or two digits.\n                      items:\n                        type: string\n                      maxItems: 128\n                      minItems: 1\n                      type: array\n                    releases:\n                      description: Releases is a list of identifiers for the releases.\n                      items:\n                        type: string\n                      maxItems: 128\n                      minItems: 1\n                      type: array\n                  required:\n                  - compDefs\n                  - releases\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n              releases:\n                description: Releases represents different releases of component instances\n                  within this ComponentVersion.\n                items:\n                  description: ComponentVersionRelease represents a release of component\n                    instances within a ComponentVersion.\n                  properties:\n                    changes:\n                      description: Changes provides information about the changes\n                        made in this release.\n                      maxLength: 256\n                      type: string\n                    images:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Images define the new images for containers, actions or external applications within the release.\n\n\n                        If an image is specified for a lifecycle action, the key should be the field name (case-insensitive) of\n                        the action in the LifecycleActions struct.\n                      maxProperties: 128\n                      minProperties: 1\n                      type: object\n                      x-kubernetes-validations:\n                      - message: Container, action or external application name may\n                          not exceed maximum length of 32 characters\n                        rule: self.all(key, size(key) <= 32)\n                      - message: Image name may not exceed maximum length of 256 characters\n                        rule: self.all(key, size(self[key]) <= 256)\n                    name:\n                      description: |-\n                        Name is a unique identifier for this release.\n                        Cannot be updated.\n                      maxLength: 32\n                      type: string\n                    serviceVersion:\n                      description: |-\n                        ServiceVersion defines the version of the well-known service that the component provides.\n                        The version should follow the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n                        If the release is used, it will serve as the service version for component instances, overriding the one defined in the component definition.\n                        Cannot be updated.\n                      maxLength: 32\n                      type: string\n                  required:\n                  - images\n                  - name\n                  - serviceVersion\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n            required:\n            - compatibilityRules\n            - releases\n            type: object\n          status:\n            description: ComponentVersionStatus defines the observed state of ComponentVersion\n            properties:\n              message:\n                description: Extra message for current phase.\n                type: string\n              observedGeneration:\n                description: ObservedGeneration is the most recent generation observed\n                  for this ComponentVersion.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Phase valid values are ``, `Available`, 'Unavailable`.\n                  Available is ComponentVersion become available, and can be used for co-related objects.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n              serviceVersions:\n                description: ServiceVersions represent the supported service versions\n                  of this ComponentVersion.\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n  - additionalPrinterColumns:\n    - description: service versions\n      jsonPath: .status.serviceVersions\n      name: Versions\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: Status\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: ComponentVersion is the Schema for the componentversions API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ComponentVersionSpec defines the desired state of ComponentVersion\n            properties:\n              compatibilityRules:\n                description: CompatibilityRules defines compatibility rules between\n                  sets of component definitions and releases.\n                items:\n                  description: ComponentVersionCompatibilityRule defines the compatibility\n                    between a set of component definitions and a set of releases.\n                  properties:\n                    compDefs:\n                      description: |-\n                        CompDefs specifies names for the component definitions associated with this ComponentVersion.\n                        Each name in the list can represent an exact name, a name prefix, or a regular expression pattern.\n\n\n                        For example:\n\n\n                        - \"mysql-8.0.30-v1alpha1\": Matches the exact name \"mysql-8.0.30-v1alpha1\"\n                        - \"mysql-8.0.30\": Matches all names starting with \"mysql-8.0.30\"\n                        - \"^mysql-8.0.\\d{1,2}$\": Matches all names starting with \"mysql-8.0.\" followed by one or two digits.\n                      items:\n                        type: string\n                      maxItems: 128\n                      minItems: 1\n                      type: array\n                    releases:\n                      description: Releases is a list of identifiers for the releases.\n                      items:\n                        type: string\n                      maxItems: 128\n                      minItems: 1\n                      type: array\n                  required:\n                  - compDefs\n                  - releases\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n              releases:\n                description: Releases represents different releases of component instances\n                  within this ComponentVersion.\n                items:\n                  description: ComponentVersionRelease represents a release of component\n                    instances within a ComponentVersion.\n                  properties:\n                    changes:\n                      description: Changes provides information about the changes\n                        made in this release.\n                      maxLength: 256\n                      type: string\n                    images:\n                      additionalProperties:\n                        type: string\n                      description: Images define the new images for different containers\n                        within the release.\n                      maxProperties: 128\n                      minProperties: 1\n                      type: object\n                      x-kubernetes-validations:\n                      - message: Container name may not exceed maximum length of 32\n                          characters\n                        rule: self.all(key, size(key) <= 32)\n                      - message: Image name may not exceed maximum length of 256 characters\n                        rule: self.all(key, size(self[key]) <= 256)\n                    name:\n                      description: |-\n                        Name is a unique identifier for this release.\n                        Cannot be updated.\n                      maxLength: 32\n                      type: string\n                    serviceVersion:\n                      description: |-\n                        ServiceVersion defines the version of the well-known service that the component provides.\n                        The version should follow the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n                        If the release is used, it will serve as the service version for component instances, overriding the one defined in the component definition.\n                        Cannot be updated.\n                      maxLength: 32\n                      type: string\n                  required:\n                  - images\n                  - name\n                  - serviceVersion\n                  type: object\n                maxItems: 128\n                minItems: 1\n                type: array\n            required:\n            - compatibilityRules\n            - releases\n            type: object\n          status:\n            description: ComponentVersionStatus defines the observed state of ComponentVersion\n            properties:\n              message:\n                description: Extra message for current phase.\n                type: string\n              observedGeneration:\n                description: ObservedGeneration is the most recent generation observed\n                  for this ComponentVersion.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Phase valid values are ``, `Available`, 'Unavailable`.\n                  Available is ComponentVersion become available, and can be used for co-related objects.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n              serviceVersions:\n                description: ServiceVersions represent the supported service versions\n                  of this ComponentVersion.\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: false\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: configconstraints.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ConfigConstraint\n    listKind: ConfigConstraintList\n    plural: configconstraints\n    shortNames:\n    - cc\n    singular: configconstraint\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: status phase\n      jsonPath: .status.phase\n      name: PHASE\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          ConfigConstraint manages the parameters across multiple configuration files contained in a single configure template.\n          These configuration files should have the same format (e.g. ini, xml, properties, json).\n\n\n          It provides the following functionalities:\n\n\n          1. **Parameter Value Validation**: Validates and ensures compliance of parameter values with defined constraints.\n          2. **Dynamic Reload on Modification**: Monitors parameter changes and triggers dynamic reloads to apply updates.\n          3. **Parameter Rendering in Templates**: Injects parameters into templates to generate up-to-date configuration files.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ConfigConstraintSpec defines the desired state of ConfigConstraint\n            properties:\n              cfgSchemaTopLevelName:\n                description: |-\n                  Specifies the top-level key in the 'configurationSchema.cue' that organizes the validation rules for parameters.\n                  This key must exist within the CUE script defined in 'configurationSchema.cue'.\n                type: string\n              configurationSchema:\n                description: |-\n                  Defines a list of parameters including their names, default values, descriptions,\n                  types, and constraints (permissible values or the range of valid values).\n                properties:\n                  cue:\n                    description: |-\n                      Hold a string that contains a script written in CUE language that defines a list of configuration items.\n                      Each item is detailed with its name, default value, description, type (e.g. string, integer, float),\n                      and constraints (permissible values or the valid range of values).\n\n\n                      CUE (Configure, Unify, Execute) is a declarative language designed for defining and validating\n                      complex data configurations.\n                      It is particularly useful in environments like K8s where complex configurations and validation rules are common.\n\n\n                      This script functions as a validator for user-provided configurations, ensuring compliance with\n                      the established specifications and constraints.\n                    type: string\n                  schema:\n                    description: Generated from the 'cue' field and transformed into\n                      a JSON format.\n                    x-kubernetes-preserve-unknown-fields: true\n                type: object\n              downwardAPIOptions:\n                description: |-\n                  Specifies a list of actions to execute specified commands based on Pod labels.\n\n\n                  It utilizes the K8s Downward API to mount label information as a volume into the pod.\n                  The 'config-manager' sidecar container watches for changes in the role label and dynamically invoke\n                  registered commands (usually execute some SQL statements) when a change is detected.\n\n\n                  It is designed for scenarios where:\n\n\n                  - Replicas with different roles have different configurations, such as Redis primary & secondary replicas.\n                  - After a role switch (e.g., from secondary to primary), some changes in configuration are needed\n                    to reflect the new role.\n                items:\n                  description: |-\n                    DownwardAPIChangeTriggeredAction defines an action that triggers specific commands in response to changes in Pod labels.\n                    For example, a command might be executed when the 'role' label of the Pod is updated.\n                  properties:\n                    command:\n                      description: |-\n                        Specifies the command to be triggered when changes are detected in Downward API volume files.\n                        It relies on the inotify mechanism in the config-manager sidecar to monitor file changes.\n                      items:\n                        type: string\n                      type: array\n                    items:\n                      description: Represents a list of files under the Downward API\n                        volume.\n                      items:\n                        description: DownwardAPIVolumeFile represents information\n                          to create the file containing the pod field\n                        properties:\n                          fieldRef:\n                            description: 'Required: Selects a field of the pod: only\n                              annotations, labels, name and namespace are supported.'\n                            properties:\n                              apiVersion:\n                                description: Version of the schema the FieldPath is\n                                  written in terms of, defaults to \"v1\".\n                                type: string\n                              fieldPath:\n                                description: Path of the field to select in the specified\n                                  API version.\n                                type: string\n                            required:\n                            - fieldPath\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          mode:\n                            description: |-\n                              Optional: mode bits used to set permissions on this file, must be an octal value\n                              between 0000 and 0777 or a decimal value between 0 and 511.\n                              YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                              If not specified, the volume defaultMode will be used.\n                              This might be in conflict with other options that affect the file\n                              mode, like fsGroup, and the result can be other mode bits set.\n                            format: int32\n                            type: integer\n                          path:\n                            description: 'Required: Path is  the relative path name\n                              of the file to be created. Must not be absolute or contain\n                              the ''..'' path. Must be utf-8 encoded. The first item\n                              of the relative path must not start with ''..'''\n                            type: string\n                          resourceFieldRef:\n                            description: |-\n                              Selects a resource of the container: only resources limits and requests\n                              (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                            properties:\n                              containerName:\n                                description: 'Container name: required for volumes,\n                                  optional for env vars'\n                                type: string\n                              divisor:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the output format of the exposed\n                                  resources, defaults to \"1\"\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              resource:\n                                description: 'Required: resource to select'\n                                type: string\n                            required:\n                            - resource\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        required:\n                        - path\n                        type: object\n                      type: array\n                    mountPoint:\n                      description: Specifies the mount point of the Downward API volume.\n                      maxLength: 128\n                      type: string\n                    name:\n                      description: |-\n                        Specifies the name of the field. It must be a string of maximum length 63.\n                        The name should match the regex pattern `^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$`.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    scriptConfig:\n                      description: |-\n                        ScriptConfig object specifies a ConfigMap that contains script files that should be mounted inside the pod.\n                        The scripts are mounted as volumes and can be referenced and executed by the DownwardAction to perform specific tasks or configurations.\n                      properties:\n                        namespace:\n                          default: default\n                          description: |-\n                            Specifies the namespace for the ConfigMap.\n                            If not specified, it defaults to the \"default\" namespace.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        scriptConfigMapRef:\n                          description: Specifies the reference to the ConfigMap containing\n                            the scripts.\n                          type: string\n                      required:\n                      - scriptConfigMapRef\n                      type: object\n                  required:\n                  - items\n                  - mountPoint\n                  - name\n                  type: object\n                type: array\n              dynamicActionCanBeMerged:\n                description: |-\n                  Indicates whether to consolidate dynamic reload and restart actions into a single restart.\n\n\n                  - If true, updates requiring both actions will result in only a restart, merging the actions.\n                  - If false, updates will trigger both actions executed sequentially: first dynamic reload, then restart.\n\n\n                  This flag allows for more efficient handling of configuration changes by potentially eliminating\n                  an unnecessary reload step.\n                type: boolean\n              dynamicParameters:\n                description: |-\n                  List dynamic parameters.\n                  Modifications to these parameters trigger a configuration reload without requiring a process restart.\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n              formatterConfig:\n                description: |-\n                  Specifies the format of the configuration file and any associated parameters that are specific to the chosen format.\n                  Supported formats include `ini`, `xml`, `yaml`, `json`, `hcl`, `dotenv`, `properties`, and `toml`.\n\n\n                  Each format may have its own set of parameters that can be configured.\n                  For instance, when using the `ini` format, you can specify the section name.\n\n\n                  Example:\n                  ```\n                  formatterConfig:\n                   format: ini\n                   iniConfig:\n                     sectionName: mysqld\n                  ```\n                properties:\n                  format:\n                    description: |-\n                      The config file format. Valid values are `ini`, `xml`, `yaml`, `json`,\n                      `hcl`, `dotenv`, `properties` and `toml`. Each format has its own characteristics and use cases.\n\n\n                      - ini: is a text-based content with a structure and syntax comprising key–value pairs for properties, reference wiki: https://en.wikipedia.org/wiki/INI_file\n                      - xml: refers to wiki: https://en.wikipedia.org/wiki/XML\n                      - yaml: supports for complex data types and structures.\n                      - json: refers to wiki: https://en.wikipedia.org/wiki/JSON\n                      - hcl: The HashiCorp Configuration Language (HCL) is a configuration language authored by HashiCorp, reference url: https://www.linode.com/docs/guides/introduction-to-hcl/\n                      - dotenv: is a plain text file with simple key–value pairs, reference wiki: https://en.wikipedia.org/wiki/Configuration_file#MS-DOS\n                      - properties: a file extension mainly used in Java, reference wiki: https://en.wikipedia.org/wiki/.properties\n                      - toml: refers to wiki: https://en.wikipedia.org/wiki/TOML\n                      - props-plus: a file extension mainly used in Java, supports CamelCase(e.g: brokerMaxConnectionsPerIp)\n                    enum:\n                    - xml\n                    - ini\n                    - yaml\n                    - json\n                    - hcl\n                    - dotenv\n                    - toml\n                    - properties\n                    - redis\n                    - props-plus\n                    type: string\n                  iniConfig:\n                    description: Holds options specific to the 'ini' file format.\n                    properties:\n                      sectionName:\n                        description: A string that describes the name of the ini section.\n                        type: string\n                    type: object\n                required:\n                - format\n                type: object\n              immutableParameters:\n                description: |-\n                  Lists the parameters that cannot be modified once set.\n                  Attempting to change any of these parameters will be ignored.\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n              reloadOptions:\n                description: |-\n                  Specifies the dynamic reload action supported by the engine.\n                  When set, the controller executes the method defined here to execute hot parameter updates.\n\n\n                  Dynamic reloading is triggered only if both of the following conditions are met:\n\n\n                  1. The modified parameters are listed in the `dynamicParameters` field.\n                     If `reloadStaticParamsBeforeRestart` is set to true, modifications to `staticParameters`\n                     can also trigger a reload.\n                  2. `reloadOptions` is set.\n\n\n                  If `reloadOptions` is not set or the modified parameters are not listed in `dynamicParameters`,\n                  dynamic reloading will not be triggered.\n\n\n                  Example:\n                  ```yaml\n                  reloadOptions:\n                   tplScriptTrigger:\n                     namespace: kb-system\n                     scriptConfigMapRef: mysql-reload-script\n                     sync: true\n                  ```\n                properties:\n                  autoTrigger:\n                    description: Automatically perform the reload when specified conditions\n                      are met.\n                    properties:\n                      processName:\n                        description: The name of the process.\n                        type: string\n                    type: object\n                  shellTrigger:\n                    description: Allows to execute a custom shell script to reload\n                      the process.\n                    properties:\n                      batchParamsFormatterTemplate:\n                        description: |-\n                          Specifies a Go template string for formatting batch input data.\n                          It's used when `batchReload` is 'True' to format data passed into STDIN of the script.\n                          The template accesses key-value pairs of updated parameters via the '$' variable.\n                          This allows for custom formatting of the input data.\n\n\n                          Example template:\n\n\n                          ```yaml\n                          batchParamsFormatterTemplate: |-\n                          {{- range $pKey, $pValue := $ }}\n                          {{ printf \"%s:%s\" $pKey $pValue }}\n                          {{- end }}\n                          ```\n\n\n                          This example generates batch input data in a key:value format, sorted by keys.\n                          ```\n                          key1:value1\n                          key2:value2\n                          key3:value3\n                          ```\n\n\n                          If not specified, the default format is key=value, sorted by keys, for each updated parameter.\n                          ```\n                          key1=value1\n                          key2=value2\n                          key3=value3\n                          ```\n                        type: string\n                      batchReload:\n                        description: |-\n                          Controls whether parameter updates are processed individually or collectively in a batch:\n\n\n                          - 'True': Processes all changes in one batch reload.\n                          - 'False': Processes each change individually.\n\n\n                          Defaults to 'False' if unspecified.\n                        type: boolean\n                      command:\n                        description: Specifies the command to execute in order to\n                          reload the process. It should be a valid shell command.\n                        items:\n                          type: string\n                        type: array\n                      scriptConfig:\n                        description: |-\n                          ScriptConfig object specifies a ConfigMap that contains script files that should be mounted inside the pod.\n                          The scripts are mounted as volumes and can be referenced and executed by the dynamic reload.\n                        properties:\n                          namespace:\n                            default: default\n                            description: |-\n                              Specifies the namespace for the ConfigMap.\n                              If not specified, it defaults to the \"default\" namespace.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                          scriptConfigMapRef:\n                            description: Specifies the reference to the ConfigMap\n                              containing the scripts.\n                            type: string\n                        required:\n                        - scriptConfigMapRef\n                        type: object\n                      sync:\n                        description: |-\n                          Determines the synchronization mode of parameter updates with \"config-manager\".\n\n\n                          - 'True': Executes reload actions synchronously, pausing until completion.\n                          - 'False': Executes reload actions asynchronously, without waiting for completion.\n                        type: boolean\n                      toolsSetup:\n                        description: |-\n                          Specifies the tools container image used by ShellTrigger for dynamic reload.\n                          If the dynamic reload action is triggered by a ShellTrigger, this field is required.\n                          This image must contain all necessary tools for executing the ShellTrigger scripts.\n\n\n                          Usually the specified image is referenced by the init container,\n                          which is then responsible for copy the tools from the image to a bin volume.\n                          This ensures that the tools are available to the 'config-manager' sidecar.\n                        properties:\n                          mountPoint:\n                            description: |-\n                              Specifies the directory path in the container where the tools-related files are to be copied.\n                              This field is typically used with an emptyDir volume to ensure a temporary, empty directory is provided at pod creation.\n                            maxLength: 128\n                            type: string\n                          toolConfigs:\n                            description: Specifies a list of settings of init containers\n                              that prepare tools for dynamic reload.\n                            items:\n                              description: ToolConfig specifies the settings of an\n                                init container that prepare tools for dynamic reload.\n                              properties:\n                                asContainerImage:\n                                  description: \"Indicates whether the tool image should\n                                    be used as the container image for a sidecar.\\nThis\n                                    is useful for large tool images, such as those\n                                    for C++ tools, which may depend on\\nnumerous libraries\n                                    (e.g., *.so files).\\n\\n\\nIf enabled, the tool\n                                    image is deployed as a sidecar container image.\\n\\n\\nExamples:\\n```yaml\\n\n                                    toolsSetup::\\n   mountPoint: /kb_tools\\n   toolConfigs:\\n\n                                    \\    - name: kb-tools\\n       asContainerImage:\n                                    true\\n       image:  apecloud/oceanbase:4.2.0.0-100010032023083021\\n```\\n\\n\\ngenerated\n                                    containers:\\n```yaml\\ninitContainers:\\n - name:\n                                    install-config-manager-tool\\n   image: apecloud/kubeblocks-tools:${version}\\n\n                                    \\  command:\\n   - cp\\n   - /bin/config_render\\n\n                                    \\  - /opt/tools\\n   volumemounts:\\n   - name:\n                                    kb-tools\\n     mountpath: /opt/tools\\n\\n\\ncontainers:\\n\n                                    - name: config-manager\\n   image: apecloud/oceanbase:4.2.0.0-100010032023083021\\n\n                                    \\  imagePullPolicy: IfNotPresent\\n\\t  command:\\n\n                                    \\  - /opt/tools/reloader\\n   - --log-level\\n   -\n                                    info\\n   - --operator-update-enable\\n   - --tcp\\n\n                                    \\  - \\\"9901\\\"\\n   - --config\\n   - /opt/config-manager/config-manager.yaml\\n\n                                    \\  volumemounts:\\n   - name: kb-tools\\n     mountpath:\n                                    /opt/tools\\n```\"\n                                  type: boolean\n                                command:\n                                  description: Specifies the command to be executed\n                                    by the init container.\n                                  items:\n                                    type: string\n                                  type: array\n                                image:\n                                  description: Specifies the tool container image.\n                                  type: string\n                                name:\n                                  description: Specifies the name of the init container.\n                                  maxLength: 63\n                                  pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                                  type: string\n                              type: object\n                            type: array\n                        required:\n                        - mountPoint\n                        type: object\n                    required:\n                    - command\n                    type: object\n                  tplScriptTrigger:\n                    description: Enables reloading process using a Go template script.\n                    properties:\n                      namespace:\n                        default: default\n                        description: |-\n                          Specifies the namespace for the ConfigMap.\n                          If not specified, it defaults to the \"default\" namespace.\n                        maxLength: 63\n                        pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                        type: string\n                      scriptConfigMapRef:\n                        description: Specifies the reference to the ConfigMap containing\n                          the scripts.\n                        type: string\n                      sync:\n                        description: |-\n                          Determines whether parameter updates should be synchronized with the \"config-manager\".\n                          Specifies the controller's reload strategy:\n\n\n                          - If set to 'True', the controller executes the reload action in synchronous mode,\n                            pausing execution until the reload completes.\n                          - If set to 'False', the controller executes the reload action in asynchronous mode,\n                            updating the ConfigMap without waiting for the reload process to finish.\n                        type: boolean\n                    required:\n                    - scriptConfigMapRef\n                    type: object\n                  unixSignalTrigger:\n                    description: Used to trigger a reload by sending a specific Unix\n                      signal to the process.\n                    properties:\n                      processName:\n                        description: Identifies the name of the process to which the\n                          Unix signal will be sent.\n                        type: string\n                      signal:\n                        description: |-\n                          Specifies a valid Unix signal to be sent.\n                          For a comprehensive list of all Unix signals, see: ../../pkg/configuration/configmap/handler.go:allUnixSignals\n                        enum:\n                        - SIGHUP\n                        - SIGINT\n                        - SIGQUIT\n                        - SIGILL\n                        - SIGTRAP\n                        - SIGABRT\n                        - SIGBUS\n                        - SIGFPE\n                        - SIGKILL\n                        - SIGUSR1\n                        - SIGSEGV\n                        - SIGUSR2\n                        - SIGPIPE\n                        - SIGALRM\n                        - SIGTERM\n                        - SIGSTKFLT\n                        - SIGCHLD\n                        - SIGCONT\n                        - SIGSTOP\n                        - SIGTSTP\n                        - SIGTTIN\n                        - SIGTTOU\n                        - SIGURG\n                        - SIGXCPU\n                        - SIGXFSZ\n                        - SIGVTALRM\n                        - SIGPROF\n                        - SIGWINCH\n                        - SIGIO\n                        - SIGPWR\n                        - SIGSYS\n                        type: string\n                    required:\n                    - processName\n                    - signal\n                    type: object\n                type: object\n              reloadStaticParamsBeforeRestart:\n                description: |-\n                  Configures whether the dynamic reload specified in `reloadOptions` applies only to dynamic parameters or\n                  to all parameters (including static parameters).\n\n\n                  - false (default): Only modifications to the dynamic parameters listed in `dynamicParameters`\n                    will trigger a dynamic reload.\n                  - true: Modifications to both dynamic parameters listed in `dynamicParameters` and static parameters\n                    listed in `staticParameters` will trigger a dynamic reload.\n                    The \"true\" option is for certain engines that require static parameters to be set\n                    via SQL statements before they can take effect on restart.\n                type: boolean\n              scriptConfigs:\n                description: |-\n                  A list of ScriptConfig Object.\n\n\n                  Each ScriptConfig object specifies a ConfigMap that contains script files that should be mounted inside the pod.\n                  The scripts are mounted as volumes and can be referenced and executed by the dynamic reload\n                  and DownwardAction to perform specific tasks or configurations.\n                items:\n                  properties:\n                    namespace:\n                      default: default\n                      description: |-\n                        Specifies the namespace for the ConfigMap.\n                        If not specified, it defaults to the \"default\" namespace.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    scriptConfigMapRef:\n                      description: Specifies the reference to the ConfigMap containing\n                        the scripts.\n                      type: string\n                  required:\n                  - scriptConfigMapRef\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - scriptConfigMapRef\n                x-kubernetes-list-type: map\n              selector:\n                description: |-\n                  Used to match labels on the pod to determine whether a dynamic reload should be performed.\n\n\n                  In some scenarios, only specific pods (e.g., primary replicas) need to undergo a dynamic reload.\n                  The `selector` allows you to specify label selectors to target the desired pods for the reload process.\n\n\n                  If the `selector` is not specified or is nil, all pods managed by the workload will be considered for the dynamic\n                  reload.\n                properties:\n                  matchExpressions:\n                    description: matchExpressions is a list of label selector requirements.\n                      The requirements are ANDed.\n                    items:\n                      description: |-\n                        A label selector requirement is a selector that contains values, a key, and an operator that\n                        relates the key and values.\n                      properties:\n                        key:\n                          description: key is the label key that the selector applies\n                            to.\n                          type: string\n                        operator:\n                          description: |-\n                            operator represents a key's relationship to a set of values.\n                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                          type: string\n                        values:\n                          description: |-\n                            values is an array of string values. If the operator is In or NotIn,\n                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                            the values array must be empty. This array is replaced during a strategic\n                            merge patch.\n                          items:\n                            type: string\n                          type: array\n                      required:\n                      - key\n                      - operator\n                      type: object\n                    type: array\n                  matchLabels:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                    type: object\n                type: object\n                x-kubernetes-map-type: atomic\n              staticParameters:\n                description: |-\n                  List static parameters.\n                  Modifications to any of these parameters require a restart of the process to take effect.\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n              toolsImageSpec:\n                description: |-\n                  Specifies the tools container image used by ShellTrigger for dynamic reload.\n                  If the dynamic reload action is triggered by a ShellTrigger, this field is required.\n                  This image must contain all necessary tools for executing the ShellTrigger scripts.\n\n\n                  Usually the specified image is referenced by the init container,\n                  which is then responsible for copy the tools from the image to a bin volume.\n                  This ensures that the tools are available to the 'config-manager' sidecar.\n                properties:\n                  mountPoint:\n                    description: |-\n                      Specifies the directory path in the container where the tools-related files are to be copied.\n                      This field is typically used with an emptyDir volume to ensure a temporary, empty directory is provided at pod creation.\n                    maxLength: 128\n                    type: string\n                  toolConfigs:\n                    description: Specifies a list of settings of init containers that\n                      prepare tools for dynamic reload.\n                    items:\n                      description: ToolConfig specifies the settings of an init container\n                        that prepare tools for dynamic reload.\n                      properties:\n                        asContainerImage:\n                          description: \"Indicates whether the tool image should be\n                            used as the container image for a sidecar.\\nThis is useful\n                            for large tool images, such as those for C++ tools, which\n                            may depend on\\nnumerous libraries (e.g., *.so files).\\n\\n\\nIf\n                            enabled, the tool image is deployed as a sidecar container\n                            image.\\n\\n\\nExamples:\\n```yaml\\n toolsSetup::\\n   mountPoint:\n                            /kb_tools\\n   toolConfigs:\\n     - name: kb-tools\\n       asContainerImage:\n                            true\\n       image:  apecloud/oceanbase:4.2.0.0-100010032023083021\\n```\\n\\n\\ngenerated\n                            containers:\\n```yaml\\ninitContainers:\\n - name: install-config-manager-tool\\n\n                            \\  image: apecloud/kubeblocks-tools:${version}\\n   command:\\n\n                            \\  - cp\\n   - /bin/config_render\\n   - /opt/tools\\n   volumemounts:\\n\n                            \\  - name: kb-tools\\n     mountpath: /opt/tools\\n\\n\\ncontainers:\\n\n                            - name: config-manager\\n   image: apecloud/oceanbase:4.2.0.0-100010032023083021\\n\n                            \\  imagePullPolicy: IfNotPresent\\n\\t  command:\\n   - /opt/tools/reloader\\n\n                            \\  - --log-level\\n   - info\\n   - --operator-update-enable\\n\n                            \\  - --tcp\\n   - \\\"9901\\\"\\n   - --config\\n   - /opt/config-manager/config-manager.yaml\\n\n                            \\  volumemounts:\\n   - name: kb-tools\\n     mountpath:\n                            /opt/tools\\n```\"\n                          type: boolean\n                        command:\n                          description: Specifies the command to be executed by the\n                            init container.\n                          items:\n                            type: string\n                          type: array\n                        image:\n                          description: Specifies the tool container image.\n                          type: string\n                        name:\n                          description: Specifies the name of the init container.\n                          maxLength: 63\n                          pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                      type: object\n                    type: array\n                required:\n                - mountPoint\n                type: object\n            required:\n            - formatterConfig\n            type: object\n          status:\n            description: ConfigConstraintStatus represents the observed state of a\n              ConfigConstraint.\n            properties:\n              message:\n                description: Provides descriptions for abnormal states.\n                type: string\n              observedGeneration:\n                description: Refers to the most recent generation observed for this\n                  ConfigConstraint. This value is updated by the API Server.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Specifies the status of the configuration template.\n                  When set to CCAvailablePhase, the ConfigConstraint can be referenced by ClusterDefinition.\n                enum:\n                - Available\n                - Unavailable\n                - Deleting\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: false\n    subresources:\n      status: {}\n  - additionalPrinterColumns:\n    - description: status phase\n      jsonPath: .status.phase\n      name: PHASE\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1beta1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          ConfigConstraint manages the parameters across multiple configuration files contained in a single configure template.\n          These configuration files should have the same format (e.g. ini, xml, properties, json).\n\n\n          It provides the following functionalities:\n\n\n          1. **Parameter Value Validation**: Validates and ensures compliance of parameter values with defined constraints.\n          2. **Dynamic Reload on Modification**: Monitors parameter changes and triggers dynamic reloads to apply updates.\n          3. **Parameter Rendering in Templates**: Injects parameters into templates to generate up-to-date configuration files.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ConfigConstraintSpec defines the desired state of ConfigConstraint\n            properties:\n              downwardAPIChangeTriggeredActions:\n                description: |-\n                  TODO: migrate DownwardAPITriggeredActions to ComponentDefinition.spec.lifecycleActions\n                  Specifies a list of actions to execute specified commands based on Pod labels.\n\n\n                  It utilizes the K8s Downward API to mount label information as a volume into the pod.\n                  The 'config-manager' sidecar container watches for changes in the role label and dynamically invoke\n                  registered commands (usually execute some SQL statements) when a change is detected.\n\n\n                  It is designed for scenarios where:\n\n\n                  - Replicas with different roles have different configurations, such as Redis primary & secondary replicas.\n                  - After a role switch (e.g., from secondary to primary), some changes in configuration are needed\n                    to reflect the new role.\n                items:\n                  description: |-\n                    DownwardAPIChangeTriggeredAction defines an action that triggers specific commands in response to changes in Pod labels.\n                    For example, a command might be executed when the 'role' label of the Pod is updated.\n                  properties:\n                    command:\n                      description: |-\n                        Specifies the command to be triggered when changes are detected in Downward API volume files.\n                        It relies on the inotify mechanism in the config-manager sidecar to monitor file changes.\n                      items:\n                        type: string\n                      type: array\n                    items:\n                      description: Represents a list of files under the Downward API\n                        volume.\n                      items:\n                        description: DownwardAPIVolumeFile represents information\n                          to create the file containing the pod field\n                        properties:\n                          fieldRef:\n                            description: 'Required: Selects a field of the pod: only\n                              annotations, labels, name and namespace are supported.'\n                            properties:\n                              apiVersion:\n                                description: Version of the schema the FieldPath is\n                                  written in terms of, defaults to \"v1\".\n                                type: string\n                              fieldPath:\n                                description: Path of the field to select in the specified\n                                  API version.\n                                type: string\n                            required:\n                            - fieldPath\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          mode:\n                            description: |-\n                              Optional: mode bits used to set permissions on this file, must be an octal value\n                              between 0000 and 0777 or a decimal value between 0 and 511.\n                              YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                              If not specified, the volume defaultMode will be used.\n                              This might be in conflict with other options that affect the file\n                              mode, like fsGroup, and the result can be other mode bits set.\n                            format: int32\n                            type: integer\n                          path:\n                            description: 'Required: Path is  the relative path name\n                              of the file to be created. Must not be absolute or contain\n                              the ''..'' path. Must be utf-8 encoded. The first item\n                              of the relative path must not start with ''..'''\n                            type: string\n                          resourceFieldRef:\n                            description: |-\n                              Selects a resource of the container: only resources limits and requests\n                              (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                            properties:\n                              containerName:\n                                description: 'Container name: required for volumes,\n                                  optional for env vars'\n                                type: string\n                              divisor:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the output format of the exposed\n                                  resources, defaults to \"1\"\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              resource:\n                                description: 'Required: resource to select'\n                                type: string\n                            required:\n                            - resource\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        required:\n                        - path\n                        type: object\n                      type: array\n                    mountPoint:\n                      description: Specifies the mount point of the Downward API volume.\n                      maxLength: 128\n                      type: string\n                    name:\n                      description: |-\n                        Specifies the name of the field. It must be a string of maximum length 63.\n                        The name should match the regex pattern `^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$`.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    scriptConfig:\n                      description: |-\n                        ScriptConfig object specifies a ConfigMap that contains script files that should be mounted inside the pod.\n                        The scripts are mounted as volumes and can be referenced and executed by the DownwardAction to perform specific tasks or configurations.\n                      properties:\n                        namespace:\n                          default: default\n                          description: |-\n                            Specifies the namespace for the ConfigMap.\n                            If not specified, it defaults to the \"default\" namespace.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        scriptConfigMapRef:\n                          description: Specifies the reference to the ConfigMap containing\n                            the scripts.\n                          type: string\n                      required:\n                      - scriptConfigMapRef\n                      type: object\n                  required:\n                  - items\n                  - mountPoint\n                  - name\n                  type: object\n                type: array\n              dynamicParameters:\n                description: |-\n                  List dynamic parameters.\n                  Modifications to these parameters trigger a configuration reload without requiring a process restart.\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n              fileFormatConfig:\n                description: |-\n                  Specifies the format of the configuration file and any associated parameters that are specific to the chosen format.\n                  Supported formats include `ini`, `xml`, `yaml`, `json`, `hcl`, `dotenv`, `properties`, and `toml`.\n\n\n                  Each format may have its own set of parameters that can be configured.\n                  For instance, when using the `ini` format, you can specify the section name.\n\n\n                  Example:\n                  ```\n                  fileFormatConfig:\n                   format: ini\n                   iniConfig:\n                     sectionName: mysqld\n                  ```\n                properties:\n                  format:\n                    description: |-\n                      The config file format. Valid values are `ini`, `xml`, `yaml`, `json`,\n                      `hcl`, `dotenv`, `properties` and `toml`. Each format has its own characteristics and use cases.\n\n\n                      - ini: is a text-based content with a structure and syntax comprising key–value pairs for properties, reference wiki: https://en.wikipedia.org/wiki/INI_file\n                      - xml: refers to wiki: https://en.wikipedia.org/wiki/XML\n                      - yaml: supports for complex data types and structures.\n                      - json: refers to wiki: https://en.wikipedia.org/wiki/JSON\n                      - hcl: The HashiCorp Configuration Language (HCL) is a configuration language authored by HashiCorp, reference url: https://www.linode.com/docs/guides/introduction-to-hcl/\n                      - dotenv: is a plain text file with simple key–value pairs, reference wiki: https://en.wikipedia.org/wiki/Configuration_file#MS-DOS\n                      - properties: a file extension mainly used in Java, reference wiki: https://en.wikipedia.org/wiki/.properties\n                      - toml: refers to wiki: https://en.wikipedia.org/wiki/TOML\n                      - props-plus: a file extension mainly used in Java, supports CamelCase(e.g: brokerMaxConnectionsPerIp)\n                    enum:\n                    - xml\n                    - ini\n                    - yaml\n                    - json\n                    - hcl\n                    - dotenv\n                    - toml\n                    - properties\n                    - redis\n                    - props-plus\n                    type: string\n                  iniConfig:\n                    description: Holds options specific to the 'ini' file format.\n                    properties:\n                      sectionName:\n                        description: A string that describes the name of the ini section.\n                        type: string\n                    type: object\n                required:\n                - format\n                type: object\n              immutableParameters:\n                description: |-\n                  Lists the parameters that cannot be modified once set.\n                  Attempting to change any of these parameters will be ignored.\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n              mergeReloadAndRestart:\n                description: |-\n                  Indicates whether to consolidate dynamic reload and restart actions into a single restart.\n\n\n                  - If true, updates requiring both actions will result in only a restart, merging the actions.\n                  - If false, updates will trigger both actions executed sequentially: first dynamic reload, then restart.\n\n\n                  This flag allows for more efficient handling of configuration changes by potentially eliminating\n                  an unnecessary reload step.\n                type: boolean\n              parametersSchema:\n                description: |-\n                  Defines a list of parameters including their names, default values, descriptions,\n                  types, and constraints (permissible values or the range of valid values).\n                properties:\n                  cue:\n                    description: |-\n                      Hold a string that contains a script written in CUE language that defines a list of configuration items.\n                      Each item is detailed with its name, default value, description, type (e.g. string, integer, float),\n                      and constraints (permissible values or the valid range of values).\n\n\n                      CUE (Configure, Unify, Execute) is a declarative language designed for defining and validating\n                      complex data configurations.\n                      It is particularly useful in environments like K8s where complex configurations and validation rules are common.\n\n\n                      This script functions as a validator for user-provided configurations, ensuring compliance with\n                      the established specifications and constraints.\n                    type: string\n                  schemaInJSON:\n                    description: Generated from the 'cue' field and transformed into\n                      a JSON format.\n                    x-kubernetes-preserve-unknown-fields: true\n                  topLevelKey:\n                    description: |-\n                      Specifies the top-level key in the 'configSchema.cue' that organizes the validation rules for parameters.\n                      This key must exist within the CUE script defined in 'configSchema.cue'.\n                    type: string\n                type: object\n              reloadAction:\n                description: |-\n                  Specifies the dynamic reload (dynamic reconfiguration) actions supported by the engine.\n                  When set, the controller executes the scripts defined in these actions to handle dynamic parameter updates.\n\n\n                  Dynamic reloading is triggered only if both of the following conditions are met:\n\n\n                  1. The modified parameters are listed in the `dynamicParameters` field.\n                     If `dynamicParameterSelectedPolicy` is set to \"all\", modifications to `staticParameters`\n                     can also trigger a reload.\n                  2. `reloadAction` is set.\n\n\n                  If `reloadAction` is not set or the modified parameters are not listed in `dynamicParameters`,\n                  dynamic reloading will not be triggered.\n\n\n                  Example:\n                  ```yaml\n                  dynamicReloadAction:\n                   tplScriptTrigger:\n                     namespace: kb-system\n                     scriptConfigMapRef: mysql-reload-script\n                     sync: true\n                  ```\n                properties:\n                  autoTrigger:\n                    description: Automatically perform the reload when specified conditions\n                      are met.\n                    properties:\n                      processName:\n                        description: The name of the process.\n                        type: string\n                    type: object\n                  shellTrigger:\n                    description: Allows to execute a custom shell script to reload\n                      the process.\n                    properties:\n                      batchParamsFormatterTemplate:\n                        description: |-\n                          Specifies a Go template string for formatting batch input data.\n                          It's used when `batchReload` is 'True' to format data passed into STDIN of the script.\n                          The template accesses key-value pairs of updated parameters via the '$' variable.\n                          This allows for custom formatting of the input data.\n\n\n                          Example template:\n\n\n                          ```yaml\n                          batchParamsFormatterTemplate: |-\n                          {{- range $pKey, $pValue := $ }}\n                          {{ printf \"%s:%s\" $pKey $pValue }}\n                          {{- end }}\n                          ```\n\n\n                          This example generates batch input data in a key:value format, sorted by keys.\n                          ```\n                          key1:value1\n                          key2:value2\n                          key3:value3\n                          ```\n\n\n                          If not specified, the default format is key=value, sorted by keys, for each updated parameter.\n                          ```\n                          key1=value1\n                          key2=value2\n                          key3=value3\n                          ```\n                        type: string\n                      batchReload:\n                        description: |-\n                          Controls whether parameter updates are processed individually or collectively in a batch:\n\n\n                          - 'True': Processes all changes in one batch reload.\n                          - 'False': Processes each change individually.\n\n\n                          Defaults to 'False' if unspecified.\n                        type: boolean\n                      command:\n                        description: Specifies the command to execute in order to\n                          reload the process. It should be a valid shell command.\n                        items:\n                          type: string\n                        type: array\n                      scriptConfig:\n                        description: |-\n                          ScriptConfig object specifies a ConfigMap that contains script files that should be mounted inside the pod.\n                          The scripts are mounted as volumes and can be referenced and executed by the dynamic reload.\n                        properties:\n                          namespace:\n                            default: default\n                            description: |-\n                              Specifies the namespace for the ConfigMap.\n                              If not specified, it defaults to the \"default\" namespace.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                          scriptConfigMapRef:\n                            description: Specifies the reference to the ConfigMap\n                              containing the scripts.\n                            type: string\n                        required:\n                        - scriptConfigMapRef\n                        type: object\n                      sync:\n                        description: |-\n                          Determines the synchronization mode of parameter updates with \"config-manager\".\n\n\n                          - 'True': Executes reload actions synchronously, pausing until completion.\n                          - 'False': Executes reload actions asynchronously, without waiting for completion.\n                        type: boolean\n                      toolsSetup:\n                        description: |-\n                          Specifies the tools container image used by ShellTrigger for dynamic reload.\n                          If the dynamic reload action is triggered by a ShellTrigger, this field is required.\n                          This image must contain all necessary tools for executing the ShellTrigger scripts.\n\n\n                          Usually the specified image is referenced by the init container,\n                          which is then responsible for copy the tools from the image to a bin volume.\n                          This ensures that the tools are available to the 'config-manager' sidecar.\n                        properties:\n                          mountPoint:\n                            description: |-\n                              Specifies the directory path in the container where the tools-related files are to be copied.\n                              This field is typically used with an emptyDir volume to ensure a temporary, empty directory is provided at pod creation.\n                            maxLength: 128\n                            type: string\n                          toolConfigs:\n                            description: Specifies a list of settings of init containers\n                              that prepare tools for dynamic reload.\n                            items:\n                              description: ToolConfig specifies the settings of an\n                                init container that prepare tools for dynamic reload.\n                              properties:\n                                asContainerImage:\n                                  description: \"Indicates whether the tool image should\n                                    be used as the container image for a sidecar.\\nThis\n                                    is useful for large tool images, such as those\n                                    for C++ tools, which may depend on\\nnumerous libraries\n                                    (e.g., *.so files).\\n\\n\\nIf enabled, the tool\n                                    image is deployed as a sidecar container image.\\n\\n\\nExamples:\\n```yaml\\n\n                                    toolsSetup::\\n   mountPoint: /kb_tools\\n   toolConfigs:\\n\n                                    \\    - name: kb-tools\\n       asContainerImage:\n                                    true\\n       image:  apecloud/oceanbase:4.2.0.0-100010032023083021\\n```\\n\\n\\ngenerated\n                                    containers:\\n```yaml\\ninitContainers:\\n - name:\n                                    install-config-manager-tool\\n   image: apecloud/kubeblocks-tools:${version}\\n\n                                    \\  command:\\n   - cp\\n   - /bin/config_render\\n\n                                    \\  - /opt/tools\\n   volumemounts:\\n   - name:\n                                    kb-tools\\n     mountpath: /opt/tools\\n\\n\\ncontainers:\\n\n                                    - name: config-manager\\n   image: apecloud/oceanbase:4.2.0.0-100010032023083021\\n\n                                    \\  imagePullPolicy: IfNotPresent\\n\\t  command:\\n\n                                    \\  - /opt/tools/reloader\\n   - --log-level\\n   -\n                                    info\\n   - --operator-update-enable\\n   - --tcp\\n\n                                    \\  - \\\"9901\\\"\\n   - --config\\n   - /opt/config-manager/config-manager.yaml\\n\n                                    \\  volumemounts:\\n   - name: kb-tools\\n     mountpath:\n                                    /opt/tools\\n```\"\n                                  type: boolean\n                                command:\n                                  description: Specifies the command to be executed\n                                    by the init container.\n                                  items:\n                                    type: string\n                                  type: array\n                                image:\n                                  description: Specifies the tool container image.\n                                  type: string\n                                name:\n                                  description: Specifies the name of the init container.\n                                  maxLength: 63\n                                  pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                                  type: string\n                              type: object\n                            type: array\n                        required:\n                        - mountPoint\n                        type: object\n                    required:\n                    - command\n                    type: object\n                  targetPodSelector:\n                    description: |-\n                      Used to match labels on the pod to determine whether a dynamic reload should be performed.\n\n\n                      In some scenarios, only specific pods (e.g., primary replicas) need to undergo a dynamic reload.\n                      The `reloadedPodSelector` allows you to specify label selectors to target the desired pods for the reload process.\n\n\n                      If the `reloadedPodSelector` is not specified or is nil, all pods managed by the workload will be considered for the dynamic\n                      reload.\n                    properties:\n                      matchExpressions:\n                        description: matchExpressions is a list of label selector\n                          requirements. The requirements are ANDed.\n                        items:\n                          description: |-\n                            A label selector requirement is a selector that contains values, a key, and an operator that\n                            relates the key and values.\n                          properties:\n                            key:\n                              description: key is the label key that the selector\n                                applies to.\n                              type: string\n                            operator:\n                              description: |-\n                                operator represents a key's relationship to a set of values.\n                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                              type: string\n                            values:\n                              description: |-\n                                values is an array of string values. If the operator is In or NotIn,\n                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                the values array must be empty. This array is replaced during a strategic\n                                merge patch.\n                              items:\n                                type: string\n                              type: array\n                          required:\n                          - key\n                          - operator\n                          type: object\n                        type: array\n                      matchLabels:\n                        additionalProperties:\n                          type: string\n                        description: |-\n                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                        type: object\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  tplScriptTrigger:\n                    description: Enables reloading process using a Go template script.\n                    properties:\n                      namespace:\n                        default: default\n                        description: |-\n                          Specifies the namespace for the ConfigMap.\n                          If not specified, it defaults to the \"default\" namespace.\n                        maxLength: 63\n                        pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                        type: string\n                      scriptConfigMapRef:\n                        description: Specifies the reference to the ConfigMap containing\n                          the scripts.\n                        type: string\n                      sync:\n                        description: |-\n                          Determines whether parameter updates should be synchronized with the \"config-manager\".\n                          Specifies the controller's reload strategy:\n\n\n                          - If set to 'True', the controller executes the reload action in synchronous mode,\n                            pausing execution until the reload completes.\n                          - If set to 'False', the controller executes the reload action in asynchronous mode,\n                            updating the ConfigMap without waiting for the reload process to finish.\n                        type: boolean\n                    required:\n                    - scriptConfigMapRef\n                    type: object\n                  unixSignalTrigger:\n                    description: Used to trigger a reload by sending a specific Unix\n                      signal to the process.\n                    properties:\n                      processName:\n                        description: Identifies the name of the process to which the\n                          Unix signal will be sent.\n                        type: string\n                      signal:\n                        description: |-\n                          Specifies a valid Unix signal to be sent.\n                          For a comprehensive list of all Unix signals, see: ../../pkg/configuration/configmap/handler.go:allUnixSignals\n                        enum:\n                        - SIGHUP\n                        - SIGINT\n                        - SIGQUIT\n                        - SIGILL\n                        - SIGTRAP\n                        - SIGABRT\n                        - SIGBUS\n                        - SIGFPE\n                        - SIGKILL\n                        - SIGUSR1\n                        - SIGSEGV\n                        - SIGUSR2\n                        - SIGPIPE\n                        - SIGALRM\n                        - SIGTERM\n                        - SIGSTKFLT\n                        - SIGCHLD\n                        - SIGCONT\n                        - SIGSTOP\n                        - SIGTSTP\n                        - SIGTTIN\n                        - SIGTTOU\n                        - SIGURG\n                        - SIGXCPU\n                        - SIGXFSZ\n                        - SIGVTALRM\n                        - SIGPROF\n                        - SIGWINCH\n                        - SIGIO\n                        - SIGPWR\n                        - SIGSYS\n                        type: string\n                    required:\n                    - processName\n                    - signal\n                    type: object\n                type: object\n              reloadStaticParamsBeforeRestart:\n                description: |-\n                  Configures whether the dynamic reload specified in `reloadAction` applies only to dynamic parameters or\n                  to all parameters (including static parameters).\n\n\n                  - false (default): Only modifications to the dynamic parameters listed in `dynamicParameters`\n                    will trigger a dynamic reload.\n                  - true: Modifications to both dynamic parameters listed in `dynamicParameters` and static parameters\n                    listed in `staticParameters` will trigger a dynamic reload.\n                    The \"all\" option is for certain engines that require static parameters to be set\n                    via SQL statements before they can take effect on restart.\n                type: boolean\n              staticParameters:\n                description: |-\n                  List static parameters.\n                  Modifications to any of these parameters require a restart of the process to take effect.\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n            required:\n            - fileFormatConfig\n            type: object\n          status:\n            description: ConfigConstraintStatus represents the observed state of a\n              ConfigConstraint.\n            properties:\n              message:\n                description: Provides descriptions for abnormal states.\n                type: string\n              observedGeneration:\n                description: Refers to the most recent generation observed for this\n                  ConfigConstraint. This value is updated by the API Server.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Specifies the status of the configuration template.\n                  When set to CCAvailablePhase, the ConfigConstraint can be referenced by ClusterDefinition.\n                enum:\n                - Available\n                - Unavailable\n                - Deleting\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: configurations.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    kind: Configuration\n    listKind: ConfigurationList\n    plural: configurations\n    singular: configuration\n  scope: Namespaced\n  versions:\n  - name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          Configuration represents the complete set of configurations for a specific Component of a Cluster.\n          This includes templates for each configuration file, their corresponding ConfigConstraints, volume mounts,\n          and other relevant details.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ConfigurationSpec defines the desired state of a Configuration\n              resource.\n            properties:\n              clusterRef:\n                description: Specifies the name of the Cluster that this configuration\n                  is associated with.\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.clusterRef\n                  rule: self == oldSelf\n              componentName:\n                description: Represents the name of the Component that this configuration\n                  pertains to.\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.clusterRef\n                  rule: self == oldSelf\n              configItemDetails:\n                description: |-\n                  ConfigItemDetails is an array of ConfigurationItemDetail objects.\n\n\n                  Each ConfigurationItemDetail corresponds to a configuration template,\n                  which is a ConfigMap that contains multiple configuration files.\n                  Each configuration file is stored as a key-value pair within the ConfigMap.\n\n\n                  The ConfigurationItemDetail includes information such as:\n\n\n                  - The configuration template (a ConfigMap)\n                  - The corresponding ConfigConstraint (constraints and validation rules for the configuration)\n                  - Volume mounts (for mounting the configuration files)\n                items:\n                  description: ConfigurationItemDetail corresponds to settings of\n                    a configuration template (a ConfigMap).\n                  properties:\n                    configFileParams:\n                      additionalProperties:\n                        properties:\n                          content:\n                            description: |-\n                              Holds the configuration keys and values. This field is a workaround for issues found in kubebuilder and code-generator.\n                              Refer to https://github.com/kubernetes-sigs/kubebuilder/issues/528 and https://github.com/kubernetes/code-generator/issues/50 for more details.\n\n\n                              Represents the content of the configuration file.\n                            type: string\n                          parameters:\n                            additionalProperties:\n                              type: string\n                            description: Represents the updated parameters for a single\n                              configuration file.\n                            type: object\n                        type: object\n                      description: |-\n                        Specifies the user-defined configuration parameters.\n\n\n                        When provided, the parameter values in `configFileParams` override the default configuration parameters.\n                        This allows users to override the default configuration according to their specific needs.\n                      type: object\n                    configSpec:\n                      description: |-\n                        Specifies the name of the configuration template (a ConfigMap), ConfigConstraint, and other miscellaneous options.\n\n\n                        The configuration template is a ConfigMap that contains multiple configuration files.\n                        Each configuration file is stored as a key-value pair within the ConfigMap.\n\n\n                        ConfigConstraint allows defining constraints and validation rules for configuration parameters.\n                        It ensures that the configuration adheres to certain requirements and limitations.\n                      properties:\n                        asEnvFrom:\n                          description: |-\n                            Specifies the containers to inject the ConfigMap parameters as environment variables.\n\n\n                            This is useful when application images accept parameters through environment variables and\n                            generate the final configuration file in the startup script based on these variables.\n\n\n                            This field allows users to specify a list of container names, and KubeBlocks will inject the environment\n                            variables converted from the ConfigMap into these designated containers. This provides a flexible way to\n                            pass the configuration items from the ConfigMap to the container without modifying the image.\n\n\n                            Deprecated: `asEnvFrom` has been deprecated since 0.9.0 and will be removed in 0.10.0.\n                            Use `injectEnvTo` instead.\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: set\n                        asSecret:\n                          description: Whether to store the final rendered parameters\n                            as a secret.\n                          type: boolean\n                        constraintRef:\n                          description: Specifies the name of the referenced configuration\n                            constraints object.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                        defaultMode:\n                          description: |-\n                            The operator attempts to set default file permissions for scripts (0555) and configurations (0444).\n                            However, certain database engines may require different file permissions.\n                            You can specify the desired file permissions here.\n\n\n                            Must be specified as an octal value between 0000 and 0777 (inclusive),\n                            or as a decimal value between 0 and 511 (inclusive).\n                            YAML supports both octal and decimal values for file permissions.\n\n\n                            Please note that this setting only affects the permissions of the files themselves.\n                            Directories within the specified path are not impacted by this setting.\n                            It's important to be aware that this setting might conflict with other options\n                            that influence the file mode, such as fsGroup.\n                            In such cases, the resulting file mode may have additional bits set.\n                            Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                          format: int32\n                          type: integer\n                        injectEnvTo:\n                          description: |-\n                            Specifies the containers to inject the ConfigMap parameters as environment variables.\n\n\n                            This is useful when application images accept parameters through environment variables and\n                            generate the final configuration file in the startup script based on these variables.\n\n\n                            This field allows users to specify a list of container names, and KubeBlocks will inject the environment\n                            variables converted from the ConfigMap into these designated containers. This provides a flexible way to\n                            pass the configuration items from the ConfigMap to the container without modifying the image.\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: set\n                        keys:\n                          description: |-\n                            Specifies the configuration files within the ConfigMap that support dynamic updates.\n\n\n                            A configuration template (provided in the form of a ConfigMap) may contain templates for multiple\n                            configuration files.\n                            Each configuration file corresponds to a key in the ConfigMap.\n                            Some of these configuration files may support dynamic modification and reloading without requiring\n                            a pod restart.\n\n\n                            If empty or omitted, all configuration files in the ConfigMap are assumed to support dynamic updates,\n                            and ConfigConstraint applies to all keys.\n                          items:\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: set\n                        legacyRenderedConfigSpec:\n                          description: |-\n                            Specifies the secondary rendered config spec for pod-specific customization.\n\n\n                            The template is rendered inside the pod (by the \"config-manager\" sidecar container) and merged with the main\n                            template's render result to generate the final configuration file.\n\n\n                            This field is intended to handle scenarios where different pods within the same Component have\n                            varying configurations. It allows for pod-specific customization of the configuration.\n\n\n                            Note: This field will be deprecated in future versions, and the functionality will be moved to\n                            `cluster.spec.componentSpecs[*].instances[*]`.\n                          properties:\n                            namespace:\n                              default: default\n                              description: |-\n                                Specifies the namespace of the referenced configuration template ConfigMap object.\n                                An empty namespace is equivalent to the \"default\" namespace.\n                              pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                              type: string\n                            policy:\n                              default: none\n                              description: Defines the strategy for merging externally\n                                imported templates into component templates.\n                              enum:\n                              - patch\n                              - replace\n                              - none\n                              type: string\n                            templateRef:\n                              description: Specifies the name of the referenced configuration\n                                template ConfigMap object.\n                              pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                              type: string\n                          required:\n                          - templateRef\n                          type: object\n                        name:\n                          description: Specifies the name of the configuration template.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                        namespace:\n                          default: default\n                          description: |-\n                            Specifies the namespace of the referenced configuration template ConfigMap object.\n                            An empty namespace is equivalent to the \"default\" namespace.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        reRenderResourceTypes:\n                          description: |-\n                            Specifies whether the configuration needs to be re-rendered after v-scale or h-scale operations to reflect changes.\n\n\n                            In some scenarios, the configuration may need to be updated to reflect the changes in resource allocation\n                            or cluster topology. Examples:\n\n\n                            - Redis: adjust maxmemory after v-scale operation.\n                            - MySQL: increase max connections after v-scale operation.\n                            - Zookeeper: update zoo.cfg with new node addresses after h-scale operation.\n                          items:\n                            description: RerenderResourceType defines the resource\n                              requirements for a component.\n                            enum:\n                            - vscale\n                            - hscale\n                            - tls\n                            - shardingHScale\n                            type: string\n                          type: array\n                          x-kubernetes-list-type: set\n                        templateRef:\n                          description: Specifies the name of the referenced configuration\n                            template ConfigMap object.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                        volumeName:\n                          description: |-\n                            Refers to the volume name of PodTemplate. The configuration file produced through the configuration\n                            template will be mounted to the corresponding volume. Must be a DNS_LABEL name.\n                            The volume name must be defined in podSpec.containers[*].volumeMounts.\n                          maxLength: 63\n                          pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    importTemplateRef:\n                      description: |-\n                        Specifies the user-defined configuration template.\n\n\n                        When provided, the `importTemplateRef` overrides the default configuration template\n                        specified in `configSpec.templateRef`.\n                        This allows users to customize the configuration template according to their specific requirements.\n                      properties:\n                        namespace:\n                          default: default\n                          description: |-\n                            Specifies the namespace of the referenced configuration template ConfigMap object.\n                            An empty namespace is equivalent to the \"default\" namespace.\n                          pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        policy:\n                          default: none\n                          description: Defines the strategy for merging externally\n                            imported templates into component templates.\n                          enum:\n                          - patch\n                          - replace\n                          - none\n                          type: string\n                        templateRef:\n                          description: Specifies the name of the referenced configuration\n                            template ConfigMap object.\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                      required:\n                      - templateRef\n                      type: object\n                    name:\n                      description: |-\n                        Defines the unique identifier of the configuration template.\n\n\n                        It must be a string of maximum 63 characters, and can only include lowercase alphanumeric characters,\n                        hyphens, and periods.\n                        The name must start and end with an alphanumeric character.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    payload:\n                      description: |-\n                        External controllers can trigger a configuration rerender by modifying this field.\n\n\n                        Note: Currently, the `payload` field is opaque and its content is not interpreted by the system.\n                        Modifying this field will cause a rerender, regardless of the specific content of this field.\n                      type: object\n                      x-kubernetes-preserve-unknown-fields: true\n                    version:\n                      description: 'Deprecated: No longer used. Please use ''Payload''\n                        instead. Previously represented the version of the configuration\n                        template.'\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            required:\n            - clusterRef\n            - componentName\n            type: object\n          status:\n            description: ConfigurationStatus represents the observed state of a Configuration\n              resource.\n            properties:\n              conditions:\n                description: Provides detailed status information for opsRequest.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - type\n                x-kubernetes-list-type: map\n              configurationStatus:\n                description: Provides the status of each component undergoing reconfiguration.\n                items:\n                  properties:\n                    lastDoneRevision:\n                      description: Represents the last completed revision of the configuration\n                        item. This field is optional.\n                      type: string\n                    message:\n                      description: Provides a description of any abnormal status.\n                        This field is optional.\n                      type: string\n                    name:\n                      description: |-\n                        Specifies the name of the configuration template. It is a required field and must be a string of maximum 63 characters.\n                        The name should only contain lowercase alphanumeric characters, hyphens, or periods. It should start and end with an alphanumeric character.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    phase:\n                      description: |-\n                        Indicates the current status of the configuration item.\n\n\n                        Possible values include \"Creating\", \"Init\", \"Running\", \"Pending\", \"Merged\", \"MergeFailed\", \"FailedAndPause\",\n                        \"Upgrading\", \"Deleting\", \"FailedAndRetry\", \"Finished\".\n                      enum:\n                      - Creating\n                      - Init\n                      - Running\n                      - Pending\n                      - Merged\n                      - MergeFailed\n                      - FailedAndPause\n                      - Upgrading\n                      - Deleting\n                      - FailedAndRetry\n                      - Finished\n                      type: string\n                    reconcileDetail:\n                      description: Provides detailed information about the execution\n                        of the configuration change. This field is optional.\n                      properties:\n                        currentRevision:\n                          description: Represents the current revision of the configuration\n                            item.\n                          type: string\n                        errMessage:\n                          description: Represents the error message generated when\n                            the execution of configuration changes fails.\n                          type: string\n                        execResult:\n                          description: Represents the outcome of the most recent execution.\n                          type: string\n                        expectedCount:\n                          default: -1\n                          description: Represents the total number of pods that require\n                            execution of configuration changes.\n                          format: int32\n                          type: integer\n                        policy:\n                          description: Represents the policy applied during the most\n                            recent execution.\n                          type: string\n                        succeedCount:\n                          default: -1\n                          description: Represents the number of pods where configuration\n                            changes were successfully applied.\n                          format: int32\n                          type: integer\n                      type: object\n                    updateRevision:\n                      description: Represents the updated revision of the configuration\n                        item. This field is optional.\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              message:\n                description: Provides a description of any abnormal status.\n                type: string\n              observedGeneration:\n                description: |-\n                  Represents the latest generation observed for this\n                  ClusterDefinition. It corresponds to the ConfigConstraint's generation, which is\n                  updated by the API Server.\n                format: int64\n                type: integer\n            required:\n            - configurationStatus\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: servicedescriptors.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ServiceDescriptor\n    listKind: ServiceDescriptorList\n    plural: servicedescriptors\n    shortNames:\n    - sd\n    singular: servicedescriptor\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - description: service kind\n      jsonPath: .spec.serviceKind\n      name: SERVICE_KIND\n      type: string\n    - description: service version\n      jsonPath: .spec.serviceVersion\n      name: SERVICE_VERSION\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          ServiceDescriptor describes a service provided by external sources.\n          It contains the necessary details such as the service's address and connection credentials.\n          To enable a Cluster to access this service, the ServiceDescriptor's name should be specified\n          in the Cluster configuration under `clusterComponent.serviceRefs[*].serviceDescriptor`.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ServiceDescriptorSpec defines the desired state of ServiceDescriptor\n            properties:\n              auth:\n                description: Specifies the authentication credentials required for\n                  accessing an external service.\n                properties:\n                  password:\n                    description: Specifies the password for the external service.\n                    properties:\n                      value:\n                        description: |-\n                          Holds a direct string or an expression that can be evaluated to a string.\n\n\n                          It can include variables denoted by $(VAR_NAME).\n                          These variables are expanded to the value of the environment variables defined in the container.\n                          If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                          To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                          For example:\n\n\n                          - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                          - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                          Default value is an empty string.\n                        type: string\n                      valueFrom:\n                        description: Specifies the source for the variable's value.\n                        properties:\n                          configMapKeyRef:\n                            description: Selects a key of a ConfigMap.\n                            properties:\n                              key:\n                                description: The key to select.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the ConfigMap or its\n                                  key must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          fieldRef:\n                            description: |-\n                              Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                              spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                            properties:\n                              apiVersion:\n                                description: Version of the schema the FieldPath is\n                                  written in terms of, defaults to \"v1\".\n                                type: string\n                              fieldPath:\n                                description: Path of the field to select in the specified\n                                  API version.\n                                type: string\n                            required:\n                            - fieldPath\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          resourceFieldRef:\n                            description: |-\n                              Selects a resource of the container: only resources limits and requests\n                              (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                            properties:\n                              containerName:\n                                description: 'Container name: required for volumes,\n                                  optional for env vars'\n                                type: string\n                              divisor:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the output format of the exposed\n                                  resources, defaults to \"1\"\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              resource:\n                                description: 'Required: resource to select'\n                                type: string\n                            required:\n                            - resource\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          secretKeyRef:\n                            description: Selects a key of a secret in the pod's namespace\n                            properties:\n                              key:\n                                description: The key of the secret to select from.  Must\n                                  be a valid secret key.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the Secret or its key\n                                  must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                    type: object\n                  username:\n                    description: Specifies the username for the external service.\n                    properties:\n                      value:\n                        description: |-\n                          Holds a direct string or an expression that can be evaluated to a string.\n\n\n                          It can include variables denoted by $(VAR_NAME).\n                          These variables are expanded to the value of the environment variables defined in the container.\n                          If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                          To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                          For example:\n\n\n                          - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                          - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                          Default value is an empty string.\n                        type: string\n                      valueFrom:\n                        description: Specifies the source for the variable's value.\n                        properties:\n                          configMapKeyRef:\n                            description: Selects a key of a ConfigMap.\n                            properties:\n                              key:\n                                description: The key to select.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the ConfigMap or its\n                                  key must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          fieldRef:\n                            description: |-\n                              Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                              spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                            properties:\n                              apiVersion:\n                                description: Version of the schema the FieldPath is\n                                  written in terms of, defaults to \"v1\".\n                                type: string\n                              fieldPath:\n                                description: Path of the field to select in the specified\n                                  API version.\n                                type: string\n                            required:\n                            - fieldPath\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          resourceFieldRef:\n                            description: |-\n                              Selects a resource of the container: only resources limits and requests\n                              (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                            properties:\n                              containerName:\n                                description: 'Container name: required for volumes,\n                                  optional for env vars'\n                                type: string\n                              divisor:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the output format of the exposed\n                                  resources, defaults to \"1\"\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              resource:\n                                description: 'Required: resource to select'\n                                type: string\n                            required:\n                            - resource\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          secretKeyRef:\n                            description: Selects a key of a secret in the pod's namespace\n                            properties:\n                              key:\n                                description: The key of the secret to select from.  Must\n                                  be a valid secret key.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the Secret or its key\n                                  must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                    type: object\n                type: object\n              endpoint:\n                description: |-\n                  Specifies the endpoint of the external service.\n\n\n                  If the service is exposed via a cluster, the endpoint will be provided in the format of `host:port`.\n                properties:\n                  value:\n                    description: |-\n                      Holds a direct string or an expression that can be evaluated to a string.\n\n\n                      It can include variables denoted by $(VAR_NAME).\n                      These variables are expanded to the value of the environment variables defined in the container.\n                      If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                      To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                      For example:\n\n\n                      - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                      - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                      Default value is an empty string.\n                    type: string\n                  valueFrom:\n                    description: Specifies the source for the variable's value.\n                    properties:\n                      configMapKeyRef:\n                        description: Selects a key of a ConfigMap.\n                        properties:\n                          key:\n                            description: The key to select.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the ConfigMap or its key\n                              must be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      fieldRef:\n                        description: |-\n                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                        properties:\n                          apiVersion:\n                            description: Version of the schema the FieldPath is written\n                              in terms of, defaults to \"v1\".\n                            type: string\n                          fieldPath:\n                            description: Path of the field to select in the specified\n                              API version.\n                            type: string\n                        required:\n                        - fieldPath\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      resourceFieldRef:\n                        description: |-\n                          Selects a resource of the container: only resources limits and requests\n                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                        properties:\n                          containerName:\n                            description: 'Container name: required for volumes, optional\n                              for env vars'\n                            type: string\n                          divisor:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            description: Specifies the output format of the exposed\n                              resources, defaults to \"1\"\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          resource:\n                            description: 'Required: resource to select'\n                            type: string\n                        required:\n                        - resource\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      secretKeyRef:\n                        description: Selects a key of a secret in the pod's namespace\n                        properties:\n                          key:\n                            description: The key of the secret to select from.  Must\n                              be a valid secret key.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the Secret or its key must\n                              be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                    type: object\n                type: object\n              host:\n                description: Specifies the service or IP address of the external service.\n                properties:\n                  value:\n                    description: |-\n                      Holds a direct string or an expression that can be evaluated to a string.\n\n\n                      It can include variables denoted by $(VAR_NAME).\n                      These variables are expanded to the value of the environment variables defined in the container.\n                      If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                      To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                      For example:\n\n\n                      - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                      - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                      Default value is an empty string.\n                    type: string\n                  valueFrom:\n                    description: Specifies the source for the variable's value.\n                    properties:\n                      configMapKeyRef:\n                        description: Selects a key of a ConfigMap.\n                        properties:\n                          key:\n                            description: The key to select.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the ConfigMap or its key\n                              must be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      fieldRef:\n                        description: |-\n                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                        properties:\n                          apiVersion:\n                            description: Version of the schema the FieldPath is written\n                              in terms of, defaults to \"v1\".\n                            type: string\n                          fieldPath:\n                            description: Path of the field to select in the specified\n                              API version.\n                            type: string\n                        required:\n                        - fieldPath\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      resourceFieldRef:\n                        description: |-\n                          Selects a resource of the container: only resources limits and requests\n                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                        properties:\n                          containerName:\n                            description: 'Container name: required for volumes, optional\n                              for env vars'\n                            type: string\n                          divisor:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            description: Specifies the output format of the exposed\n                              resources, defaults to \"1\"\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          resource:\n                            description: 'Required: resource to select'\n                            type: string\n                        required:\n                        - resource\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      secretKeyRef:\n                        description: Selects a key of a secret in the pod's namespace\n                        properties:\n                          key:\n                            description: The key of the secret to select from.  Must\n                              be a valid secret key.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the Secret or its key must\n                              be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                    type: object\n                type: object\n              podFQDNs:\n                description: Specifies the pod FQDNs of the external service.\n                properties:\n                  value:\n                    description: |-\n                      Holds a direct string or an expression that can be evaluated to a string.\n\n\n                      It can include variables denoted by $(VAR_NAME).\n                      These variables are expanded to the value of the environment variables defined in the container.\n                      If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                      To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                      For example:\n\n\n                      - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                      - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                      Default value is an empty string.\n                    type: string\n                  valueFrom:\n                    description: Specifies the source for the variable's value.\n                    properties:\n                      configMapKeyRef:\n                        description: Selects a key of a ConfigMap.\n                        properties:\n                          key:\n                            description: The key to select.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the ConfigMap or its key\n                              must be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      fieldRef:\n                        description: |-\n                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                        properties:\n                          apiVersion:\n                            description: Version of the schema the FieldPath is written\n                              in terms of, defaults to \"v1\".\n                            type: string\n                          fieldPath:\n                            description: Path of the field to select in the specified\n                              API version.\n                            type: string\n                        required:\n                        - fieldPath\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      resourceFieldRef:\n                        description: |-\n                          Selects a resource of the container: only resources limits and requests\n                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                        properties:\n                          containerName:\n                            description: 'Container name: required for volumes, optional\n                              for env vars'\n                            type: string\n                          divisor:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            description: Specifies the output format of the exposed\n                              resources, defaults to \"1\"\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          resource:\n                            description: 'Required: resource to select'\n                            type: string\n                        required:\n                        - resource\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      secretKeyRef:\n                        description: Selects a key of a secret in the pod's namespace\n                        properties:\n                          key:\n                            description: The key of the secret to select from.  Must\n                              be a valid secret key.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the Secret or its key must\n                              be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                    type: object\n                type: object\n              port:\n                description: Specifies the port of the external service.\n                properties:\n                  value:\n                    description: |-\n                      Holds a direct string or an expression that can be evaluated to a string.\n\n\n                      It can include variables denoted by $(VAR_NAME).\n                      These variables are expanded to the value of the environment variables defined in the container.\n                      If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                      To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                      For example:\n\n\n                      - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                      - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                      Default value is an empty string.\n                    type: string\n                  valueFrom:\n                    description: Specifies the source for the variable's value.\n                    properties:\n                      configMapKeyRef:\n                        description: Selects a key of a ConfigMap.\n                        properties:\n                          key:\n                            description: The key to select.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the ConfigMap or its key\n                              must be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      fieldRef:\n                        description: |-\n                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                        properties:\n                          apiVersion:\n                            description: Version of the schema the FieldPath is written\n                              in terms of, defaults to \"v1\".\n                            type: string\n                          fieldPath:\n                            description: Path of the field to select in the specified\n                              API version.\n                            type: string\n                        required:\n                        - fieldPath\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      resourceFieldRef:\n                        description: |-\n                          Selects a resource of the container: only resources limits and requests\n                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                        properties:\n                          containerName:\n                            description: 'Container name: required for volumes, optional\n                              for env vars'\n                            type: string\n                          divisor:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            description: Specifies the output format of the exposed\n                              resources, defaults to \"1\"\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          resource:\n                            description: 'Required: resource to select'\n                            type: string\n                        required:\n                        - resource\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      secretKeyRef:\n                        description: Selects a key of a secret in the pod's namespace\n                        properties:\n                          key:\n                            description: The key of the secret to select from.  Must\n                              be a valid secret key.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the Secret or its key must\n                              be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                    type: object\n                type: object\n              serviceKind:\n                description: |-\n                  Describes the type of database service provided by the external service.\n                  For example, \"mysql\", \"redis\", \"mongodb\".\n                  This field categorizes databases by their functionality, protocol and compatibility, facilitating appropriate\n                  service integration based on their unique capabilities.\n\n\n                  This field is case-insensitive.\n\n\n                  It also supports abbreviations for some well-known databases:\n                  - \"pg\", \"pgsql\", \"postgres\", \"postgresql\": PostgreSQL service\n                  - \"zk\", \"zookeeper\": ZooKeeper service\n                  - \"es\", \"elasticsearch\": Elasticsearch service\n                  - \"mongo\", \"mongodb\": MongoDB service\n                  - \"ch\", \"clickhouse\": ClickHouse service\n                type: string\n              serviceVersion:\n                description: |-\n                  Describes the version of the service provided by the external service.\n                  This is crucial for ensuring compatibility between different components of the system,\n                  as different versions of a service may have varying features.\n                type: string\n            required:\n            - serviceKind\n            - serviceVersion\n            type: object\n          status:\n            description: ServiceDescriptorStatus defines the observed state of ServiceDescriptor\n            properties:\n              message:\n                description: Provides a human-readable explanation detailing the reason\n                  for the current phase of the ServiceConnectionCredential.\n                type: string\n              observedGeneration:\n                description: Represents the generation number that has been processed\n                  by the controller.\n                format: int64\n                type: integer\n              phase:\n                description: Indicates the current lifecycle phase of the ServiceDescriptor.\n                  This can be either 'Available' or 'Unavailable'.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n  - additionalPrinterColumns:\n    - description: service kind\n      jsonPath: .spec.serviceKind\n      name: SERVICE_KIND\n      type: string\n    - description: service version\n      jsonPath: .spec.serviceVersion\n      name: SERVICE_VERSION\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          ServiceDescriptor describes a service provided by external sources.\n          It contains the necessary details such as the service's address and connection credentials.\n          To enable a Cluster to access this service, the ServiceDescriptor's name should be specified\n          in the Cluster configuration under `clusterComponent.serviceRefs[*].serviceDescriptor`.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ServiceDescriptorSpec defines the desired state of ServiceDescriptor.\n            properties:\n              auth:\n                description: Specifies the authentication credentials required for\n                  accessing an external service.\n                properties:\n                  password:\n                    description: Specifies the password for the external service.\n                    properties:\n                      value:\n                        description: |-\n                          Holds a direct string or an expression that can be evaluated to a string.\n\n\n                          It can include variables denoted by $(VAR_NAME).\n                          These variables are expanded to the value of the environment variables defined in the container.\n                          If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                          To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                          For example:\n\n\n                          - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                          - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                          Default value is an empty string.\n                        type: string\n                      valueFrom:\n                        description: Specifies the source for the variable's value.\n                        properties:\n                          configMapKeyRef:\n                            description: Selects a key of a ConfigMap.\n                            properties:\n                              key:\n                                description: The key to select.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the ConfigMap or its\n                                  key must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          fieldRef:\n                            description: |-\n                              Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                              spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                            properties:\n                              apiVersion:\n                                description: Version of the schema the FieldPath is\n                                  written in terms of, defaults to \"v1\".\n                                type: string\n                              fieldPath:\n                                description: Path of the field to select in the specified\n                                  API version.\n                                type: string\n                            required:\n                            - fieldPath\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          resourceFieldRef:\n                            description: |-\n                              Selects a resource of the container: only resources limits and requests\n                              (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                            properties:\n                              containerName:\n                                description: 'Container name: required for volumes,\n                                  optional for env vars'\n                                type: string\n                              divisor:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the output format of the exposed\n                                  resources, defaults to \"1\"\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              resource:\n                                description: 'Required: resource to select'\n                                type: string\n                            required:\n                            - resource\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          secretKeyRef:\n                            description: Selects a key of a secret in the pod's namespace\n                            properties:\n                              key:\n                                description: The key of the secret to select from.  Must\n                                  be a valid secret key.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the Secret or its key\n                                  must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                    type: object\n                  username:\n                    description: Specifies the username for the external service.\n                    properties:\n                      value:\n                        description: |-\n                          Holds a direct string or an expression that can be evaluated to a string.\n\n\n                          It can include variables denoted by $(VAR_NAME).\n                          These variables are expanded to the value of the environment variables defined in the container.\n                          If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                          To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                          For example:\n\n\n                          - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                          - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                          Default value is an empty string.\n                        type: string\n                      valueFrom:\n                        description: Specifies the source for the variable's value.\n                        properties:\n                          configMapKeyRef:\n                            description: Selects a key of a ConfigMap.\n                            properties:\n                              key:\n                                description: The key to select.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the ConfigMap or its\n                                  key must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          fieldRef:\n                            description: |-\n                              Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                              spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                            properties:\n                              apiVersion:\n                                description: Version of the schema the FieldPath is\n                                  written in terms of, defaults to \"v1\".\n                                type: string\n                              fieldPath:\n                                description: Path of the field to select in the specified\n                                  API version.\n                                type: string\n                            required:\n                            - fieldPath\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          resourceFieldRef:\n                            description: |-\n                              Selects a resource of the container: only resources limits and requests\n                              (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                            properties:\n                              containerName:\n                                description: 'Container name: required for volumes,\n                                  optional for env vars'\n                                type: string\n                              divisor:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the output format of the exposed\n                                  resources, defaults to \"1\"\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              resource:\n                                description: 'Required: resource to select'\n                                type: string\n                            required:\n                            - resource\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          secretKeyRef:\n                            description: Selects a key of a secret in the pod's namespace\n                            properties:\n                              key:\n                                description: The key of the secret to select from.  Must\n                                  be a valid secret key.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the Secret or its key\n                                  must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                    type: object\n                type: object\n              endpoint:\n                description: |-\n                  Specifies the endpoint of the external service.\n\n\n                  If the service is exposed via a cluster, the endpoint will be provided in the format of `host:port`.\n                properties:\n                  value:\n                    description: |-\n                      Holds a direct string or an expression that can be evaluated to a string.\n\n\n                      It can include variables denoted by $(VAR_NAME).\n                      These variables are expanded to the value of the environment variables defined in the container.\n                      If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                      To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                      For example:\n\n\n                      - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                      - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                      Default value is an empty string.\n                    type: string\n                  valueFrom:\n                    description: Specifies the source for the variable's value.\n                    properties:\n                      configMapKeyRef:\n                        description: Selects a key of a ConfigMap.\n                        properties:\n                          key:\n                            description: The key to select.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the ConfigMap or its key\n                              must be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      fieldRef:\n                        description: |-\n                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                        properties:\n                          apiVersion:\n                            description: Version of the schema the FieldPath is written\n                              in terms of, defaults to \"v1\".\n                            type: string\n                          fieldPath:\n                            description: Path of the field to select in the specified\n                              API version.\n                            type: string\n                        required:\n                        - fieldPath\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      resourceFieldRef:\n                        description: |-\n                          Selects a resource of the container: only resources limits and requests\n                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                        properties:\n                          containerName:\n                            description: 'Container name: required for volumes, optional\n                              for env vars'\n                            type: string\n                          divisor:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            description: Specifies the output format of the exposed\n                              resources, defaults to \"1\"\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          resource:\n                            description: 'Required: resource to select'\n                            type: string\n                        required:\n                        - resource\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      secretKeyRef:\n                        description: Selects a key of a secret in the pod's namespace\n                        properties:\n                          key:\n                            description: The key of the secret to select from.  Must\n                              be a valid secret key.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the Secret or its key must\n                              be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                    type: object\n                type: object\n              host:\n                description: Specifies the service or IP address of the external service.\n                properties:\n                  value:\n                    description: |-\n                      Holds a direct string or an expression that can be evaluated to a string.\n\n\n                      It can include variables denoted by $(VAR_NAME).\n                      These variables are expanded to the value of the environment variables defined in the container.\n                      If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                      To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                      For example:\n\n\n                      - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                      - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                      Default value is an empty string.\n                    type: string\n                  valueFrom:\n                    description: Specifies the source for the variable's value.\n                    properties:\n                      configMapKeyRef:\n                        description: Selects a key of a ConfigMap.\n                        properties:\n                          key:\n                            description: The key to select.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the ConfigMap or its key\n                              must be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      fieldRef:\n                        description: |-\n                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                        properties:\n                          apiVersion:\n                            description: Version of the schema the FieldPath is written\n                              in terms of, defaults to \"v1\".\n                            type: string\n                          fieldPath:\n                            description: Path of the field to select in the specified\n                              API version.\n                            type: string\n                        required:\n                        - fieldPath\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      resourceFieldRef:\n                        description: |-\n                          Selects a resource of the container: only resources limits and requests\n                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                        properties:\n                          containerName:\n                            description: 'Container name: required for volumes, optional\n                              for env vars'\n                            type: string\n                          divisor:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            description: Specifies the output format of the exposed\n                              resources, defaults to \"1\"\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          resource:\n                            description: 'Required: resource to select'\n                            type: string\n                        required:\n                        - resource\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      secretKeyRef:\n                        description: Selects a key of a secret in the pod's namespace\n                        properties:\n                          key:\n                            description: The key of the secret to select from.  Must\n                              be a valid secret key.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the Secret or its key must\n                              be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                    type: object\n                type: object\n              port:\n                description: Specifies the port of the external service.\n                properties:\n                  value:\n                    description: |-\n                      Holds a direct string or an expression that can be evaluated to a string.\n\n\n                      It can include variables denoted by $(VAR_NAME).\n                      These variables are expanded to the value of the environment variables defined in the container.\n                      If a variable cannot be resolved, it remains unchanged in the output.\n\n\n                      To escape variable expansion and retain the literal value, use double $ characters.\n\n\n                      For example:\n\n\n                      - \"$(VAR_NAME)\" will be expanded to the value of the environment variable VAR_NAME.\n                      - \"$$(VAR_NAME)\" will result in \"$(VAR_NAME)\" in the output, without any variable expansion.\n\n\n                      Default value is an empty string.\n                    type: string\n                  valueFrom:\n                    description: Specifies the source for the variable's value.\n                    properties:\n                      configMapKeyRef:\n                        description: Selects a key of a ConfigMap.\n                        properties:\n                          key:\n                            description: The key to select.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the ConfigMap or its key\n                              must be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      fieldRef:\n                        description: |-\n                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                        properties:\n                          apiVersion:\n                            description: Version of the schema the FieldPath is written\n                              in terms of, defaults to \"v1\".\n                            type: string\n                          fieldPath:\n                            description: Path of the field to select in the specified\n                              API version.\n                            type: string\n                        required:\n                        - fieldPath\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      resourceFieldRef:\n                        description: |-\n                          Selects a resource of the container: only resources limits and requests\n                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                        properties:\n                          containerName:\n                            description: 'Container name: required for volumes, optional\n                              for env vars'\n                            type: string\n                          divisor:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            description: Specifies the output format of the exposed\n                              resources, defaults to \"1\"\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          resource:\n                            description: 'Required: resource to select'\n                            type: string\n                        required:\n                        - resource\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      secretKeyRef:\n                        description: Selects a key of a secret in the pod's namespace\n                        properties:\n                          key:\n                            description: The key of the secret to select from.  Must\n                              be a valid secret key.\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              TODO: Add other useful fields. apiVersion, kind, uid?\n                            type: string\n                          optional:\n                            description: Specify whether the Secret or its key must\n                              be defined\n                            type: boolean\n                        required:\n                        - key\n                        type: object\n                        x-kubernetes-map-type: atomic\n                    type: object\n                type: object\n              serviceKind:\n                description: |-\n                  Describes the type of database service provided by the external service.\n                  For example, \"mysql\", \"redis\", \"mongodb\".\n                  This field categorizes databases by their functionality, protocol and compatibility, facilitating appropriate\n                  service integration based on their unique capabilities.\n\n\n                  This field is case-insensitive.\n\n\n                  It also supports abbreviations for some well-known databases:\n                  - \"pg\", \"pgsql\", \"postgres\", \"postgresql\": PostgreSQL service\n                  - \"zk\", \"zookeeper\": ZooKeeper service\n                  - \"es\", \"elasticsearch\": Elasticsearch service\n                  - \"mongo\", \"mongodb\": MongoDB service\n                  - \"ch\", \"clickhouse\": ClickHouse service\n                type: string\n              serviceVersion:\n                description: |-\n                  Describes the version of the service provided by the external service.\n                  This is crucial for ensuring compatibility between different components of the system,\n                  as different versions of a service may have varying features.\n                type: string\n            required:\n            - serviceKind\n            - serviceVersion\n            type: object\n          status:\n            description: ServiceDescriptorStatus defines the observed state of ServiceDescriptor\n            properties:\n              message:\n                description: Provides a human-readable explanation detailing the reason\n                  for the current phase of the ServiceConnectionCredential.\n                type: string\n              observedGeneration:\n                description: Represents the generation number that has been processed\n                  by the controller.\n                format: int64\n                type: integer\n              phase:\n                description: Indicates the current lifecycle phase of the ServiceDescriptor.\n                  This can be either 'Available' or 'Unavailable'.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: false\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: shardingdefinitions.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ShardingDefinition\n    listKind: ShardingDefinitionList\n    plural: shardingdefinitions\n    shortNames:\n    - sdd\n    singular: shardingdefinition\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: template\n      jsonPath: .spec.template.compDef\n      name: TEMPLATE\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: ShardingDefinition is the Schema for the shardingdefinitions\n          API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ShardingDefinitionSpec defines the desired state of ShardingDefinition\n            properties:\n              lifecycleActions:\n                description: |-\n                  Defines a set of hooks and procedures that customize the behavior of a sharding throughout its lifecycle.\n\n\n                  This field is immutable.\n                properties:\n                  postProvision:\n                    description: |-\n                      Specifies the hook to be executed after a sharding's creation.\n\n\n                      By setting `postProvision.preCondition`, you can determine the specific lifecycle stage at which\n                      the action should trigger, available conditions for sharding include: `Immediately`, `ComponentReady`,\n                      and `ClusterReady`. For sharding, the `ComponentReady` condition means all components of the sharding are ready.\n\n\n                      With `ComponentReady` being the default.\n\n\n                      The PostProvision Action is intended to run only once.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  preTerminate:\n                    description: |-\n                      Specifies the hook to be executed prior to terminating a sharding.\n\n\n                      The PreTerminate Action is intended to run only once.\n\n\n                      This action is executed immediately when a terminate operation for the sharding is initiated.\n                      The actual termination and cleanup of the sharding and its associated resources will not proceed\n                      until the PreTerminate action has completed successfully.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  shardAdd:\n                    description: |-\n                      Specifies the hook to be executed after a shard added.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                  shardRemove:\n                    description: |-\n                      Specifies the hook to be executed prior to remove a shard.\n\n\n                      Note: This field is immutable once it has been set.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                type: object\n              provisionStrategy:\n                default: Serial\n                description: |-\n                  Specifies the strategy for provisioning shards of the sharding. Only `Serial` and `Parallel` are supported.\n\n\n                  This field is immutable.\n                enum:\n                - Serial\n                - BestEffortParallel\n                - Parallel\n                type: string\n              shardsLimit:\n                description: |-\n                  Defines the upper limit of the number of shards supported by the sharding.\n\n\n                  This field is immutable.\n                properties:\n                  maxShards:\n                    description: The maximum limit of shards.\n                    format: int32\n                    type: integer\n                  minShards:\n                    description: The minimum limit of shards.\n                    format: int32\n                    type: integer\n                required:\n                - maxShards\n                - minShards\n                type: object\n                x-kubernetes-validations:\n                - message: the minimum and maximum limit of shards should be in the\n                    range of [0, 2048]\n                  rule: self.minShards >= 0 && self.maxShards <= 2048\n                - message: the minimum shards limit should be no greater than the\n                    maximum\n                  rule: self.minShards <= self.maxShards\n              systemAccounts:\n                description: |-\n                  Defines the system accounts for the sharding.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    name:\n                      description: |-\n                        The name of the system account defined in the sharding template.\n\n\n                        This field is immutable once set.\n                      type: string\n                    shared:\n                      description: Specifies whether the account is shared across\n                        all shards in the sharding.\n                      type: boolean\n                  required:\n                  - name\n                  type: object\n                type: array\n              template:\n                description: This field is immutable.\n                properties:\n                  compDef:\n                    description: |-\n                      The component definition(s) that the sharding is based on.\n\n\n                      The component definition can be specified using one of the following:\n\n\n                      - the full name\n                      - the regular expression pattern ('^' will be added to the beginning of the pattern automatically)\n\n\n                      This field is immutable.\n                    type: string\n                required:\n                - compDef\n                type: object\n              tls:\n                description: |-\n                  Defines the TLS for the sharding.\n\n\n                  This field is immutable.\n                properties:\n                  shared:\n                    description: Specifies whether the TLS configuration is shared\n                      across all shards in the sharding.\n                    type: boolean\n                type: object\n              updateStrategy:\n                default: Serial\n                description: |-\n                  Specifies the strategy for updating shards of the sharding. Only `Serial` and `Parallel` are supported.\n\n\n                  This field is immutable.\n                enum:\n                - Serial\n                - BestEffortParallel\n                - Parallel\n                type: string\n            required:\n            - template\n            type: object\n          status:\n            description: ShardingDefinitionStatus defines the observed state of ShardingDefinition\n            properties:\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: Refers to the most recent generation that has been observed\n                  for the ShardingDefinition.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Represents the current status of the ShardingDefinition. Valid values include ``, `Available`, and `Unavailable`.\n                  When the status is `Available`, the ShardingDefinition is ready and can be utilized by related objects.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: sidecardefinitions.apps.kubeblocks.io\nspec:\n  group: apps.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: SidecarDefinition\n    listKind: SidecarDefinitionList\n    plural: sidecardefinitions\n    shortNames:\n    - sdcd\n    singular: sidecardefinition\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: owners\n      jsonPath: .status.owners\n      name: Owner\n      type: string\n    - description: selectors\n      jsonPath: .status.selectors\n      name: Selector\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: SidecarDefinition is the Schema for the sidecardefinitions API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: SidecarDefinitionSpec defines the desired state of SidecarDefinition\n            properties:\n              configs:\n                description: |-\n                  Specifies the configuration file templates used by the Sidecar.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    defaultMode:\n                      description: |-\n                        The operator attempts to set default file permissions (0444).\n\n\n                        Must be specified as an octal value between 0000 and 0777 (inclusive),\n                        or as a decimal value between 0 and 511 (inclusive).\n                        YAML supports both octal and decimal values for file permissions.\n\n\n                        Please note that this setting only affects the permissions of the files themselves.\n                        Directories within the specified path are not impacted by this setting.\n                        It's important to be aware that this setting might conflict with other options\n                        that influence the file mode, such as fsGroup.\n                        In such cases, the resulting file mode may have additional bits set.\n                        Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                      format: int32\n                      type: integer\n                    externalManaged:\n                      description: |-\n                        ExternalManaged indicates whether the configuration is managed by an external system.\n                        When set to true, the controller will ignore the management of this configuration.\n                      type: boolean\n                    name:\n                      description: Specifies the name of the template.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    namespace:\n                      default: default\n                      description: Specifies the namespace of the referenced template\n                        ConfigMap object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    restartOnFileChange:\n                      description: Specifies whether to restart the pod when the file\n                        changes.\n                      type: boolean\n                    template:\n                      description: Specifies the name of the referenced template ConfigMap\n                        object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    volumeName:\n                      description: |-\n                        Refers to the volume name of PodTemplate. The file produced through the template will be mounted to\n                        the corresponding volume. Must be a DNS_LABEL name.\n                        The volume name must be defined in podSpec.containers[*].volumeMounts.\n                      maxLength: 63\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n              containers:\n                description: |-\n                  List of containers for the sidecar.\n\n\n                  Cannot be updated.\n                items:\n                  description: A single application container that you want to run\n                    within a pod.\n                  properties:\n                    args:\n                      description: |-\n                        Arguments to the entrypoint.\n                        The container image's CMD is used if this is not provided.\n                        Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                        cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                        produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                        of whether the variable exists or not. Cannot be updated.\n                        More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                      items:\n                        type: string\n                      type: array\n                    command:\n                      description: |-\n                        Entrypoint array. Not executed within a shell.\n                        The container image's ENTRYPOINT is used if this is not provided.\n                        Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                        cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                        produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                        of whether the variable exists or not. Cannot be updated.\n                        More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                      items:\n                        type: string\n                      type: array\n                    env:\n                      description: |-\n                        List of environment variables to set in the container.\n                        Cannot be updated.\n                      items:\n                        description: EnvVar represents an environment variable present\n                          in a Container.\n                        properties:\n                          name:\n                            description: Name of the environment variable. Must be\n                              a C_IDENTIFIER.\n                            type: string\n                          value:\n                            description: |-\n                              Variable references $(VAR_NAME) are expanded\n                              using the previously defined environment variables in the container and\n                              any service environment variables. If a variable cannot be resolved,\n                              the reference in the input string will be unchanged. Double $$ are reduced\n                              to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                              \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                              Escaped references will never be expanded, regardless of whether the variable\n                              exists or not.\n                              Defaults to \"\".\n                            type: string\n                          valueFrom:\n                            description: Source for the environment variable's value.\n                              Cannot be used if value is not empty.\n                            properties:\n                              configMapKeyRef:\n                                description: Selects a key of a ConfigMap.\n                                properties:\n                                  key:\n                                    description: The key to select.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap or\n                                      its key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              fieldRef:\n                                description: |-\n                                  Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                  spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              secretKeyRef:\n                                description: Selects a key of a secret in the pod's\n                                  namespace\n                                properties:\n                                  key:\n                                    description: The key of the secret to select from.  Must\n                                      be a valid secret key.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret or its\n                                      key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    envFrom:\n                      description: |-\n                        List of sources to populate environment variables in the container.\n                        The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                        will be reported as an event when the container is starting. When a key exists in multiple\n                        sources, the value associated with the last source will take precedence.\n                        Values defined by an Env with a duplicate key will take precedence.\n                        Cannot be updated.\n                      items:\n                        description: EnvFromSource represents the source of a set\n                          of ConfigMaps\n                        properties:\n                          configMapRef:\n                            description: The ConfigMap to select from\n                            properties:\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the ConfigMap must be\n                                  defined\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          prefix:\n                            description: An optional identifier to prepend to each\n                              key in the ConfigMap. Must be a C_IDENTIFIER.\n                            type: string\n                          secretRef:\n                            description: The Secret to select from\n                            properties:\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the Secret must be defined\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                      type: array\n                    image:\n                      description: |-\n                        Container image name.\n                        More info: https://kubernetes.io/docs/concepts/containers/images\n                        This field is optional to allow higher level config management to default or override\n                        container images in workload controllers like Deployments and StatefulSets.\n                      type: string\n                    imagePullPolicy:\n                      description: |-\n                        Image pull policy.\n                        One of Always, Never, IfNotPresent.\n                        Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                        Cannot be updated.\n                        More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                      type: string\n                    lifecycle:\n                      description: |-\n                        Actions that the management system should take in response to container lifecycle events.\n                        Cannot be updated.\n                      properties:\n                        postStart:\n                          description: |-\n                            PostStart is called immediately after a container is created. If the handler fails,\n                            the container is terminated and restarted according to its restart policy.\n                            Other management of the container blocks until the hook completes.\n                            More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            sleep:\n                              description: Sleep represents the duration that the\n                                container should sleep before being terminated.\n                              properties:\n                                seconds:\n                                  description: Seconds is the number of seconds to\n                                    sleep.\n                                  format: int64\n                                  type: integer\n                              required:\n                              - seconds\n                              type: object\n                            tcpSocket:\n                              description: |-\n                                Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                for the backward compatibility. There are no validation of this field and\n                                lifecycle hooks will fail in runtime when tcp handler is specified.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                          type: object\n                        preStop:\n                          description: |-\n                            PreStop is called immediately before a container is terminated due to an\n                            API request or management event such as liveness/startup probe failure,\n                            preemption, resource contention, etc. The handler is not called if the\n                            container crashes or exits. The Pod's termination grace period countdown begins before the\n                            PreStop hook is executed. Regardless of the outcome of the handler, the\n                            container will eventually terminate within the Pod's termination grace\n                            period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                            or until the termination grace period is reached.\n                            More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                          properties:\n                            exec:\n                              description: Exec specifies the action to take.\n                              properties:\n                                command:\n                                  description: |-\n                                    Command is the command line to execute inside the container, the working directory for the\n                                    command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                    not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                    a shell, you need to explicitly call out to that shell.\n                                    Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            httpGet:\n                              description: HTTPGet specifies the http request to perform.\n                              properties:\n                                host:\n                                  description: |-\n                                    Host name to connect to, defaults to the pod IP. You probably want to set\n                                    \"Host\" in httpHeaders instead.\n                                  type: string\n                                httpHeaders:\n                                  description: Custom headers to set in the request.\n                                    HTTP allows repeated headers.\n                                  items:\n                                    description: HTTPHeader describes a custom header\n                                      to be used in HTTP probes\n                                    properties:\n                                      name:\n                                        description: |-\n                                          The header field name.\n                                          This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                        type: string\n                                      value:\n                                        description: The header field value\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                path:\n                                  description: Path to access on the HTTP server.\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Name or number of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                                scheme:\n                                  description: |-\n                                    Scheme to use for connecting to the host.\n                                    Defaults to HTTP.\n                                  type: string\n                              required:\n                              - port\n                              type: object\n                            sleep:\n                              description: Sleep represents the duration that the\n                                container should sleep before being terminated.\n                              properties:\n                                seconds:\n                                  description: Seconds is the number of seconds to\n                                    sleep.\n                                  format: int64\n                                  type: integer\n                              required:\n                              - seconds\n                              type: object\n                            tcpSocket:\n                              description: |-\n                                Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                for the backward compatibility. There are no validation of this field and\n                                lifecycle hooks will fail in runtime when tcp handler is specified.\n                              properties:\n                                host:\n                                  description: 'Optional: Host name to connect to,\n                                    defaults to the pod IP.'\n                                  type: string\n                                port:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the container.\n                                    Number must be in the range 1 to 65535.\n                                    Name must be an IANA_SVC_NAME.\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                          type: object\n                      type: object\n                    livenessProbe:\n                      description: |-\n                        Periodic probe of container liveness.\n                        Container will be restarted if the probe fails.\n                        Cannot be updated.\n                        More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                      properties:\n                        exec:\n                          description: Exec specifies the action to take.\n                          properties:\n                            command:\n                              description: |-\n                                Command is the command line to execute inside the container, the working directory for the\n                                command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                a shell, you need to explicitly call out to that shell.\n                                Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                              items:\n                                type: string\n                              type: array\n                          type: object\n                        failureThreshold:\n                          description: |-\n                            Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                            Defaults to 3. Minimum value is 1.\n                          format: int32\n                          type: integer\n                        grpc:\n                          description: GRPC specifies an action involving a GRPC port.\n                          properties:\n                            port:\n                              description: Port number of the gRPC service. Number\n                                must be in the range 1 to 65535.\n                              format: int32\n                              type: integer\n                            service:\n                              description: |-\n                                Service is the name of the service to place in the gRPC HealthCheckRequest\n                                (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                If this is not specified, the default behavior is defined by gRPC.\n                              type: string\n                          required:\n                          - port\n                          type: object\n                        httpGet:\n                          description: HTTPGet specifies the http request to perform.\n                          properties:\n                            host:\n                              description: |-\n                                Host name to connect to, defaults to the pod IP. You probably want to set\n                                \"Host\" in httpHeaders instead.\n                              type: string\n                            httpHeaders:\n                              description: Custom headers to set in the request. HTTP\n                                allows repeated headers.\n                              items:\n                                description: HTTPHeader describes a custom header\n                                  to be used in HTTP probes\n                                properties:\n                                  name:\n                                    description: |-\n                                      The header field name.\n                                      This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                    type: string\n                                  value:\n                                    description: The header field value\n                                    type: string\n                                required:\n                                - name\n                                - value\n                                type: object\n                              type: array\n                            path:\n                              description: Path to access on the HTTP server.\n                              type: string\n                            port:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                Name or number of the port to access on the container.\n                                Number must be in the range 1 to 65535.\n                                Name must be an IANA_SVC_NAME.\n                              x-kubernetes-int-or-string: true\n                            scheme:\n                              description: |-\n                                Scheme to use for connecting to the host.\n                                Defaults to HTTP.\n                              type: string\n                          required:\n                          - port\n                          type: object\n                        initialDelaySeconds:\n                          description: |-\n                            Number of seconds after the container has started before liveness probes are initiated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          format: int32\n                          type: integer\n                        periodSeconds:\n                          description: |-\n                            How often (in seconds) to perform the probe.\n                            Default to 10 seconds. Minimum value is 1.\n                          format: int32\n                          type: integer\n                        successThreshold:\n                          description: |-\n                            Minimum consecutive successes for the probe to be considered successful after having failed.\n                            Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                          format: int32\n                          type: integer\n                        tcpSocket:\n                          description: TCPSocket specifies an action involving a TCP\n                            port.\n                          properties:\n                            host:\n                              description: 'Optional: Host name to connect to, defaults\n                                to the pod IP.'\n                              type: string\n                            port:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                Number or name of the port to access on the container.\n                                Number must be in the range 1 to 65535.\n                                Name must be an IANA_SVC_NAME.\n                              x-kubernetes-int-or-string: true\n                          required:\n                          - port\n                          type: object\n                        terminationGracePeriodSeconds:\n                          description: |-\n                            Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                            The grace period is the duration in seconds after the processes running in the pod are sent\n                            a termination signal and the time when the processes are forcibly halted with a kill signal.\n                            Set this value longer than the expected cleanup time for your process.\n                            If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                            value overrides the value provided by the pod spec.\n                            Value must be non-negative integer. The value zero indicates stop immediately via\n                            the kill signal (no opportunity to shut down).\n                            This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                            Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                          format: int64\n                          type: integer\n                        timeoutSeconds:\n                          description: |-\n                            Number of seconds after which the probe times out.\n                            Defaults to 1 second. Minimum value is 1.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          format: int32\n                          type: integer\n                      type: object\n                    name:\n                      description: |-\n                        Name of the container specified as a DNS_LABEL.\n                        Each container in a pod must have a unique name (DNS_LABEL).\n                        Cannot be updated.\n                      type: string\n                    ports:\n                      description: |-\n                        List of ports to expose from the container. Not specifying a port here\n                        DOES NOT prevent that port from being exposed. Any port which is\n                        listening on the default \"0.0.0.0\" address inside a container will be\n                        accessible from the network.\n                        Modifying this array with strategic merge patch may corrupt the data.\n                        For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                        Cannot be updated.\n                      items:\n                        description: ContainerPort represents a network port in a\n                          single container.\n                        properties:\n                          containerPort:\n                            description: |-\n                              Number of port to expose on the pod's IP address.\n                              This must be a valid port number, 0 < x < 65536.\n                            format: int32\n                            type: integer\n                          hostIP:\n                            description: What host IP to bind the external port to.\n                            type: string\n                          hostPort:\n                            description: |-\n                              Number of port to expose on the host.\n                              If specified, this must be a valid port number, 0 < x < 65536.\n                              If HostNetwork is specified, this must match ContainerPort.\n                              Most containers do not need this.\n                            format: int32\n                            type: integer\n                          name:\n                            description: |-\n                              If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                              named port in a pod must have a unique name. Name for the port that can be\n                              referred to by services.\n                            type: string\n                          protocol:\n                            default: TCP\n                            description: |-\n                              Protocol for port. Must be UDP, TCP, or SCTP.\n                              Defaults to \"TCP\".\n                            type: string\n                        required:\n                        - containerPort\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - containerPort\n                      - protocol\n                      x-kubernetes-list-type: map\n                    readinessProbe:\n                      description: |-\n                        Periodic probe of container service readiness.\n                        Container will be removed from service endpoints if the probe fails.\n                        Cannot be updated.\n                        More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                      properties:\n                        exec:\n                          description: Exec specifies the action to take.\n                          properties:\n                            command:\n                              description: |-\n                                Command is the command line to execute inside the container, the working directory for the\n                                command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                a shell, you need to explicitly call out to that shell.\n                                Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                              items:\n                                type: string\n                              type: array\n                          type: object\n                        failureThreshold:\n                          description: |-\n                            Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                            Defaults to 3. Minimum value is 1.\n                          format: int32\n                          type: integer\n                        grpc:\n                          description: GRPC specifies an action involving a GRPC port.\n                          properties:\n                            port:\n                              description: Port number of the gRPC service. Number\n                                must be in the range 1 to 65535.\n                              format: int32\n                              type: integer\n                            service:\n                              description: |-\n                                Service is the name of the service to place in the gRPC HealthCheckRequest\n                                (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                If this is not specified, the default behavior is defined by gRPC.\n                              type: string\n                          required:\n                          - port\n                          type: object\n                        httpGet:\n                          description: HTTPGet specifies the http request to perform.\n                          properties:\n                            host:\n                              description: |-\n                                Host name to connect to, defaults to the pod IP. You probably want to set\n                                \"Host\" in httpHeaders instead.\n                              type: string\n                            httpHeaders:\n                              description: Custom headers to set in the request. HTTP\n                                allows repeated headers.\n                              items:\n                                description: HTTPHeader describes a custom header\n                                  to be used in HTTP probes\n                                properties:\n                                  name:\n                                    description: |-\n                                      The header field name.\n                                      This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                    type: string\n                                  value:\n                                    description: The header field value\n                                    type: string\n                                required:\n                                - name\n                                - value\n                                type: object\n                              type: array\n                            path:\n                              description: Path to access on the HTTP server.\n                              type: string\n                            port:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                Name or number of the port to access on the container.\n                                Number must be in the range 1 to 65535.\n                                Name must be an IANA_SVC_NAME.\n                              x-kubernetes-int-or-string: true\n                            scheme:\n                              description: |-\n                                Scheme to use for connecting to the host.\n                                Defaults to HTTP.\n                              type: string\n                          required:\n                          - port\n                          type: object\n                        initialDelaySeconds:\n                          description: |-\n                            Number of seconds after the container has started before liveness probes are initiated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          format: int32\n                          type: integer\n                        periodSeconds:\n                          description: |-\n                            How often (in seconds) to perform the probe.\n                            Default to 10 seconds. Minimum value is 1.\n                          format: int32\n                          type: integer\n                        successThreshold:\n                          description: |-\n                            Minimum consecutive successes for the probe to be considered successful after having failed.\n                            Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                          format: int32\n                          type: integer\n                        tcpSocket:\n                          description: TCPSocket specifies an action involving a TCP\n                            port.\n                          properties:\n                            host:\n                              description: 'Optional: Host name to connect to, defaults\n                                to the pod IP.'\n                              type: string\n                            port:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                Number or name of the port to access on the container.\n                                Number must be in the range 1 to 65535.\n                                Name must be an IANA_SVC_NAME.\n                              x-kubernetes-int-or-string: true\n                          required:\n                          - port\n                          type: object\n                        terminationGracePeriodSeconds:\n                          description: |-\n                            Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                            The grace period is the duration in seconds after the processes running in the pod are sent\n                            a termination signal and the time when the processes are forcibly halted with a kill signal.\n                            Set this value longer than the expected cleanup time for your process.\n                            If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                            value overrides the value provided by the pod spec.\n                            Value must be non-negative integer. The value zero indicates stop immediately via\n                            the kill signal (no opportunity to shut down).\n                            This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                            Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                          format: int64\n                          type: integer\n                        timeoutSeconds:\n                          description: |-\n                            Number of seconds after which the probe times out.\n                            Defaults to 1 second. Minimum value is 1.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          format: int32\n                          type: integer\n                      type: object\n                    resizePolicy:\n                      description: Resources resize policy for the container.\n                      items:\n                        description: ContainerResizePolicy represents resource resize\n                          policy for the container.\n                        properties:\n                          resourceName:\n                            description: |-\n                              Name of the resource to which this resource resize policy applies.\n                              Supported values: cpu, memory.\n                            type: string\n                          restartPolicy:\n                            description: |-\n                              Restart policy to apply when specified resource is resized.\n                              If not specified, it defaults to NotRequired.\n                            type: string\n                        required:\n                        - resourceName\n                        - restartPolicy\n                        type: object\n                      type: array\n                      x-kubernetes-list-type: atomic\n                    resources:\n                      description: |-\n                        Compute Resources required by this container.\n                        Cannot be updated.\n                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                      properties:\n                        claims:\n                          description: |-\n                            Claims lists the names of resources, defined in spec.resourceClaims,\n                            that are used by this container.\n\n\n                            This is an alpha field and requires enabling the\n                            DynamicResourceAllocation feature gate.\n\n\n                            This field is immutable. It can only be set for containers.\n                          items:\n                            description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                            properties:\n                              name:\n                                description: |-\n                                  Name must match the name of one entry in pod.spec.resourceClaims of\n                                  the Pod where this field is used. It makes that resource available\n                                  inside a container.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        limits:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Limits describes the maximum amount of compute resources allowed.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                        requests:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Requests describes the minimum amount of compute resources required.\n                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                      type: object\n                    restartPolicy:\n                      description: |-\n                        RestartPolicy defines the restart behavior of individual containers in a pod.\n                        This field may only be set for init containers, and the only allowed value is \"Always\".\n                        For non-init containers or when this field is not specified,\n                        the restart behavior is defined by the Pod's restart policy and the container type.\n                        Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                        this init container will be continually restarted on\n                        exit until all regular containers have terminated. Once all regular\n                        containers have completed, all init containers with restartPolicy \"Always\"\n                        will be shut down. This lifecycle differs from normal init containers and\n                        is often referred to as a \"sidecar\" container. Although this init\n                        container still starts in the init container sequence, it does not wait\n                        for the container to complete before proceeding to the next init\n                        container. Instead, the next init container starts immediately after this\n                        init container is started, or after any startupProbe has successfully\n                        completed.\n                      type: string\n                    securityContext:\n                      description: |-\n                        SecurityContext defines the security options the container should be run with.\n                        If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                        More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                      properties:\n                        allowPrivilegeEscalation:\n                          description: |-\n                            AllowPrivilegeEscalation controls whether a process can gain more\n                            privileges than its parent process. This bool directly controls if\n                            the no_new_privs flag will be set on the container process.\n                            AllowPrivilegeEscalation is true always when the container is:\n                            1) run as Privileged\n                            2) has CAP_SYS_ADMIN\n                            Note that this field cannot be set when spec.os.name is windows.\n                          type: boolean\n                        capabilities:\n                          description: |-\n                            The capabilities to add/drop when running containers.\n                            Defaults to the default set of capabilities granted by the container runtime.\n                            Note that this field cannot be set when spec.os.name is windows.\n                          properties:\n                            add:\n                              description: Added capabilities\n                              items:\n                                description: Capability represent POSIX capabilities\n                                  type\n                                type: string\n                              type: array\n                            drop:\n                              description: Removed capabilities\n                              items:\n                                description: Capability represent POSIX capabilities\n                                  type\n                                type: string\n                              type: array\n                          type: object\n                        privileged:\n                          description: |-\n                            Run container in privileged mode.\n                            Processes in privileged containers are essentially equivalent to root on the host.\n                            Defaults to false.\n                            Note that this field cannot be set when spec.os.name is windows.\n                          type: boolean\n                        procMount:\n                          description: |-\n                            procMount denotes the type of proc mount to use for the containers.\n                            The default is DefaultProcMount which uses the container runtime defaults for\n                            readonly paths and masked paths.\n                            This requires the ProcMountType feature flag to be enabled.\n                            Note that this field cannot be set when spec.os.name is windows.\n                          type: string\n                        readOnlyRootFilesystem:\n                          description: |-\n                            Whether this container has a read-only root filesystem.\n                            Default is false.\n                            Note that this field cannot be set when spec.os.name is windows.\n                          type: boolean\n                        runAsGroup:\n                          description: |-\n                            The GID to run the entrypoint of the container process.\n                            Uses runtime default if unset.\n                            May also be set in PodSecurityContext.  If set in both SecurityContext and\n                            PodSecurityContext, the value specified in SecurityContext takes precedence.\n                            Note that this field cannot be set when spec.os.name is windows.\n                          format: int64\n                          type: integer\n                        runAsNonRoot:\n                          description: |-\n                            Indicates that the container must run as a non-root user.\n                            If true, the Kubelet will validate the image at runtime to ensure that it\n                            does not run as UID 0 (root) and fail to start the container if it does.\n                            If unset or false, no such validation will be performed.\n                            May also be set in PodSecurityContext.  If set in both SecurityContext and\n                            PodSecurityContext, the value specified in SecurityContext takes precedence.\n                          type: boolean\n                        runAsUser:\n                          description: |-\n                            The UID to run the entrypoint of the container process.\n                            Defaults to user specified in image metadata if unspecified.\n                            May also be set in PodSecurityContext.  If set in both SecurityContext and\n                            PodSecurityContext, the value specified in SecurityContext takes precedence.\n                            Note that this field cannot be set when spec.os.name is windows.\n                          format: int64\n                          type: integer\n                        seLinuxOptions:\n                          description: |-\n                            The SELinux context to be applied to the container.\n                            If unspecified, the container runtime will allocate a random SELinux context for each\n                            container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                            PodSecurityContext, the value specified in SecurityContext takes precedence.\n                            Note that this field cannot be set when spec.os.name is windows.\n                          properties:\n                            level:\n                              description: Level is SELinux level label that applies\n                                to the container.\n                              type: string\n                            role:\n                              description: Role is a SELinux role label that applies\n                                to the container.\n                              type: string\n                            type:\n                              description: Type is a SELinux type label that applies\n                                to the container.\n                              type: string\n                            user:\n                              description: User is a SELinux user label that applies\n                                to the container.\n                              type: string\n                          type: object\n                        seccompProfile:\n                          description: |-\n                            The seccomp options to use by this container. If seccomp options are\n                            provided at both the pod & container level, the container options\n                            override the pod options.\n                            Note that this field cannot be set when spec.os.name is windows.\n                          properties:\n                            localhostProfile:\n                              description: |-\n                                localhostProfile indicates a profile defined in a file on the node should be used.\n                                The profile must be preconfigured on the node to work.\n                                Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                              type: string\n                            type:\n                              description: |-\n                                type indicates which kind of seccomp profile will be applied.\n                                Valid options are:\n\n\n                                Localhost - a profile defined in a file on the node should be used.\n                                RuntimeDefault - the container runtime default profile should be used.\n                                Unconfined - no profile should be applied.\n                              type: string\n                          required:\n                          - type\n                          type: object\n                        windowsOptions:\n                          description: |-\n                            The Windows specific settings applied to all containers.\n                            If unspecified, the options from the PodSecurityContext will be used.\n                            If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                            Note that this field cannot be set when spec.os.name is linux.\n                          properties:\n                            gmsaCredentialSpec:\n                              description: |-\n                                GMSACredentialSpec is where the GMSA admission webhook\n                                (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                GMSA credential spec named by the GMSACredentialSpecName field.\n                              type: string\n                            gmsaCredentialSpecName:\n                              description: GMSACredentialSpecName is the name of the\n                                GMSA credential spec to use.\n                              type: string\n                            hostProcess:\n                              description: |-\n                                HostProcess determines if a container should be run as a 'Host Process' container.\n                                All of a Pod's containers must have the same effective HostProcess value\n                                (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                In addition, if HostProcess is true then HostNetwork must also be set to true.\n                              type: boolean\n                            runAsUserName:\n                              description: |-\n                                The UserName in Windows to run the entrypoint of the container process.\n                                Defaults to the user specified in image metadata if unspecified.\n                                May also be set in PodSecurityContext. If set in both SecurityContext and\n                                PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              type: string\n                          type: object\n                      type: object\n                    startupProbe:\n                      description: |-\n                        StartupProbe indicates that the Pod has successfully initialized.\n                        If specified, no other probes are executed until this completes successfully.\n                        If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                        This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                        when it might take a long time to load data or warm a cache, than during steady-state operation.\n                        This cannot be updated.\n                        More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                      properties:\n                        exec:\n                          description: Exec specifies the action to take.\n                          properties:\n                            command:\n                              description: |-\n                                Command is the command line to execute inside the container, the working directory for the\n                                command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                a shell, you need to explicitly call out to that shell.\n                                Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                              items:\n                                type: string\n                              type: array\n                          type: object\n                        failureThreshold:\n                          description: |-\n                            Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                            Defaults to 3. Minimum value is 1.\n                          format: int32\n                          type: integer\n                        grpc:\n                          description: GRPC specifies an action involving a GRPC port.\n                          properties:\n                            port:\n                              description: Port number of the gRPC service. Number\n                                must be in the range 1 to 65535.\n                              format: int32\n                              type: integer\n                            service:\n                              description: |-\n                                Service is the name of the service to place in the gRPC HealthCheckRequest\n                                (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                If this is not specified, the default behavior is defined by gRPC.\n                              type: string\n                          required:\n                          - port\n                          type: object\n                        httpGet:\n                          description: HTTPGet specifies the http request to perform.\n                          properties:\n                            host:\n                              description: |-\n                                Host name to connect to, defaults to the pod IP. You probably want to set\n                                \"Host\" in httpHeaders instead.\n                              type: string\n                            httpHeaders:\n                              description: Custom headers to set in the request. HTTP\n                                allows repeated headers.\n                              items:\n                                description: HTTPHeader describes a custom header\n                                  to be used in HTTP probes\n                                properties:\n                                  name:\n                                    description: |-\n                                      The header field name.\n                                      This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                    type: string\n                                  value:\n                                    description: The header field value\n                                    type: string\n                                required:\n                                - name\n                                - value\n                                type: object\n                              type: array\n                            path:\n                              description: Path to access on the HTTP server.\n                              type: string\n                            port:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                Name or number of the port to access on the container.\n                                Number must be in the range 1 to 65535.\n                                Name must be an IANA_SVC_NAME.\n                              x-kubernetes-int-or-string: true\n                            scheme:\n                              description: |-\n                                Scheme to use for connecting to the host.\n                                Defaults to HTTP.\n                              type: string\n                          required:\n                          - port\n                          type: object\n                        initialDelaySeconds:\n                          description: |-\n                            Number of seconds after the container has started before liveness probes are initiated.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          format: int32\n                          type: integer\n                        periodSeconds:\n                          description: |-\n                            How often (in seconds) to perform the probe.\n                            Default to 10 seconds. Minimum value is 1.\n                          format: int32\n                          type: integer\n                        successThreshold:\n                          description: |-\n                            Minimum consecutive successes for the probe to be considered successful after having failed.\n                            Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                          format: int32\n                          type: integer\n                        tcpSocket:\n                          description: TCPSocket specifies an action involving a TCP\n                            port.\n                          properties:\n                            host:\n                              description: 'Optional: Host name to connect to, defaults\n                                to the pod IP.'\n                              type: string\n                            port:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                Number or name of the port to access on the container.\n                                Number must be in the range 1 to 65535.\n                                Name must be an IANA_SVC_NAME.\n                              x-kubernetes-int-or-string: true\n                          required:\n                          - port\n                          type: object\n                        terminationGracePeriodSeconds:\n                          description: |-\n                            Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                            The grace period is the duration in seconds after the processes running in the pod are sent\n                            a termination signal and the time when the processes are forcibly halted with a kill signal.\n                            Set this value longer than the expected cleanup time for your process.\n                            If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                            value overrides the value provided by the pod spec.\n                            Value must be non-negative integer. The value zero indicates stop immediately via\n                            the kill signal (no opportunity to shut down).\n                            This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                            Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                          format: int64\n                          type: integer\n                        timeoutSeconds:\n                          description: |-\n                            Number of seconds after which the probe times out.\n                            Defaults to 1 second. Minimum value is 1.\n                            More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                          format: int32\n                          type: integer\n                      type: object\n                    stdin:\n                      description: |-\n                        Whether this container should allocate a buffer for stdin in the container runtime. If this\n                        is not set, reads from stdin in the container will always result in EOF.\n                        Default is false.\n                      type: boolean\n                    stdinOnce:\n                      description: |-\n                        Whether the container runtime should close the stdin channel after it has been opened by\n                        a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                        sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                        first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                        at which time stdin is closed and remains closed until the container is restarted. If this\n                        flag is false, a container processes that reads from stdin will never receive an EOF.\n                        Default is false\n                      type: boolean\n                    terminationMessagePath:\n                      description: |-\n                        Optional: Path at which the file to which the container's termination message\n                        will be written is mounted into the container's filesystem.\n                        Message written is intended to be brief final status, such as an assertion failure message.\n                        Will be truncated by the node if greater than 4096 bytes. The total message length across\n                        all containers will be limited to 12kb.\n                        Defaults to /dev/termination-log.\n                        Cannot be updated.\n                      type: string\n                    terminationMessagePolicy:\n                      description: |-\n                        Indicate how the termination message should be populated. File will use the contents of\n                        terminationMessagePath to populate the container status message on both success and failure.\n                        FallbackToLogsOnError will use the last chunk of container log output if the termination\n                        message file is empty and the container exited with an error.\n                        The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                        Defaults to File.\n                        Cannot be updated.\n                      type: string\n                    tty:\n                      description: |-\n                        Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                        Default is false.\n                      type: boolean\n                    volumeDevices:\n                      description: volumeDevices is the list of block devices to be\n                        used by the container.\n                      items:\n                        description: volumeDevice describes a mapping of a raw block\n                          device within a container.\n                        properties:\n                          devicePath:\n                            description: devicePath is the path inside of the container\n                              that the device will be mapped to.\n                            type: string\n                          name:\n                            description: name must match the name of a persistentVolumeClaim\n                              in the pod\n                            type: string\n                        required:\n                        - devicePath\n                        - name\n                        type: object\n                      type: array\n                    volumeMounts:\n                      description: |-\n                        Pod volumes to mount into the container's filesystem.\n                        Cannot be updated.\n                      items:\n                        description: VolumeMount describes a mounting of a Volume\n                          within a container.\n                        properties:\n                          mountPath:\n                            description: |-\n                              Path within the container at which the volume should be mounted.  Must\n                              not contain ':'.\n                            type: string\n                          mountPropagation:\n                            description: |-\n                              mountPropagation determines how mounts are propagated from the host\n                              to container and the other way around.\n                              When not set, MountPropagationNone is used.\n                              This field is beta in 1.10.\n                            type: string\n                          name:\n                            description: This must match the Name of a Volume.\n                            type: string\n                          readOnly:\n                            description: |-\n                              Mounted read-only if true, read-write otherwise (false or unspecified).\n                              Defaults to false.\n                            type: boolean\n                          subPath:\n                            description: |-\n                              Path within the volume from which the container's volume should be mounted.\n                              Defaults to \"\" (volume's root).\n                            type: string\n                          subPathExpr:\n                            description: |-\n                              Expanded path within the volume from which the container's volume should be mounted.\n                              Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                              Defaults to \"\" (volume's root).\n                              SubPathExpr and SubPath are mutually exclusive.\n                            type: string\n                        required:\n                        - mountPath\n                        - name\n                        type: object\n                      type: array\n                    workingDir:\n                      description: |-\n                        Container's working directory.\n                        If not specified, the container runtime's default will be used, which\n                        might be configured in the container image.\n                        Cannot be updated.\n                      type: string\n                  required:\n                  - name\n                  type: object\n                minItems: 1\n                type: array\n              name:\n                description: Specifies the name of the sidecar.\n                type: string\n              owner:\n                description: |-\n                  Specifies the component definition that the sidecar belongs to.\n\n\n                  For a specific cluster object, if there is any components provided by the component definition of @owner,\n                  the sidecar will be created and injected into the components which are provided by\n                  the component definition of @selectors automatically.\n\n\n                  This field is immutable.\n                type: string\n              scripts:\n                description: |-\n                  Specifies the scripts used by the Sidecar.\n\n\n                  This field is immutable.\n                items:\n                  properties:\n                    defaultMode:\n                      description: |-\n                        The operator attempts to set default file permissions (0444).\n\n\n                        Must be specified as an octal value between 0000 and 0777 (inclusive),\n                        or as a decimal value between 0 and 511 (inclusive).\n                        YAML supports both octal and decimal values for file permissions.\n\n\n                        Please note that this setting only affects the permissions of the files themselves.\n                        Directories within the specified path are not impacted by this setting.\n                        It's important to be aware that this setting might conflict with other options\n                        that influence the file mode, such as fsGroup.\n                        In such cases, the resulting file mode may have additional bits set.\n                        Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                      format: int32\n                      type: integer\n                    externalManaged:\n                      description: |-\n                        ExternalManaged indicates whether the configuration is managed by an external system.\n                        When set to true, the controller will ignore the management of this configuration.\n                      type: boolean\n                    name:\n                      description: Specifies the name of the template.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    namespace:\n                      default: default\n                      description: Specifies the namespace of the referenced template\n                        ConfigMap object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                    restartOnFileChange:\n                      description: Specifies whether to restart the pod when the file\n                        changes.\n                      type: boolean\n                    template:\n                      description: Specifies the name of the referenced template ConfigMap\n                        object.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    volumeName:\n                      description: |-\n                        Refers to the volume name of PodTemplate. The file produced through the template will be mounted to\n                        the corresponding volume. Must be a DNS_LABEL name.\n                        The volume name must be defined in podSpec.containers[*].volumeMounts.\n                      maxLength: 63\n                      pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n              selectors:\n                description: |-\n                  Specifies the component definition of components that the sidecar along with.\n\n\n                  This field is immutable.\n                items:\n                  type: string\n                minItems: 1\n                type: array\n              vars:\n                description: |-\n                  Defines variables which are needed by the sidecar.\n\n\n                  This field is immutable.\n                items:\n                  description: EnvVar represents a variable present in the env of\n                    Pod/Action or the template of config/script.\n                  properties:\n                    expression:\n                      description: |-\n                        A Go template expression that will be applied to the resolved value of the var.\n\n\n                        The expression will only be evaluated if the var is successfully resolved to a non-credential value.\n\n\n                        The resolved value can be accessed by its name within the expression, system vars and other user-defined\n                        non-credential vars can be used within the expression in the same way.\n                        Notice that, when accessing vars by its name, you should replace all the \"-\" in the name with \"_\", because of\n                        that \"-\" is not a valid identifier in Go.\n\n\n                        All expressions are evaluated in the order the vars are defined. If a var depends on any vars that also\n                        have expressions defined, be careful about the evaluation order as it may use intermediate values.\n\n\n                        The result of evaluation will be used as the final value of the var. If the expression fails to evaluate,\n                        the resolving of var will also be considered failed.\n                      type: string\n                    name:\n                      description: Name of the variable. Must be a C_IDENTIFIER.\n                      type: string\n                    value:\n                      description: |-\n                        Variable references `$(VAR_NAME)` are expanded using the previously defined variables in the current context.\n\n\n                        If a variable cannot be resolved, the reference in the input string will be unchanged.\n                        Double `$$` are reduced to a single `$`, which allows for escaping the `$(VAR_NAME)` syntax: i.e.\n\n\n                        - `$$(VAR_NAME)` will produce the string literal `$(VAR_NAME)`.\n\n\n                        Escaped references will never be expanded, regardless of whether the variable exists or not.\n                        Defaults to \"\".\n                      type: string\n                    valueFrom:\n                      description: Source for the variable's value. Cannot be used\n                        if value is not empty.\n                      properties:\n                        clusterVarRef:\n                          description: Selects a defined var of a Cluster.\n                          properties:\n                            clusterName:\n                              description: Reference to the name of the Cluster object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            clusterUID:\n                              description: Reference to the UID of the Cluster object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            namespace:\n                              description: Reference to the namespace of the Cluster\n                                object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        componentVarRef:\n                          description: Selects a defined var of a Component.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            componentName:\n                              description: Reference to the name of the Component\n                                object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            podFQDNs:\n                              description: |-\n                                Reference to the pod FQDN list of the component.\n                                The value will be presented in the following format: FQDN1,FQDN2,...\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            podFQDNsForRole:\n                              description: |-\n                                Reference to the pod FQDN list of the component that have a specific role.\n                                The value will be presented in the following format: FQDN1,FQDN2,...\n                              properties:\n                                option:\n                                  description: VarOption defines whether a variable\n                                    is required or optional.\n                                  enum:\n                                  - Required\n                                  - Optional\n                                  type: string\n                                role:\n                                  type: string\n                              type: object\n                            podNames:\n                              description: |-\n                                Reference to the pod name list of the component.\n                                and the value will be presented in the following format: name1,name2,...\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            podNamesForRole:\n                              description: |-\n                                Reference to the pod name list of the component that have a specific role.\n                                The value will be presented in the following format: name1,name2,...\n                              properties:\n                                option:\n                                  description: VarOption defines whether a variable\n                                    is required or optional.\n                                  enum:\n                                  - Required\n                                  - Optional\n                                  type: string\n                                role:\n                                  type: string\n                              type: object\n                            replicas:\n                              description: Reference to the replicas of the component.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            shortName:\n                              description: Reference to the short name of the Component\n                                object.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        configMapKeyRef:\n                          description: Selects a key of a ConfigMap.\n                          properties:\n                            key:\n                              description: The key to select.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the ConfigMap or its key\n                                must be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        credentialVarRef:\n                          description: Selects a defined var of a Credential (SystemAccount).\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            password:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            username:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        hostNetworkVarRef:\n                          description: Selects a defined var of host-network resources.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            container:\n                              description: ContainerVars defines the vars that can\n                                be referenced from a Container.\n                              properties:\n                                name:\n                                  description: The name of the container.\n                                  type: string\n                                port:\n                                  description: Container port to reference.\n                                  properties:\n                                    name:\n                                      type: string\n                                    option:\n                                      description: VarOption defines whether a variable\n                                        is required or optional.\n                                      enum:\n                                      - Required\n                                      - Optional\n                                      type: string\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                          type: object\n                        resourceVarRef:\n                          description: Selects a defined var of a kind of resource.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            cpu:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            cpuLimit:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            memory:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            memoryLimit:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            storage:\n                              properties:\n                                name:\n                                  type: string\n                                option:\n                                  description: VarOption defines whether a variable\n                                    is required or optional.\n                                  enum:\n                                  - Required\n                                  - Optional\n                                  type: string\n                              type: object\n                          type: object\n                        secretKeyRef:\n                          description: Selects a key of a Secret.\n                          properties:\n                            key:\n                              description: The key of the secret to select from.  Must\n                                be a valid secret key.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the Secret or its key must\n                                be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        serviceRefVarRef:\n                          description: Selects a defined var of a ServiceRef.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            endpoint:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            host:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            password:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            podFQDNs:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            port:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            username:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        serviceVarRef:\n                          description: Selects a defined var of a Service.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            host:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            loadBalancer:\n                              description: |-\n                                LoadBalancer represents the LoadBalancer ingress point of the service.\n\n\n                                If multiple ingress points are available, the first one will be used automatically, choosing between IP and Hostname.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                            port:\n                              description: |-\n                                Port references a port or node-port defined in the service.\n\n\n                                If the referenced service is a pod-service, there will be multiple service objects matched,\n                                and the value will be presented in the following format: service1.name:port1,service2.name:port2...\n                              properties:\n                                name:\n                                  type: string\n                                option:\n                                  description: VarOption defines whether a variable\n                                    is required or optional.\n                                  enum:\n                                  - Required\n                                  - Optional\n                                  type: string\n                              type: object\n                            serviceType:\n                              description: ServiceType references the type of the\n                                service.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                          type: object\n                        tlsVarRef:\n                          description: Selects a defined var of the TLS.\n                          properties:\n                            compDef:\n                              description: |-\n                                Specifies the exact name, name prefix, or regular expression pattern for matching the name of the ComponentDefinition\n                                custom resource (CR) used by the component that the referent object resident in.\n\n\n                                If not specified, the component itself will be used.\n                              type: string\n                            enabled:\n                              description: VarOption defines whether a variable is\n                                required or optional.\n                              enum:\n                              - Required\n                              - Optional\n                              type: string\n                            multipleClusterObjectOption:\n                              description: |-\n                                This option defines the behavior when multiple component objects match the specified @CompDef.\n                                If not provided, an error will be raised when handling multiple matches.\n                              properties:\n                                combinedOption:\n                                  description: |-\n                                    Define the options for handling combined variables.\n                                    Valid only when the strategy is set to \"combined\".\n                                  properties:\n                                    flattenFormat:\n                                      description: 'The flatten format, default is:\n                                        $(comp-name-1):value,$(comp-name-2):value.'\n                                      properties:\n                                        delimiter:\n                                          default: ','\n                                          description: Pair delimiter.\n                                          type: string\n                                        keyValueDelimiter:\n                                          default: ':'\n                                          description: Key-value delimiter.\n                                          type: string\n                                      required:\n                                      - delimiter\n                                      - keyValueDelimiter\n                                      type: object\n                                    newVarSuffix:\n                                      description: |-\n                                        If set, the existing variable will be kept, and a new variable will be defined with the specified suffix\n                                        in pattern: $(var.name)_$(suffix).\n                                        The new variable will be auto-created and placed behind the existing one.\n                                        If not set, the existing variable will be reused with the value format defined below.\n                                      type: string\n                                    valueFormat:\n                                      default: Flatten\n                                      description: The format of the value that the\n                                        operator will use to compose values from multiple\n                                        components.\n                                      type: string\n                                  type: object\n                                requireAllComponentObjects:\n                                  description: |-\n                                    RequireAllComponentObjects controls whether all component objects must exist before resolving.\n                                    If set to true, resolving will only proceed if all component objects are present.\n                                  type: boolean\n                                strategy:\n                                  description: Define the strategy for handling multiple\n                                    cluster objects.\n                                  enum:\n                                  - individual\n                                  - combined\n                                  type: string\n                              required:\n                              - strategy\n                              type: object\n                            name:\n                              description: Name of the referent object.\n                              type: string\n                            optional:\n                              description: Specify whether the object must be defined.\n                              type: boolean\n                          type: object\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n            required:\n            - containers\n            - name\n            - owner\n            - selectors\n            type: object\n          status:\n            description: SidecarDefinitionStatus defines the observed state of SidecarDefinition\n            properties:\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: Refers to the most recent generation that has been observed\n                  for the SidecarDefinition.\n                format: int64\n                type: integer\n              owners:\n                description: Resolved owners of the SidecarDefinition.\n                type: string\n              phase:\n                description: |-\n                  Represents the current status of the SidecarDefinition. Valid values include ``, `Available`, and `Unavailable`.\n                  When the status is `Available`, the SidecarDefinition is ready and can be utilized by related objects.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n              selectors:\n                description: Resolved selectors of the SidecarDefinition.\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: actionsets.dataprotection.kubeblocks.io\nspec:\n  group: dataprotection.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ActionSet\n    listKind: ActionSetList\n    plural: actionsets\n    shortNames:\n    - as\n    singular: actionset\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .spec.backupType\n      name: BACKUP-TYPE\n      type: string\n    - jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: ActionSet is the Schema for the actionsets API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ActionSetSpec defines the desired state of ActionSet\n            properties:\n              backup:\n                description: Specifies the backup action.\n                properties:\n                  backupData:\n                    description: Represents the action to be performed for backing\n                      up data.\n                    properties:\n                      command:\n                        description: Defines the commands to back up the volume data.\n                        items:\n                          type: string\n                        type: array\n                      image:\n                        description: Specifies the image of the backup container.\n                        type: string\n                      onError:\n                        default: Fail\n                        description: Indicates how to behave if an error is encountered\n                          during the execution of this action.\n                        enum:\n                        - Continue\n                        - Fail\n                        type: string\n                      runOnTargetPodNode:\n                        default: false\n                        description: |-\n                          Determines whether to run the job workload on the target pod node.\n                          If the backup container needs to mount the target pod's volumes, this field\n                          should be set to true. Otherwise, the target pod's volumes will be ignored.\n                        type: boolean\n                      syncProgress:\n                        description: |-\n                          Determines if the backup progress should be synchronized and the interval\n                          for synchronization in seconds.\n                        properties:\n                          enabled:\n                            description: |-\n                              Determines if the backup progress should be synchronized. If set to true,\n                              a sidecar container will be instantiated to synchronize the backup progress with the\n                              Backup Custom Resource (CR) status.\n                            type: boolean\n                          intervalSeconds:\n                            default: 60\n                            description: Defines the interval in seconds for synchronizing\n                              the backup progress.\n                            format: int32\n                            type: integer\n                        type: object\n                    required:\n                    - command\n                    - image\n                    type: object\n                  postBackup:\n                    description: Represents a set of actions that should be executed\n                      after the backup process has completed.\n                    items:\n                      description: ActionSpec defines an action that should be executed.\n                        Only one of the fields may be set.\n                      properties:\n                        exec:\n                          description: Specifies that the action should be executed\n                            using the pod's exec API within a container.\n                          properties:\n                            command:\n                              description: Defines the command and arguments to be\n                                executed.\n                              items:\n                                type: string\n                              minItems: 1\n                              type: array\n                            container:\n                              description: |-\n                                Specifies the container within the pod where the command should be executed.\n                                If not specified, the first container in the pod is used by default.\n                              type: string\n                            onError:\n                              default: Fail\n                              description: Indicates how to behave if an error is\n                                encountered during the execution of this action.\n                              enum:\n                              - Continue\n                              - Fail\n                              type: string\n                            timeout:\n                              description: |-\n                                Specifies the maximum duration to wait for the hook to complete before\n                                considering the execution a failure.\n                              type: string\n                          required:\n                          - command\n                          type: object\n                        job:\n                          description: Specifies that the action should be executed\n                            by a Kubernetes Job.\n                          properties:\n                            command:\n                              description: Defines the commands to back up the volume\n                                data.\n                              items:\n                                type: string\n                              type: array\n                            image:\n                              description: Specifies the image of the backup container.\n                              type: string\n                            onError:\n                              default: Fail\n                              description: Indicates how to behave if an error is\n                                encountered during the execution of this action.\n                              enum:\n                              - Continue\n                              - Fail\n                              type: string\n                            runOnTargetPodNode:\n                              default: false\n                              description: |-\n                                Determines whether to run the job workload on the target pod node.\n                                If the backup container needs to mount the target pod's volumes, this field\n                                should be set to true. Otherwise, the target pod's volumes will be ignored.\n                              type: boolean\n                          required:\n                          - command\n                          - image\n                          type: object\n                      type: object\n                    type: array\n                  preBackup:\n                    description: Represents a set of actions that should be executed\n                      before the backup process begins.\n                    items:\n                      description: ActionSpec defines an action that should be executed.\n                        Only one of the fields may be set.\n                      properties:\n                        exec:\n                          description: Specifies that the action should be executed\n                            using the pod's exec API within a container.\n                          properties:\n                            command:\n                              description: Defines the command and arguments to be\n                                executed.\n                              items:\n                                type: string\n                              minItems: 1\n                              type: array\n                            container:\n                              description: |-\n                                Specifies the container within the pod where the command should be executed.\n                                If not specified, the first container in the pod is used by default.\n                              type: string\n                            onError:\n                              default: Fail\n                              description: Indicates how to behave if an error is\n                                encountered during the execution of this action.\n                              enum:\n                              - Continue\n                              - Fail\n                              type: string\n                            timeout:\n                              description: |-\n                                Specifies the maximum duration to wait for the hook to complete before\n                                considering the execution a failure.\n                              type: string\n                          required:\n                          - command\n                          type: object\n                        job:\n                          description: Specifies that the action should be executed\n                            by a Kubernetes Job.\n                          properties:\n                            command:\n                              description: Defines the commands to back up the volume\n                                data.\n                              items:\n                                type: string\n                              type: array\n                            image:\n                              description: Specifies the image of the backup container.\n                              type: string\n                            onError:\n                              default: Fail\n                              description: Indicates how to behave if an error is\n                                encountered during the execution of this action.\n                              enum:\n                              - Continue\n                              - Fail\n                              type: string\n                            runOnTargetPodNode:\n                              default: false\n                              description: |-\n                                Determines whether to run the job workload on the target pod node.\n                                If the backup container needs to mount the target pod's volumes, this field\n                                should be set to true. Otherwise, the target pod's volumes will be ignored.\n                              type: boolean\n                          required:\n                          - command\n                          - image\n                          type: object\n                      type: object\n                    type: array\n                  preDelete:\n                    description: |-\n                      Represents a custom deletion action that can be executed before the built-in deletion action.\n                      Note: The preDelete action job will ignore the env/envFrom.\n                    properties:\n                      command:\n                        description: Defines the commands to back up the volume data.\n                        items:\n                          type: string\n                        type: array\n                      image:\n                        description: Specifies the image of the backup container.\n                        type: string\n                    required:\n                    - command\n                    - image\n                    type: object\n                  withParameters:\n                    description: Specifies the parameters used by the backup action\n                    items:\n                      type: string\n                    type: array\n                type: object\n              backupType:\n                allOf:\n                - enum:\n                  - Full\n                  - Incremental\n                  - Differential\n                  - Continuous\n                  - Selective\n                - enum:\n                  - Full\n                  - Incremental\n                  - Differential\n                  - Continuous\n                  - Selective\n                default: Full\n                description: |-\n                  Specifies the backup type. Supported values include:\n\n\n                  - `Full` for a full backup.\n                  - `Incremental` back up data that have changed since the last backup (either full or incremental).\n                  - `Differential` back up data that has changed since the last full backup.\n                  - `Continuous` back up transaction logs continuously, such as MySQL binlog, PostgreSQL WAL, etc.\n                  - `Selective` back up data more precisely, use custom parameters, such as specific databases or tables.\n\n\n                  Continuous backup is essential for implementing Point-in-Time Recovery (PITR).\n                type: string\n              env:\n                description: Specifies a list of environment variables to be set in\n                  the container.\n                items:\n                  description: EnvVar represents an environment variable present in\n                    a Container.\n                  properties:\n                    name:\n                      description: Name of the environment variable. Must be a C_IDENTIFIER.\n                      type: string\n                    value:\n                      description: |-\n                        Variable references $(VAR_NAME) are expanded\n                        using the previously defined environment variables in the container and\n                        any service environment variables. If a variable cannot be resolved,\n                        the reference in the input string will be unchanged. Double $$ are reduced\n                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                        Escaped references will never be expanded, regardless of whether the variable\n                        exists or not.\n                        Defaults to \"\".\n                      type: string\n                    valueFrom:\n                      description: Source for the environment variable's value. Cannot\n                        be used if value is not empty.\n                      properties:\n                        configMapKeyRef:\n                          description: Selects a key of a ConfigMap.\n                          properties:\n                            key:\n                              description: The key to select.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the ConfigMap or its key\n                                must be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        fieldRef:\n                          description: |-\n                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                          properties:\n                            apiVersion:\n                              description: Version of the schema the FieldPath is\n                                written in terms of, defaults to \"v1\".\n                              type: string\n                            fieldPath:\n                              description: Path of the field to select in the specified\n                                API version.\n                              type: string\n                          required:\n                          - fieldPath\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        resourceFieldRef:\n                          description: |-\n                            Selects a resource of the container: only resources limits and requests\n                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                          properties:\n                            containerName:\n                              description: 'Container name: required for volumes,\n                                optional for env vars'\n                              type: string\n                            divisor:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: Specifies the output format of the exposed\n                                resources, defaults to \"1\"\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                            resource:\n                              description: 'Required: resource to select'\n                              type: string\n                          required:\n                          - resource\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        secretKeyRef:\n                          description: Selects a key of a secret in the pod's namespace\n                          properties:\n                            key:\n                              description: The key of the secret to select from.  Must\n                                be a valid secret key.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the Secret or its key must\n                                be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-preserve-unknown-fields: true\n              envFrom:\n                description: |-\n                  Specifies a list of sources to populate environment variables in the container.\n                  The keys within a source must be a C_IDENTIFIER. Any invalid keys will be\n                  reported as an event when the container starts. If a key exists in multiple\n                  sources, the value from the last source will take precedence. Any values\n                  defined by an Env with a duplicate key will take precedence.\n\n\n                  This field cannot be updated.\n                items:\n                  description: EnvFromSource represents the source of a set of ConfigMaps\n                  properties:\n                    configMapRef:\n                      description: The ConfigMap to select from\n                      properties:\n                        name:\n                          description: |-\n                            Name of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            TODO: Add other useful fields. apiVersion, kind, uid?\n                          type: string\n                        optional:\n                          description: Specify whether the ConfigMap must be defined\n                          type: boolean\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    prefix:\n                      description: An optional identifier to prepend to each key in\n                        the ConfigMap. Must be a C_IDENTIFIER.\n                      type: string\n                    secretRef:\n                      description: The Secret to select from\n                      properties:\n                        name:\n                          description: |-\n                            Name of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            TODO: Add other useful fields. apiVersion, kind, uid?\n                          type: string\n                        optional:\n                          description: Specify whether the Secret must be defined\n                          type: boolean\n                      type: object\n                      x-kubernetes-map-type: atomic\n                  type: object\n                type: array\n                x-kubernetes-preserve-unknown-fields: true\n              parametersSchema:\n                description: Specifies the schema of parameters in backups and restores\n                  before their usage.\n                properties:\n                  openAPIV3Schema:\n                    description: |-\n                      Defines the schema for parameters using the OpenAPI v3.\n                      The supported property types include:\n                      - string\n                      - number\n                      - integer\n                      - array: Note that only items of string type are supported.\n                    type: object\n                    x-kubernetes-preserve-unknown-fields: true\n                type: object\n              restore:\n                description: Specifies the restore action.\n                properties:\n                  baseBackupRequired:\n                    default: true\n                    description: Determines if a base backup is required during restoration.\n                    type: boolean\n                  postReady:\n                    description: Specifies the actions that should be executed after\n                      the data has been prepared and is ready for restoration.\n                    items:\n                      description: ActionSpec defines an action that should be executed.\n                        Only one of the fields may be set.\n                      properties:\n                        exec:\n                          description: Specifies that the action should be executed\n                            using the pod's exec API within a container.\n                          properties:\n                            command:\n                              description: Defines the command and arguments to be\n                                executed.\n                              items:\n                                type: string\n                              minItems: 1\n                              type: array\n                            container:\n                              description: |-\n                                Specifies the container within the pod where the command should be executed.\n                                If not specified, the first container in the pod is used by default.\n                              type: string\n                            onError:\n                              default: Fail\n                              description: Indicates how to behave if an error is\n                                encountered during the execution of this action.\n                              enum:\n                              - Continue\n                              - Fail\n                              type: string\n                            timeout:\n                              description: |-\n                                Specifies the maximum duration to wait for the hook to complete before\n                                considering the execution a failure.\n                              type: string\n                          required:\n                          - command\n                          type: object\n                        job:\n                          description: Specifies that the action should be executed\n                            by a Kubernetes Job.\n                          properties:\n                            command:\n                              description: Defines the commands to back up the volume\n                                data.\n                              items:\n                                type: string\n                              type: array\n                            image:\n                              description: Specifies the image of the backup container.\n                              type: string\n                            onError:\n                              default: Fail\n                              description: Indicates how to behave if an error is\n                                encountered during the execution of this action.\n                              enum:\n                              - Continue\n                              - Fail\n                              type: string\n                            runOnTargetPodNode:\n                              default: false\n                              description: |-\n                                Determines whether to run the job workload on the target pod node.\n                                If the backup container needs to mount the target pod's volumes, this field\n                                should be set to true. Otherwise, the target pod's volumes will be ignored.\n                              type: boolean\n                          required:\n                          - command\n                          - image\n                          type: object\n                      type: object\n                    type: array\n                  prepareData:\n                    description: Specifies the action required to prepare data for\n                      restoration.\n                    properties:\n                      command:\n                        description: Defines the commands to back up the volume data.\n                        items:\n                          type: string\n                        type: array\n                      image:\n                        description: Specifies the image of the backup container.\n                        type: string\n                      onError:\n                        default: Fail\n                        description: Indicates how to behave if an error is encountered\n                          during the execution of this action.\n                        enum:\n                        - Continue\n                        - Fail\n                        type: string\n                      runOnTargetPodNode:\n                        default: false\n                        description: |-\n                          Determines whether to run the job workload on the target pod node.\n                          If the backup container needs to mount the target pod's volumes, this field\n                          should be set to true. Otherwise, the target pod's volumes will be ignored.\n                        type: boolean\n                    required:\n                    - command\n                    - image\n                    type: object\n                  withParameters:\n                    description: Specifies the parameters used by the restore action\n                    items:\n                      type: string\n                    type: array\n                type: object\n            required:\n            - backupType\n            type: object\n          status:\n            description: ActionSetStatus defines the observed state of ActionSet\n            properties:\n              message:\n                description: Provides a human-readable explanation detailing the reason\n                  for the current phase of the ActionSet.\n                type: string\n              observedGeneration:\n                description: Represents the generation number that has been observed\n                  by the controller.\n                format: int64\n                type: integer\n              phase:\n                description: Indicates the phase of the ActionSet. This can be either\n                  'Available' or 'Unavailable'.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: backuppolicies.dataprotection.kubeblocks.io\nspec:\n  group: dataprotection.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: BackupPolicy\n    listKind: BackupPolicyList\n    plural: backuppolicies\n    shortNames:\n    - bp\n    singular: backuppolicy\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .spec.backupRepoName\n      name: BACKUP-REPO\n      type: string\n    - jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: BackupPolicy is the Schema for the backuppolicies API.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: BackupPolicySpec defines the desired state of BackupPolicy\n            properties:\n              backoffLimit:\n                default: 2\n                description: Specifies the number of retries before marking the backup\n                  as failed.\n                format: int32\n                maximum: 10\n                minimum: 0\n                type: integer\n              backupMethods:\n                description: Defines the backup methods.\n                items:\n                  description: BackupMethod defines the backup method.\n                  properties:\n                    actionSetName:\n                      description: |-\n                        Refers to the ActionSet object that defines the backup actions.\n                        For volume snapshot backup, the actionSet is not required, the controller\n                        will use the CSI volume snapshotter to create the snapshot.\n                      type: string\n                    compatibleMethod:\n                      description: The name of the compatible full backup method,\n                        used by incremental backups.\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    env:\n                      description: Specifies the environment variables for the backup\n                        workload.\n                      items:\n                        description: EnvVar represents an environment variable present\n                          in a Container.\n                        properties:\n                          name:\n                            description: Name of the environment variable. Must be\n                              a C_IDENTIFIER.\n                            type: string\n                          value:\n                            description: |-\n                              Variable references $(VAR_NAME) are expanded\n                              using the previously defined environment variables in the container and\n                              any service environment variables. If a variable cannot be resolved,\n                              the reference in the input string will be unchanged. Double $$ are reduced\n                              to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                              \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                              Escaped references will never be expanded, regardless of whether the variable\n                              exists or not.\n                              Defaults to \"\".\n                            type: string\n                          valueFrom:\n                            description: Source for the environment variable's value.\n                              Cannot be used if value is not empty.\n                            properties:\n                              configMapKeyRef:\n                                description: Selects a key of a ConfigMap.\n                                properties:\n                                  key:\n                                    description: The key to select.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap or\n                                      its key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              fieldRef:\n                                description: |-\n                                  Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                  spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              secretKeyRef:\n                                description: Selects a key of a secret in the pod's\n                                  namespace\n                                properties:\n                                  key:\n                                    description: The key of the secret to select from.  Must\n                                      be a valid secret key.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret or its\n                                      key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    name:\n                      description: The name of backup method.\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    runtimeSettings:\n                      description: Specifies runtime settings for the backup workload\n                        container.\n                      properties:\n                        resources:\n                          description: |-\n                            Specifies the resource required by container.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                      type: object\n                    snapshotVolumes:\n                      default: false\n                      description: |-\n                        Specifies whether to take snapshots of persistent volumes. If true,\n                        the ActionSetName is not required, the controller will use the CSI volume\n                        snapshotter to create the snapshot.\n                      type: boolean\n                    target:\n                      description: Specifies the target information to back up, it\n                        will override the target in backup policy.\n                      properties:\n                        connectionCredential:\n                          description: Specifies the connection credential to connect\n                            to the target database cluster.\n                          properties:\n                            hostKey:\n                              description: Specifies the map key of the host in the\n                                connection credential secret.\n                              type: string\n                            passwordKey:\n                              default: password\n                              description: |-\n                                Specifies the map key of the password in the connection credential secret.\n                                This password will be saved in the backup annotation for full backup.\n                                You can use the environment variable DP_ENCRYPTION_KEY to specify encryption key.\n                              type: string\n                            portKey:\n                              description: Specifies the map key of the port in the\n                                connection credential secret.\n                              type: string\n                            secretName:\n                              description: Refers to the Secret object that contains\n                                the connection credential.\n                              pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                              type: string\n                            usernameKey:\n                              default: username\n                              description: Specifies the map key of the user in the\n                                connection credential secret.\n                              type: string\n                          required:\n                          - secretName\n                          type: object\n                        containerPort:\n                          description: |-\n                            Specifies the container port in the target pod.\n                            If not specified, the first container and its first port will be used.\n                          properties:\n                            containerName:\n                              description: Specifies the name of container with the\n                                port.\n                              type: string\n                            portName:\n                              description: Specifies the port name.\n                              type: string\n                          type: object\n                        name:\n                          description: |-\n                            Specifies a mandatory and unique identifier for each target when using the \"targets\" field.\n                            The backup data for the current target is stored in a uniquely named subdirectory.\n                          type: string\n                        podSelector:\n                          description: Used to find the target pod. The volumes of\n                            the target pod will be backed up.\n                          properties:\n                            fallbackLabelSelector:\n                              description: |-\n                                fallbackLabelSelector is used to filter available pods when the labelSelector fails.\n                                This only takes effect when the `strategy` field below is set to `Any`.\n                              properties:\n                                matchExpressions:\n                                  description: matchExpressions is a list of label\n                                    selector requirements. The requirements are ANDed.\n                                  items:\n                                    description: |-\n                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                      relates the key and values.\n                                    properties:\n                                      key:\n                                        description: key is the label key that the\n                                          selector applies to.\n                                        type: string\n                                      operator:\n                                        description: |-\n                                          operator represents a key's relationship to a set of values.\n                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                        type: string\n                                      values:\n                                        description: |-\n                                          values is an array of string values. If the operator is In or NotIn,\n                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                          the values array must be empty. This array is replaced during a strategic\n                                          merge patch.\n                                        items:\n                                          type: string\n                                        type: array\n                                    required:\n                                    - key\n                                    - operator\n                                    type: object\n                                  type: array\n                                matchLabels:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                  type: object\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                            strategy:\n                              default: Any\n                              description: |-\n                                Specifies the strategy to select the target pod when multiple pods are selected.\n                                Valid values are:\n\n\n                                - `Any`: select any one pod that match the labelsSelector.\n                                - `All`: select all pods that match the labelsSelector. The backup data for the current pod\n                                will be stored in a subdirectory named after the pod.\n                              enum:\n                              - Any\n                              - All\n                              type: string\n                            useParentSelectedPods:\n                              description: |-\n                                UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                                If set to true, the backup will use the same pods selected by the parent.\n                                And only takes effect when the 'strategy' is set to 'Any'.\n                              type: boolean\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        resources:\n                          description: Specifies the kubernetes resources to back\n                            up.\n                          properties:\n                            excluded:\n                              description: |-\n                                excluded is a slice of namespaced-scoped resource type names to exclude in\n                                the kubernetes resources.\n                                The default value is empty.\n                              items:\n                                type: string\n                              type: array\n                            included:\n                              description: |-\n                                included is a slice of namespaced-scoped resource type names to include in\n                                the kubernetes resources.\n                                The default value is empty.\n                              items:\n                                type: string\n                              type: array\n                            selector:\n                              description: |-\n                                A metav1.LabelSelector to filter the target kubernetes resources that need\n                                to be backed up. If not set, will do not back up any kubernetes resources.\n                              properties:\n                                matchExpressions:\n                                  description: matchExpressions is a list of label\n                                    selector requirements. The requirements are ANDed.\n                                  items:\n                                    description: |-\n                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                      relates the key and values.\n                                    properties:\n                                      key:\n                                        description: key is the label key that the\n                                          selector applies to.\n                                        type: string\n                                      operator:\n                                        description: |-\n                                          operator represents a key's relationship to a set of values.\n                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                        type: string\n                                      values:\n                                        description: |-\n                                          values is an array of string values. If the operator is In or NotIn,\n                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                          the values array must be empty. This array is replaced during a strategic\n                                          merge patch.\n                                        items:\n                                          type: string\n                                        type: array\n                                    required:\n                                    - key\n                                    - operator\n                                    type: object\n                                  type: array\n                                matchLabels:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                  type: object\n                              type: object\n                              x-kubernetes-map-type: atomic\n                          type: object\n                        serviceAccountName:\n                          description: Specifies the service account to run the backup\n                            workload.\n                          type: string\n                      type: object\n                    targetVolumes:\n                      description: Specifies which volumes from the target should\n                        be mounted in the backup workload.\n                      properties:\n                        volumeMounts:\n                          description: Specifies the mount for the volumes specified\n                            in `volumes` section.\n                          items:\n                            description: VolumeMount describes a mounting of a Volume\n                              within a container.\n                            properties:\n                              mountPath:\n                                description: |-\n                                  Path within the container at which the volume should be mounted.  Must\n                                  not contain ':'.\n                                type: string\n                              mountPropagation:\n                                description: |-\n                                  mountPropagation determines how mounts are propagated from the host\n                                  to container and the other way around.\n                                  When not set, MountPropagationNone is used.\n                                  This field is beta in 1.10.\n                                type: string\n                              name:\n                                description: This must match the Name of a Volume.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  Mounted read-only if true, read-write otherwise (false or unspecified).\n                                  Defaults to false.\n                                type: boolean\n                              subPath:\n                                description: |-\n                                  Path within the volume from which the container's volume should be mounted.\n                                  Defaults to \"\" (volume's root).\n                                type: string\n                              subPathExpr:\n                                description: |-\n                                  Expanded path within the volume from which the container's volume should be mounted.\n                                  Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                  Defaults to \"\" (volume's root).\n                                  SubPathExpr and SubPath are mutually exclusive.\n                                type: string\n                            required:\n                            - mountPath\n                            - name\n                            type: object\n                          type: array\n                        volumes:\n                          description: |-\n                            Specifies the list of volumes of targeted application that should be mounted\n                            on the backup workload.\n                          items:\n                            type: string\n                          type: array\n                      type: object\n                    targets:\n                      description: |-\n                        Specifies multiple target information for backup operations. This includes details\n                        such as the target pod and cluster connection credentials. All specified targets\n                        will be backed up collectively.\n                      items:\n                        properties:\n                          connectionCredential:\n                            description: Specifies the connection credential to connect\n                              to the target database cluster.\n                            properties:\n                              hostKey:\n                                description: Specifies the map key of the host in\n                                  the connection credential secret.\n                                type: string\n                              passwordKey:\n                                default: password\n                                description: |-\n                                  Specifies the map key of the password in the connection credential secret.\n                                  This password will be saved in the backup annotation for full backup.\n                                  You can use the environment variable DP_ENCRYPTION_KEY to specify encryption key.\n                                type: string\n                              portKey:\n                                description: Specifies the map key of the port in\n                                  the connection credential secret.\n                                type: string\n                              secretName:\n                                description: Refers to the Secret object that contains\n                                  the connection credential.\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                              usernameKey:\n                                default: username\n                                description: Specifies the map key of the user in\n                                  the connection credential secret.\n                                type: string\n                            required:\n                            - secretName\n                            type: object\n                          containerPort:\n                            description: |-\n                              Specifies the container port in the target pod.\n                              If not specified, the first container and its first port will be used.\n                            properties:\n                              containerName:\n                                description: Specifies the name of container with\n                                  the port.\n                                type: string\n                              portName:\n                                description: Specifies the port name.\n                                type: string\n                            type: object\n                          name:\n                            description: |-\n                              Specifies a mandatory and unique identifier for each target when using the \"targets\" field.\n                              The backup data for the current target is stored in a uniquely named subdirectory.\n                            type: string\n                          podSelector:\n                            description: Used to find the target pod. The volumes\n                              of the target pod will be backed up.\n                            properties:\n                              fallbackLabelSelector:\n                                description: |-\n                                  fallbackLabelSelector is used to filter available pods when the labelSelector fails.\n                                  This only takes effect when the `strategy` field below is set to `Any`.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              matchExpressions:\n                                description: matchExpressions is a list of label selector\n                                  requirements. The requirements are ANDed.\n                                items:\n                                  description: |-\n                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                    relates the key and values.\n                                  properties:\n                                    key:\n                                      description: key is the label key that the selector\n                                        applies to.\n                                      type: string\n                                    operator:\n                                      description: |-\n                                        operator represents a key's relationship to a set of values.\n                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                      type: string\n                                    values:\n                                      description: |-\n                                        values is an array of string values. If the operator is In or NotIn,\n                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                        the values array must be empty. This array is replaced during a strategic\n                                        merge patch.\n                                      items:\n                                        type: string\n                                      type: array\n                                  required:\n                                  - key\n                                  - operator\n                                  type: object\n                                type: array\n                              matchLabels:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                type: object\n                              strategy:\n                                default: Any\n                                description: |-\n                                  Specifies the strategy to select the target pod when multiple pods are selected.\n                                  Valid values are:\n\n\n                                  - `Any`: select any one pod that match the labelsSelector.\n                                  - `All`: select all pods that match the labelsSelector. The backup data for the current pod\n                                  will be stored in a subdirectory named after the pod.\n                                enum:\n                                - Any\n                                - All\n                                type: string\n                              useParentSelectedPods:\n                                description: |-\n                                  UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                                  If set to true, the backup will use the same pods selected by the parent.\n                                  And only takes effect when the 'strategy' is set to 'Any'.\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          resources:\n                            description: Specifies the kubernetes resources to back\n                              up.\n                            properties:\n                              excluded:\n                                description: |-\n                                  excluded is a slice of namespaced-scoped resource type names to exclude in\n                                  the kubernetes resources.\n                                  The default value is empty.\n                                items:\n                                  type: string\n                                type: array\n                              included:\n                                description: |-\n                                  included is a slice of namespaced-scoped resource type names to include in\n                                  the kubernetes resources.\n                                  The default value is empty.\n                                items:\n                                  type: string\n                                type: array\n                              selector:\n                                description: |-\n                                  A metav1.LabelSelector to filter the target kubernetes resources that need\n                                  to be backed up. If not set, will do not back up any kubernetes resources.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          serviceAccountName:\n                            description: Specifies the service account to run the\n                              backup workload.\n                            type: string\n                        type: object\n                      type: array\n                  required:\n                  - name\n                  type: object\n                type: array\n              backupRepoName:\n                description: |-\n                  Specifies the name of BackupRepo where the backup data will be stored.\n                  If not set, data will be stored in the default backup repository.\n                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                type: string\n              encryptionConfig:\n                description: |-\n                  Specifies the parameters for encrypting backup data.\n                  Encryption will be disabled if the field is not set.\n                properties:\n                  algorithm:\n                    default: AES-256-CFB\n                    description: |-\n                      Specifies the encryption algorithm. Currently supported algorithms are:\n\n\n                      - AES-128-CFB\n                      - AES-192-CFB\n                      - AES-256-CFB\n                    enum:\n                    - AES-128-CFB\n                    - AES-192-CFB\n                    - AES-256-CFB\n                    type: string\n                  passPhraseSecretKeyRef:\n                    description: |-\n                      Selects the key of a secret in the current namespace, the value of the secret\n                      is used as the encryption key.\n                    properties:\n                      key:\n                        description: The key of the secret to select from.  Must be\n                          a valid secret key.\n                        type: string\n                      name:\n                        description: |-\n                          Name of the referent.\n                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                          TODO: Add other useful fields. apiVersion, kind, uid?\n                        type: string\n                      optional:\n                        description: Specify whether the Secret or its key must be\n                          defined\n                        type: boolean\n                    required:\n                    - key\n                    type: object\n                    x-kubernetes-map-type: atomic\n                required:\n                - algorithm\n                - passPhraseSecretKeyRef\n                type: object\n              pathPrefix:\n                description: |-\n                  Specifies the directory inside the backup repository to store the backup.\n                  This path is relative to the path of the backup repository.\n                type: string\n              retentionPolicy:\n                description: Specifies the backup retention policy. This has a precedence\n                  over `backup.spec.retentionPeriod`.\n                enum:\n                - retainLatestBackup\n                - none\n                type: string\n              target:\n                description: |-\n                  Specifies the target information to back up, such as the target pod, the\n                  cluster connection credential.\n                properties:\n                  connectionCredential:\n                    description: Specifies the connection credential to connect to\n                      the target database cluster.\n                    properties:\n                      hostKey:\n                        description: Specifies the map key of the host in the connection\n                          credential secret.\n                        type: string\n                      passwordKey:\n                        default: password\n                        description: |-\n                          Specifies the map key of the password in the connection credential secret.\n                          This password will be saved in the backup annotation for full backup.\n                          You can use the environment variable DP_ENCRYPTION_KEY to specify encryption key.\n                        type: string\n                      portKey:\n                        description: Specifies the map key of the port in the connection\n                          credential secret.\n                        type: string\n                      secretName:\n                        description: Refers to the Secret object that contains the\n                          connection credential.\n                        pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                        type: string\n                      usernameKey:\n                        default: username\n                        description: Specifies the map key of the user in the connection\n                          credential secret.\n                        type: string\n                    required:\n                    - secretName\n                    type: object\n                  containerPort:\n                    description: |-\n                      Specifies the container port in the target pod.\n                      If not specified, the first container and its first port will be used.\n                    properties:\n                      containerName:\n                        description: Specifies the name of container with the port.\n                        type: string\n                      portName:\n                        description: Specifies the port name.\n                        type: string\n                    type: object\n                  name:\n                    description: |-\n                      Specifies a mandatory and unique identifier for each target when using the \"targets\" field.\n                      The backup data for the current target is stored in a uniquely named subdirectory.\n                    type: string\n                  podSelector:\n                    description: Used to find the target pod. The volumes of the target\n                      pod will be backed up.\n                    properties:\n                      fallbackLabelSelector:\n                        description: |-\n                          fallbackLabelSelector is used to filter available pods when the labelSelector fails.\n                          This only takes effect when the `strategy` field below is set to `Any`.\n                        properties:\n                          matchExpressions:\n                            description: matchExpressions is a list of label selector\n                              requirements. The requirements are ANDed.\n                            items:\n                              description: |-\n                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                relates the key and values.\n                              properties:\n                                key:\n                                  description: key is the label key that the selector\n                                    applies to.\n                                  type: string\n                                operator:\n                                  description: |-\n                                    operator represents a key's relationship to a set of values.\n                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                  type: string\n                                values:\n                                  description: |-\n                                    values is an array of string values. If the operator is In or NotIn,\n                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                    the values array must be empty. This array is replaced during a strategic\n                                    merge patch.\n                                  items:\n                                    type: string\n                                  type: array\n                              required:\n                              - key\n                              - operator\n                              type: object\n                            type: array\n                          matchLabels:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                            type: object\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      matchExpressions:\n                        description: matchExpressions is a list of label selector\n                          requirements. The requirements are ANDed.\n                        items:\n                          description: |-\n                            A label selector requirement is a selector that contains values, a key, and an operator that\n                            relates the key and values.\n                          properties:\n                            key:\n                              description: key is the label key that the selector\n                                applies to.\n                              type: string\n                            operator:\n                              description: |-\n                                operator represents a key's relationship to a set of values.\n                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                              type: string\n                            values:\n                              description: |-\n                                values is an array of string values. If the operator is In or NotIn,\n                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                the values array must be empty. This array is replaced during a strategic\n                                merge patch.\n                              items:\n                                type: string\n                              type: array\n                          required:\n                          - key\n                          - operator\n                          type: object\n                        type: array\n                      matchLabels:\n                        additionalProperties:\n                          type: string\n                        description: |-\n                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                        type: object\n                      strategy:\n                        default: Any\n                        description: |-\n                          Specifies the strategy to select the target pod when multiple pods are selected.\n                          Valid values are:\n\n\n                          - `Any`: select any one pod that match the labelsSelector.\n                          - `All`: select all pods that match the labelsSelector. The backup data for the current pod\n                          will be stored in a subdirectory named after the pod.\n                        enum:\n                        - Any\n                        - All\n                        type: string\n                      useParentSelectedPods:\n                        description: |-\n                          UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                          If set to true, the backup will use the same pods selected by the parent.\n                          And only takes effect when the 'strategy' is set to 'Any'.\n                        type: boolean\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  resources:\n                    description: Specifies the kubernetes resources to back up.\n                    properties:\n                      excluded:\n                        description: |-\n                          excluded is a slice of namespaced-scoped resource type names to exclude in\n                          the kubernetes resources.\n                          The default value is empty.\n                        items:\n                          type: string\n                        type: array\n                      included:\n                        description: |-\n                          included is a slice of namespaced-scoped resource type names to include in\n                          the kubernetes resources.\n                          The default value is empty.\n                        items:\n                          type: string\n                        type: array\n                      selector:\n                        description: |-\n                          A metav1.LabelSelector to filter the target kubernetes resources that need\n                          to be backed up. If not set, will do not back up any kubernetes resources.\n                        properties:\n                          matchExpressions:\n                            description: matchExpressions is a list of label selector\n                              requirements. The requirements are ANDed.\n                            items:\n                              description: |-\n                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                relates the key and values.\n                              properties:\n                                key:\n                                  description: key is the label key that the selector\n                                    applies to.\n                                  type: string\n                                operator:\n                                  description: |-\n                                    operator represents a key's relationship to a set of values.\n                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                  type: string\n                                values:\n                                  description: |-\n                                    values is an array of string values. If the operator is In or NotIn,\n                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                    the values array must be empty. This array is replaced during a strategic\n                                    merge patch.\n                                  items:\n                                    type: string\n                                  type: array\n                              required:\n                              - key\n                              - operator\n                              type: object\n                            type: array\n                          matchLabels:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                            type: object\n                        type: object\n                        x-kubernetes-map-type: atomic\n                    type: object\n                  serviceAccountName:\n                    description: Specifies the service account to run the backup workload.\n                    type: string\n                type: object\n              targets:\n                description: |-\n                  Specifies multiple target information for backup operations. This includes details\n                  such as the target pod and cluster connection credentials. All specified targets\n                  will be backed up collectively.\n                  optional\n                items:\n                  properties:\n                    connectionCredential:\n                      description: Specifies the connection credential to connect\n                        to the target database cluster.\n                      properties:\n                        hostKey:\n                          description: Specifies the map key of the host in the connection\n                            credential secret.\n                          type: string\n                        passwordKey:\n                          default: password\n                          description: |-\n                            Specifies the map key of the password in the connection credential secret.\n                            This password will be saved in the backup annotation for full backup.\n                            You can use the environment variable DP_ENCRYPTION_KEY to specify encryption key.\n                          type: string\n                        portKey:\n                          description: Specifies the map key of the port in the connection\n                            credential secret.\n                          type: string\n                        secretName:\n                          description: Refers to the Secret object that contains the\n                            connection credential.\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                        usernameKey:\n                          default: username\n                          description: Specifies the map key of the user in the connection\n                            credential secret.\n                          type: string\n                      required:\n                      - secretName\n                      type: object\n                    containerPort:\n                      description: |-\n                        Specifies the container port in the target pod.\n                        If not specified, the first container and its first port will be used.\n                      properties:\n                        containerName:\n                          description: Specifies the name of container with the port.\n                          type: string\n                        portName:\n                          description: Specifies the port name.\n                          type: string\n                      type: object\n                    name:\n                      description: |-\n                        Specifies a mandatory and unique identifier for each target when using the \"targets\" field.\n                        The backup data for the current target is stored in a uniquely named subdirectory.\n                      type: string\n                    podSelector:\n                      description: Used to find the target pod. The volumes of the\n                        target pod will be backed up.\n                      properties:\n                        fallbackLabelSelector:\n                          description: |-\n                            fallbackLabelSelector is used to filter available pods when the labelSelector fails.\n                            This only takes effect when the `strategy` field below is set to `Any`.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        matchExpressions:\n                          description: matchExpressions is a list of label selector\n                            requirements. The requirements are ANDed.\n                          items:\n                            description: |-\n                              A label selector requirement is a selector that contains values, a key, and an operator that\n                              relates the key and values.\n                            properties:\n                              key:\n                                description: key is the label key that the selector\n                                  applies to.\n                                type: string\n                              operator:\n                                description: |-\n                                  operator represents a key's relationship to a set of values.\n                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                type: string\n                              values:\n                                description: |-\n                                  values is an array of string values. If the operator is In or NotIn,\n                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                  the values array must be empty. This array is replaced during a strategic\n                                  merge patch.\n                                items:\n                                  type: string\n                                type: array\n                            required:\n                            - key\n                            - operator\n                            type: object\n                          type: array\n                        matchLabels:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                          type: object\n                        strategy:\n                          default: Any\n                          description: |-\n                            Specifies the strategy to select the target pod when multiple pods are selected.\n                            Valid values are:\n\n\n                            - `Any`: select any one pod that match the labelsSelector.\n                            - `All`: select all pods that match the labelsSelector. The backup data for the current pod\n                            will be stored in a subdirectory named after the pod.\n                          enum:\n                          - Any\n                          - All\n                          type: string\n                        useParentSelectedPods:\n                          description: |-\n                            UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                            If set to true, the backup will use the same pods selected by the parent.\n                            And only takes effect when the 'strategy' is set to 'Any'.\n                          type: boolean\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    resources:\n                      description: Specifies the kubernetes resources to back up.\n                      properties:\n                        excluded:\n                          description: |-\n                            excluded is a slice of namespaced-scoped resource type names to exclude in\n                            the kubernetes resources.\n                            The default value is empty.\n                          items:\n                            type: string\n                          type: array\n                        included:\n                          description: |-\n                            included is a slice of namespaced-scoped resource type names to include in\n                            the kubernetes resources.\n                            The default value is empty.\n                          items:\n                            type: string\n                          type: array\n                        selector:\n                          description: |-\n                            A metav1.LabelSelector to filter the target kubernetes resources that need\n                            to be backed up. If not set, will do not back up any kubernetes resources.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                      type: object\n                    serviceAccountName:\n                      description: Specifies the service account to run the backup\n                        workload.\n                      type: string\n                  type: object\n                type: array\n              useKopia:\n                default: false\n                description: |-\n                  Specifies whether backup data should be stored in a Kopia repository.\n\n\n                  Data within the Kopia repository is both compressed and encrypted. Furthermore,\n                  data deduplication is implemented across various backups of the same cluster.\n                  This approach significantly reduces the actual storage usage, particularly\n                  for clusters with a low update frequency.\n\n\n                  NOTE: This feature should NOT be enabled when using KubeBlocks Community Edition, otherwise the backup will not be processed.\n                type: boolean\n            required:\n            - backupMethods\n            type: object\n            x-kubernetes-validations:\n            - message: either spec.target or spec.targets\n              rule: (has(self.target) && !has(self.targets)) || (has(self.targets)\n                && !has(self.target))\n          status:\n            description: BackupPolicyStatus defines the observed state of BackupPolicy\n            properties:\n              message:\n                description: |-\n                  A human-readable message indicating details about why the BackupPolicy\n                  is in this phase.\n                type: string\n              observedGeneration:\n                description: |-\n                  ObservedGeneration is the most recent generation observed for this BackupPolicy.\n                  It refers to the BackupPolicy's generation, which is updated on mutation by the API Server.\n                format: int64\n                type: integer\n              phase:\n                description: Phase - in list of [Available,Unavailable]\n                enum:\n                - Available\n                - Unavailable\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: backuppolicytemplates.dataprotection.kubeblocks.io\nspec:\n  group: dataprotection.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: BackupPolicyTemplate\n    listKind: BackupPolicyTemplateList\n    plural: backuppolicytemplates\n    shortNames:\n    - bpt\n    singular: backuppolicytemplate\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: service kind of the backupPolicyTemplate.\n      jsonPath: .spec.serviceKind\n      name: SERVICE-KIND\n      type: string\n    - jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          BackupPolicyTemplate should be provided by addon developers.\n          It is responsible for generating BackupPolicies for the addon that requires backup operations,\n          also determining the suitable backup methods and strategies.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Defines the desired state of the BackupPolicyTemplate.\n            properties:\n              backoffLimit:\n                default: 2\n                description: Specifies the maximum number of retry attempts for a\n                  backup before it is considered a failure.\n                format: int32\n                maximum: 10\n                minimum: 0\n                type: integer\n              backupMethods:\n                description: Defines an array of BackupMethods to be used.\n                items:\n                  properties:\n                    actionSetName:\n                      description: |-\n                        Refers to the ActionSet object that defines the backup actions.\n                        For volume snapshot backup, the actionSet is not required, the controller\n                        will use the CSI volume snapshotter to create the snapshot.\n                      type: string\n                    compatibleMethod:\n                      description: The name of the compatible full backup method,\n                        used by incremental backups.\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    env:\n                      description: Specifies the environment variables for the backup\n                        workload.\n                      items:\n                        properties:\n                          name:\n                            description: Specifies the environment variable key.\n                            type: string\n                          value:\n                            description: Specifies the environment variable value.\n                            type: string\n                          valueFrom:\n                            description: |-\n                              Specifies the source used to determine the value of the environment variable.\n                              Cannot be used if value is not empty.\n                            properties:\n                              versionMapping:\n                                description: Determine the appropriate version of\n                                  the backup tool image from service version.\n                                items:\n                                  properties:\n                                    mappedValue:\n                                      description: |-\n                                        Specifies a mapping value based on service version.\n                                        Typically used to set up the tools image required for backup operations.\n                                      type: string\n                                    serviceVersions:\n                                      description: |-\n                                        Represents an array of the service version that can be mapped to the appropriate value.\n                                        Each name in the list can represent an exact name, a name prefix, or a regular expression pattern.\n\n\n                                        For example:\n\n\n                                        - \"8.0.33\": Matches the exact name \"8.0.33\"\n                                        - \"8.0\": Matches all names starting with \"8.0\"\n                                        - \"^8.0.\\d{1,2}$\": Matches all names starting with \"8.0.\" followed by one or two digits.\n                                      items:\n                                        type: string\n                                      type: array\n                                  required:\n                                  - mappedValue\n                                  - serviceVersions\n                                  type: object\n                                type: array\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    name:\n                      description: The name of backup method.\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    runtimeSettings:\n                      description: Specifies runtime settings for the backup workload\n                        container.\n                      properties:\n                        resources:\n                          description: |-\n                            Specifies the resource required by container.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/\n                          properties:\n                            claims:\n                              description: |-\n                                Claims lists the names of resources, defined in spec.resourceClaims,\n                                that are used by this container.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable. It can only be set for containers.\n                              items:\n                                description: ResourceClaim references one entry in\n                                  PodSpec.ResourceClaims.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name must match the name of one entry in pod.spec.resourceClaims of\n                                      the Pod where this field is used. It makes that resource available\n                                      inside a container.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                      type: object\n                    snapshotVolumes:\n                      default: false\n                      description: |-\n                        Specifies whether to take snapshots of persistent volumes. If true,\n                        the ActionSetName is not required, the controller will use the CSI volume\n                        snapshotter to create the snapshot.\n                      type: boolean\n                    target:\n                      description: |-\n                        If set, specifies the method for selecting the replica to be backed up using the criteria defined here.\n                        If this field is not set, the selection method specified in `backupPolicy.target` is used.\n\n\n                        This field provides a way to override the global `backupPolicy.target` setting for specific BackupMethod.\n                      properties:\n                        account:\n                          description: |-\n                            If `backupPolicy.componentDefs` is set, this field is required to specify the system account name.\n                            This account must match one listed in `componentDefinition.spec.systemAccounts[*].name`.\n                            The corresponding secret created by this account is used to connect to the database.\n                          type: string\n                        containerPort:\n                          description: |-\n                            Specifies the container port in the target pod.\n                            If not specified, the first container and its first port will be used.\n                          properties:\n                            containerName:\n                              description: Specifies the name of container with the\n                                port.\n                              type: string\n                            portName:\n                              description: Specifies the port name.\n                              type: string\n                          type: object\n                        fallbackRole:\n                          description: |-\n                            Specifies the fallback role to select one replica for backup, this only takes effect when the\n                            `strategy` field below is set to `Any`.\n                          type: string\n                        role:\n                          description: |-\n                            Specifies the role to select one or more replicas for backup.\n\n\n                            - If no replica with the specified role exists, the backup task will fail.\n                              Special case: If there is only one replica in the cluster, it will be used for backup,\n                              even if its role differs from the specified one.\n                              For example, if you specify backing up on a secondary replica, but the cluster is single-node\n                              with only one primary replica, the primary will be used for backup.\n                              Future versions will address this special case using role priorities.\n                            - If multiple replicas satisfy the specified role, the choice (`Any` or `All`) will be made according to\n                              the `strategy` field below.\n                          type: string\n                        strategy:\n                          description: |-\n                            Specifies the PodSelectionStrategy to use when multiple pods are\n                            selected for the backup target.\n                            Valid values are:\n\n\n                            - Any: Selects any one pod that matches the labelsSelector.\n                            - All: Selects all pods that match the labelsSelector.\n                          enum:\n                          - Any\n                          - All\n                          type: string\n                        useParentSelectedPods:\n                          description: |-\n                            UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                            If set to true, the backup will use the same pods selected by the parent.\n                            And only takes effect when the 'strategy' is set to 'Any'.\n                          type: boolean\n                      required:\n                      - role\n                      type: object\n                    targetVolumes:\n                      description: Specifies which volumes from the target should\n                        be mounted in the backup workload.\n                      properties:\n                        volumeMounts:\n                          description: Specifies the mount for the volumes specified\n                            in `volumes` section.\n                          items:\n                            description: VolumeMount describes a mounting of a Volume\n                              within a container.\n                            properties:\n                              mountPath:\n                                description: |-\n                                  Path within the container at which the volume should be mounted.  Must\n                                  not contain ':'.\n                                type: string\n                              mountPropagation:\n                                description: |-\n                                  mountPropagation determines how mounts are propagated from the host\n                                  to container and the other way around.\n                                  When not set, MountPropagationNone is used.\n                                  This field is beta in 1.10.\n                                type: string\n                              name:\n                                description: This must match the Name of a Volume.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  Mounted read-only if true, read-write otherwise (false or unspecified).\n                                  Defaults to false.\n                                type: boolean\n                              subPath:\n                                description: |-\n                                  Path within the volume from which the container's volume should be mounted.\n                                  Defaults to \"\" (volume's root).\n                                type: string\n                              subPathExpr:\n                                description: |-\n                                  Expanded path within the volume from which the container's volume should be mounted.\n                                  Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                  Defaults to \"\" (volume's root).\n                                  SubPathExpr and SubPath are mutually exclusive.\n                                type: string\n                            required:\n                            - mountPath\n                            - name\n                            type: object\n                          type: array\n                        volumes:\n                          description: |-\n                            Specifies the list of volumes of targeted application that should be mounted\n                            on the backup workload.\n                          items:\n                            type: string\n                          type: array\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n              compDefs:\n                description: |-\n                  CompDefs specifies names for the component definitions associated with this BackupPolicyTemplate.\n                  Each name in the list can represent an exact name, a name prefix, or a regular expression pattern.\n\n\n                  For example:\n\n\n                  - \"mysql-8.0.30-v1alpha1\": Matches the exact name \"mysql-8.0.30-v1alpha1\"\n                  - \"mysql-8.0.30\": Matches all names starting with \"mysql-8.0.30\"\n                  - \"^mysql-8.0.\\d{1,2}$\": Matches all names starting with \"mysql-8.0.\" followed by one or two digits.\n                items:\n                  type: string\n                maxItems: 128\n                minItems: 1\n                type: array\n              retentionPolicy:\n                description: Defines the backup retention policy to be used.\n                enum:\n                - retainLatestBackup\n                - none\n                type: string\n              schedules:\n                description: |-\n                  Defines the execution plans for backup tasks, specifying when and how backups should occur,\n                  and the retention period of backup files.\n                items:\n                  properties:\n                    backupMethod:\n                      description: Specifies the backup method name that is defined\n                        in backupPolicy.\n                      type: string\n                    cronExpression:\n                      description: |-\n                        Specifies the cron expression for the schedule. The timezone is in UTC.\n                        see https://en.wikipedia.org/wiki/Cron.\n                      type: string\n                    enabled:\n                      description: Specifies whether the backup schedule is enabled\n                        or not.\n                      type: boolean\n                    name:\n                      description: |-\n                        Specifies the name of the schedule. Names cannot be duplicated.\n                        If the name is empty, it will be considered the same as the value of the backupMethod below.\n                      type: string\n                    parameters:\n                      description: |-\n                        Specifies a list of name-value pairs representing parameters and their corresponding values.\n                        Parameters match the schema specified in the `actionset.spec.parametersSchema`\n                      items:\n                        properties:\n                          name:\n                            description: Represents the name of the parameter.\n                            type: string\n                          value:\n                            description: Represents the parameter values.\n                            type: string\n                        required:\n                        - name\n                        - value\n                        type: object\n                      maxItems: 128\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    retentionPeriod:\n                      default: 7d\n                      description: \"Determines the duration for which the backup should\n                        be kept.\\nKubeBlocks will remove all backups that are older\n                        than the RetentionPeriod.\\nFor example, RetentionPeriod of\n                        `30d` will keep only the backups of last 30 days.\\nSample\n                        duration format:\\n\\n\\n- years: \\t2y\\n- months: \\t6mo\\n- days:\n                        \\t\\t30d\\n- hours: \\t12h\\n- minutes: \\t30m\\n\\n\\nYou can also\n                        combine the above durations. For example: 30d12h30m\"\n                      type: string\n                  required:\n                  - backupMethod\n                  - cronExpression\n                  type: object\n                type: array\n              serviceKind:\n                description: |-\n                  Defines the type of well-known service protocol that the BackupPolicyTemplate provides, and it is optional.\n                  Some examples of well-known service protocols include:\n\n\n                  - \"MySQL\": Indicates that the Component provides a MySQL database service.\n                  - \"PostgreSQL\": Indicates that the Component offers a PostgreSQL database service.\n                  - \"Redis\": Signifies that the Component functions as a Redis key-value store.\n                  - \"ETCD\": Denotes that the Component serves as an ETCD distributed key-value store\n                maxLength: 32\n                type: string\n              target:\n                description: |-\n                  Defines the selection criteria of instance to be backed up, and the connection credential to be used\n                  during the backup process.\n                properties:\n                  account:\n                    description: |-\n                      If `backupPolicy.componentDefs` is set, this field is required to specify the system account name.\n                      This account must match one listed in `componentDefinition.spec.systemAccounts[*].name`.\n                      The corresponding secret created by this account is used to connect to the database.\n                    type: string\n                  containerPort:\n                    description: |-\n                      Specifies the container port in the target pod.\n                      If not specified, the first container and its first port will be used.\n                    properties:\n                      containerName:\n                        description: Specifies the name of container with the port.\n                        type: string\n                      portName:\n                        description: Specifies the port name.\n                        type: string\n                    type: object\n                  fallbackRole:\n                    description: |-\n                      Specifies the fallback role to select one replica for backup, this only takes effect when the\n                      `strategy` field below is set to `Any`.\n                    type: string\n                  role:\n                    description: |-\n                      Specifies the role to select one or more replicas for backup.\n\n\n                      - If no replica with the specified role exists, the backup task will fail.\n                        Special case: If there is only one replica in the cluster, it will be used for backup,\n                        even if its role differs from the specified one.\n                        For example, if you specify backing up on a secondary replica, but the cluster is single-node\n                        with only one primary replica, the primary will be used for backup.\n                        Future versions will address this special case using role priorities.\n                      - If multiple replicas satisfy the specified role, the choice (`Any` or `All`) will be made according to\n                        the `strategy` field below.\n                    type: string\n                  strategy:\n                    description: |-\n                      Specifies the PodSelectionStrategy to use when multiple pods are\n                      selected for the backup target.\n                      Valid values are:\n\n\n                      - Any: Selects any one pod that matches the labelsSelector.\n                      - All: Selects all pods that match the labelsSelector.\n                    enum:\n                    - Any\n                    - All\n                    type: string\n                  useParentSelectedPods:\n                    description: |-\n                      UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                      If set to true, the backup will use the same pods selected by the parent.\n                      And only takes effect when the 'strategy' is set to 'Any'.\n                    type: boolean\n                required:\n                - role\n                type: object\n            required:\n            - backupMethods\n            type: object\n          status:\n            description: Populated by the system, it represents the current information\n              about the BackupPolicyTemplate.\n            properties:\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: Represents the most recent generation observed for this\n                  BackupPolicyTemplate.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Specifies the current phase of the BackupPolicyTemplate. Valid values are `empty`, `Available`, `Unavailable`.\n                  When `Available`, the BackupPolicyTemplate is ready and can be referenced by related objects.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: backuprepos.dataprotection.kubeblocks.io\nspec:\n  group: dataprotection.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: BackupRepo\n    listKind: BackupRepoList\n    plural: backuprepos\n    singular: backuprepo\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .spec.storageProviderRef\n      name: STORAGEPROVIDER\n      type: string\n    - jsonPath: .spec.accessMethod\n      name: ACCESSMETHOD\n      type: string\n    - jsonPath: .status.isDefault\n      name: DEFAULT\n      type: boolean\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: BackupRepo is a repository for storing backup data.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: BackupRepoSpec defines the desired state of `BackupRepo`.\n            properties:\n              accessMethod:\n                default: Mount\n                description: Specifies the access method of the backup repository.\n                enum:\n                - Mount\n                - Tool\n                type: string\n              config:\n                additionalProperties:\n                  type: string\n                description: Stores the non-secret configuration parameters for the\n                  `StorageProvider`.\n                type: object\n              credential:\n                description: References to the secret that holds the credentials for\n                  the `StorageProvider`.\n                properties:\n                  name:\n                    description: name is unique within a namespace to reference a\n                      secret resource.\n                    type: string\n                  namespace:\n                    description: namespace defines the space within which the secret\n                      name must be unique.\n                    type: string\n                type: object\n                x-kubernetes-map-type: atomic\n              pathPrefix:\n                description: Specifies the prefix of the path for storing backup data.\n                pattern: ^([a-zA-Z0-9-_]+/?)*$\n                type: string\n              pvReclaimPolicy:\n                description: Specifies reclaim policy of the PV created by this backup\n                  repository.\n                enum:\n                - Delete\n                - Retain\n                type: string\n              storageProviderRef:\n                description: Specifies the name of the `StorageProvider` used by this\n                  backup repository.\n                type: string\n                x-kubernetes-validations:\n                - message: StorageProviderRef is immutable\n                  rule: self == oldSelf\n              volumeCapacity:\n                anyOf:\n                - type: integer\n                - type: string\n                description: Specifies the capacity of the PVC created by this backup\n                  repository.\n                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                x-kubernetes-int-or-string: true\n            required:\n            - pvReclaimPolicy\n            - storageProviderRef\n            type: object\n          status:\n            description: BackupRepoStatus defines the observed state of `BackupRepo`.\n            properties:\n              backupPVCName:\n                description: Represents the name of the PVC that stores backup data.\n                type: string\n              conditions:\n                description: Provides a detailed description of the current state\n                  of the backup repository.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n              generatedCSIDriverSecret:\n                description: Refers to the generated secret for the `StorageProvider`.\n                properties:\n                  name:\n                    description: name is unique within a namespace to reference a\n                      secret resource.\n                    type: string\n                  namespace:\n                    description: namespace defines the space within which the secret\n                      name must be unique.\n                    type: string\n                type: object\n                x-kubernetes-map-type: atomic\n              generatedStorageClassName:\n                description: Represents the name of the generated storage class.\n                type: string\n              isDefault:\n                description: Indicates if this backup repository is the default one.\\\n                type: boolean\n              observedGeneration:\n                description: Represents the latest generation of the resource that\n                  the controller has observed.\n                format: int64\n                type: integer\n              phase:\n                allOf:\n                - enum:\n                  - PreChecking\n                  - Failed\n                  - Ready\n                  - Deleting\n                - enum:\n                  - PreChecking\n                  - Failed\n                  - Ready\n                  - Deleting\n                description: |-\n                  Represents the current phase of reconciliation for the backup repository.\n                  Permissible values are PreChecking, Failed, Ready, Deleting.\n                type: string\n              toolConfigSecretName:\n                description: Represents the name of the secret that contains the configuration\n                  for the tool.\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: backups.dataprotection.kubeblocks.io\nspec:\n  group: dataprotection.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: Backup\n    listKind: BackupList\n    plural: backups\n    singular: backup\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .spec.backupPolicyName\n      name: POLICY\n      type: string\n    - jsonPath: .spec.backupMethod\n      name: METHOD\n      type: string\n    - jsonPath: .status.backupRepoName\n      name: REPO\n      type: string\n    - jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .status.totalSize\n      name: TOTAL-SIZE\n      type: string\n    - jsonPath: .status.duration\n      name: DURATION\n      type: string\n    - jsonPath: .spec.deletionPolicy\n      name: DELETION-POLICY\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: CREATION-TIME\n      type: string\n    - jsonPath: .status.completionTimestamp\n      name: COMPLETION-TIME\n      type: string\n    - jsonPath: .status.expiration\n      name: EXPIRATION-TIME\n      type: string\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: Backup is the Schema for the backups API.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: BackupSpec defines the desired state of Backup.\n            properties:\n              backupMethod:\n                description: Specifies the backup method name that is defined in the\n                  backup policy.\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.backupMethod\n                  rule: self == oldSelf\n              backupPolicyName:\n                description: Specifies the backup policy to be applied for this backup.\n                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.backupPolicyName\n                  rule: self == oldSelf\n              deletionPolicy:\n                allOf:\n                - enum:\n                  - Delete\n                  - Retain\n                - enum:\n                  - Delete\n                  - Retain\n                default: Delete\n                description: |-\n                  Determines whether the backup contents stored in the backup repository\n                  should be deleted when the backup custom resource(CR) is deleted.\n                  Supported values are `Retain` and `Delete`.\n\n\n                  - `Retain` means that the backup content and its physical snapshot on backup repository are kept.\n                  - `Delete` means that the backup content and its physical snapshot on backup repository are deleted.\n\n\n                  TODO: for the retain policy, we should support in the future for only deleting\n                    the backup CR but retaining the backup contents in backup repository.\n                    The current implementation only prevent accidental deletion of backup data.\n                type: string\n              parameters:\n                description: |-\n                  Specifies a list of name-value pairs representing parameters and their corresponding values.\n                  Parameters match the schema specified in the `actionset.spec.parametersSchema`\n                items:\n                  properties:\n                    name:\n                      description: Represents the name of the parameter.\n                      type: string\n                    value:\n                      description: Represents the parameter values.\n                      type: string\n                  required:\n                  - name\n                  - value\n                  type: object\n                maxItems: 128\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n                x-kubernetes-validations:\n                - message: forbidden to update spec.parameters\n                  rule: self == oldSelf\n              parentBackupName:\n                description: Determines the parent backup name for incremental or\n                  differential backup.\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.parentBackupName\n                  rule: self == oldSelf\n              retentionPeriod:\n                description: \"Determines a duration up to which the backup should\n                  be kept.\\nController will remove all backups that are older than\n                  the RetentionPeriod.\\nIf not set, the backup will be kept forever.\\nFor\n                  example, RetentionPeriod of `30d` will keep only the backups of\n                  last 30 days.\\nSample duration format:\\n\\n\\n- years: \\t2y\\n- months:\n                  \\t6mo\\n- days: \\t\\t30d\\n- hours: \\t12h\\n- minutes: \\t30m\\n\\n\\nYou\n                  can also combine the above durations. For example: 30d12h30m.\"\n                type: string\n            required:\n            - backupMethod\n            - backupPolicyName\n            type: object\n            x-kubernetes-validations:\n            - message: forbidden to update spec.parameters\n              rule: has(oldSelf.parameters) == has(self.parameters)\n          status:\n            description: BackupStatus defines the observed state of Backup.\n            properties:\n              actions:\n                description: Records the actions status for this backup.\n                items:\n                  properties:\n                    actionType:\n                      description: The type of the action.\n                      type: string\n                    availableReplicas:\n                      description: Available replicas for statefulSet action.\n                      format: int32\n                      type: integer\n                    completionTimestamp:\n                      description: Records the time an action was completed.\n                      format: date-time\n                      type: string\n                    failureReason:\n                      description: An error that caused the action to fail.\n                      type: string\n                    name:\n                      description: The name of the action.\n                      type: string\n                    objectRef:\n                      description: The object reference for the action.\n                      properties:\n                        apiVersion:\n                          description: API version of the referent.\n                          type: string\n                        fieldPath:\n                          description: |-\n                            If referring to a piece of an object instead of an entire object, this string\n                            should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].\n                            For example, if the object reference is to a container within a pod, this would take on a value like:\n                            \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered\n                            the event) or if no container name is specified \"spec.containers[2]\" (container with\n                            index 2 in this pod). This syntax is chosen only to have some well-defined way of\n                            referencing a part of an object.\n                            TODO: this design is not final and this field is subject to change in the future.\n                          type: string\n                        kind:\n                          description: |-\n                            Kind of the referent.\n                            More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                          type: string\n                        name:\n                          description: |-\n                            Name of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                          type: string\n                        namespace:\n                          description: |-\n                            Namespace of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n                          type: string\n                        resourceVersion:\n                          description: |-\n                            Specific resourceVersion to which this reference is made, if any.\n                            More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency\n                          type: string\n                        uid:\n                          description: |-\n                            UID of the referent.\n                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids\n                          type: string\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    phase:\n                      description: The current phase of the action.\n                      type: string\n                    startTimestamp:\n                      description: Records the time an action was started.\n                      format: date-time\n                      type: string\n                    targetPodName:\n                      description: Records the target pod name which has been backed\n                        up.\n                      type: string\n                    timeRange:\n                      description: |-\n                        Records the time range of backed up data, for PITR, this is the time\n                        range of recoverable data.\n                      properties:\n                        end:\n                          description: Records the end time of the backup, in Coordinated\n                            Universal Time (UTC).\n                          format: date-time\n                          type: string\n                        start:\n                          description: Records the start time of the backup, in Coordinated\n                            Universal Time (UTC).\n                          format: date-time\n                          type: string\n                        timeZone:\n                          description: time zone, supports only zone offset, with\n                            a value range of \"-12:59 ~ +13:00\".\n                          pattern: ^(\\+|\\-)(0[0-9]|1[0-3]):([0-5][0-9])$\n                          type: string\n                      type: object\n                    totalSize:\n                      description: |-\n                        The total size of backed up data size.\n                        A string with capacity units in the format of \"1Gi\", \"1Mi\", \"1Ki\".\n                        If no capacity unit is specified, it is assumed to be in bytes.\n                      type: string\n                    volumeSnapshots:\n                      description: Records the volume snapshot status for the action.\n                      items:\n                        properties:\n                          contentName:\n                            description: The name of the volume snapshot content.\n                            type: string\n                          name:\n                            description: The name of the volume snapshot.\n                            type: string\n                          size:\n                            description: The size of the volume snapshot.\n                            type: string\n                          targetName:\n                            description: Associates this volumeSnapshot with its corresponding\n                              target.\n                            type: string\n                          volumeName:\n                            description: The name of the volume.\n                            type: string\n                        type: object\n                      type: array\n                  type: object\n                type: array\n              backupMethod:\n                description: |-\n                  Records the backup method information for this backup.\n                  Refer to BackupMethod for more details.\n                properties:\n                  actionSetName:\n                    description: |-\n                      Refers to the ActionSet object that defines the backup actions.\n                      For volume snapshot backup, the actionSet is not required, the controller\n                      will use the CSI volume snapshotter to create the snapshot.\n                    type: string\n                  compatibleMethod:\n                    description: The name of the compatible full backup method, used\n                      by incremental backups.\n                    pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                    type: string\n                  env:\n                    description: Specifies the environment variables for the backup\n                      workload.\n                    items:\n                      description: EnvVar represents an environment variable present\n                        in a Container.\n                      properties:\n                        name:\n                          description: Name of the environment variable. Must be a\n                            C_IDENTIFIER.\n                          type: string\n                        value:\n                          description: |-\n                            Variable references $(VAR_NAME) are expanded\n                            using the previously defined environment variables in the container and\n                            any service environment variables. If a variable cannot be resolved,\n                            the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                            \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                            Escaped references will never be expanded, regardless of whether the variable\n                            exists or not.\n                            Defaults to \"\".\n                          type: string\n                        valueFrom:\n                          description: Source for the environment variable's value.\n                            Cannot be used if value is not empty.\n                          properties:\n                            configMapKeyRef:\n                              description: Selects a key of a ConfigMap.\n                              properties:\n                                key:\n                                  description: The key to select.\n                                  type: string\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                                optional:\n                                  description: Specify whether the ConfigMap or its\n                                    key must be defined\n                                  type: boolean\n                              required:\n                              - key\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            fieldRef:\n                              description: |-\n                                Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                              properties:\n                                apiVersion:\n                                  description: Version of the schema the FieldPath\n                                    is written in terms of, defaults to \"v1\".\n                                  type: string\n                                fieldPath:\n                                  description: Path of the field to select in the\n                                    specified API version.\n                                  type: string\n                              required:\n                              - fieldPath\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            resourceFieldRef:\n                              description: |-\n                                Selects a resource of the container: only resources limits and requests\n                                (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                              properties:\n                                containerName:\n                                  description: 'Container name: required for volumes,\n                                    optional for env vars'\n                                  type: string\n                                divisor:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: Specifies the output format of the\n                                    exposed resources, defaults to \"1\"\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                resource:\n                                  description: 'Required: resource to select'\n                                  type: string\n                              required:\n                              - resource\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            secretKeyRef:\n                              description: Selects a key of a secret in the pod's\n                                namespace\n                              properties:\n                                key:\n                                  description: The key of the secret to select from.  Must\n                                    be a valid secret key.\n                                  type: string\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                                optional:\n                                  description: Specify whether the Secret or its key\n                                    must be defined\n                                  type: boolean\n                              required:\n                              - key\n                              type: object\n                              x-kubernetes-map-type: atomic\n                          type: object\n                      required:\n                      - name\n                      type: object\n                    type: array\n                  name:\n                    description: The name of backup method.\n                    pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                    type: string\n                  runtimeSettings:\n                    description: Specifies runtime settings for the backup workload\n                      container.\n                    properties:\n                      resources:\n                        description: |-\n                          Specifies the resource required by container.\n                          More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/\n                        properties:\n                          claims:\n                            description: |-\n                              Claims lists the names of resources, defined in spec.resourceClaims,\n                              that are used by this container.\n\n\n                              This is an alpha field and requires enabling the\n                              DynamicResourceAllocation feature gate.\n\n\n                              This field is immutable. It can only be set for containers.\n                            items:\n                              description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name must match the name of one entry in pod.spec.resourceClaims of\n                                    the Pod where this field is used. It makes that resource available\n                                    inside a container.\n                                  type: string\n                              required:\n                              - name\n                              type: object\n                            type: array\n                            x-kubernetes-list-map-keys:\n                            - name\n                            x-kubernetes-list-type: map\n                          limits:\n                            additionalProperties:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                            description: |-\n                              Limits describes the maximum amount of compute resources allowed.\n                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                            type: object\n                          requests:\n                            additionalProperties:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                            description: |-\n                              Requests describes the minimum amount of compute resources required.\n                              If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                              otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                            type: object\n                        type: object\n                    type: object\n                  snapshotVolumes:\n                    default: false\n                    description: |-\n                      Specifies whether to take snapshots of persistent volumes. If true,\n                      the ActionSetName is not required, the controller will use the CSI volume\n                      snapshotter to create the snapshot.\n                    type: boolean\n                  target:\n                    description: Specifies the target information to back up, it will\n                      override the target in backup policy.\n                    properties:\n                      connectionCredential:\n                        description: Specifies the connection credential to connect\n                          to the target database cluster.\n                        properties:\n                          hostKey:\n                            description: Specifies the map key of the host in the\n                              connection credential secret.\n                            type: string\n                          passwordKey:\n                            default: password\n                            description: |-\n                              Specifies the map key of the password in the connection credential secret.\n                              This password will be saved in the backup annotation for full backup.\n                              You can use the environment variable DP_ENCRYPTION_KEY to specify encryption key.\n                            type: string\n                          portKey:\n                            description: Specifies the map key of the port in the\n                              connection credential secret.\n                            type: string\n                          secretName:\n                            description: Refers to the Secret object that contains\n                              the connection credential.\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          usernameKey:\n                            default: username\n                            description: Specifies the map key of the user in the\n                              connection credential secret.\n                            type: string\n                        required:\n                        - secretName\n                        type: object\n                      containerPort:\n                        description: |-\n                          Specifies the container port in the target pod.\n                          If not specified, the first container and its first port will be used.\n                        properties:\n                          containerName:\n                            description: Specifies the name of container with the\n                              port.\n                            type: string\n                          portName:\n                            description: Specifies the port name.\n                            type: string\n                        type: object\n                      name:\n                        description: |-\n                          Specifies a mandatory and unique identifier for each target when using the \"targets\" field.\n                          The backup data for the current target is stored in a uniquely named subdirectory.\n                        type: string\n                      podSelector:\n                        description: Used to find the target pod. The volumes of the\n                          target pod will be backed up.\n                        properties:\n                          fallbackLabelSelector:\n                            description: |-\n                              fallbackLabelSelector is used to filter available pods when the labelSelector fails.\n                              This only takes effect when the `strategy` field below is set to `Any`.\n                            properties:\n                              matchExpressions:\n                                description: matchExpressions is a list of label selector\n                                  requirements. The requirements are ANDed.\n                                items:\n                                  description: |-\n                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                    relates the key and values.\n                                  properties:\n                                    key:\n                                      description: key is the label key that the selector\n                                        applies to.\n                                      type: string\n                                    operator:\n                                      description: |-\n                                        operator represents a key's relationship to a set of values.\n                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                      type: string\n                                    values:\n                                      description: |-\n                                        values is an array of string values. If the operator is In or NotIn,\n                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                        the values array must be empty. This array is replaced during a strategic\n                                        merge patch.\n                                      items:\n                                        type: string\n                                      type: array\n                                  required:\n                                  - key\n                                  - operator\n                                  type: object\n                                type: array\n                              matchLabels:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                type: object\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          matchExpressions:\n                            description: matchExpressions is a list of label selector\n                              requirements. The requirements are ANDed.\n                            items:\n                              description: |-\n                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                relates the key and values.\n                              properties:\n                                key:\n                                  description: key is the label key that the selector\n                                    applies to.\n                                  type: string\n                                operator:\n                                  description: |-\n                                    operator represents a key's relationship to a set of values.\n                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                  type: string\n                                values:\n                                  description: |-\n                                    values is an array of string values. If the operator is In or NotIn,\n                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                    the values array must be empty. This array is replaced during a strategic\n                                    merge patch.\n                                  items:\n                                    type: string\n                                  type: array\n                              required:\n                              - key\n                              - operator\n                              type: object\n                            type: array\n                          matchLabels:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                            type: object\n                          strategy:\n                            default: Any\n                            description: |-\n                              Specifies the strategy to select the target pod when multiple pods are selected.\n                              Valid values are:\n\n\n                              - `Any`: select any one pod that match the labelsSelector.\n                              - `All`: select all pods that match the labelsSelector. The backup data for the current pod\n                              will be stored in a subdirectory named after the pod.\n                            enum:\n                            - Any\n                            - All\n                            type: string\n                          useParentSelectedPods:\n                            description: |-\n                              UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                              If set to true, the backup will use the same pods selected by the parent.\n                              And only takes effect when the 'strategy' is set to 'Any'.\n                            type: boolean\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      resources:\n                        description: Specifies the kubernetes resources to back up.\n                        properties:\n                          excluded:\n                            description: |-\n                              excluded is a slice of namespaced-scoped resource type names to exclude in\n                              the kubernetes resources.\n                              The default value is empty.\n                            items:\n                              type: string\n                            type: array\n                          included:\n                            description: |-\n                              included is a slice of namespaced-scoped resource type names to include in\n                              the kubernetes resources.\n                              The default value is empty.\n                            items:\n                              type: string\n                            type: array\n                          selector:\n                            description: |-\n                              A metav1.LabelSelector to filter the target kubernetes resources that need\n                              to be backed up. If not set, will do not back up any kubernetes resources.\n                            properties:\n                              matchExpressions:\n                                description: matchExpressions is a list of label selector\n                                  requirements. The requirements are ANDed.\n                                items:\n                                  description: |-\n                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                    relates the key and values.\n                                  properties:\n                                    key:\n                                      description: key is the label key that the selector\n                                        applies to.\n                                      type: string\n                                    operator:\n                                      description: |-\n                                        operator represents a key's relationship to a set of values.\n                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                      type: string\n                                    values:\n                                      description: |-\n                                        values is an array of string values. If the operator is In or NotIn,\n                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                        the values array must be empty. This array is replaced during a strategic\n                                        merge patch.\n                                      items:\n                                        type: string\n                                      type: array\n                                  required:\n                                  - key\n                                  - operator\n                                  type: object\n                                type: array\n                              matchLabels:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                type: object\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                      serviceAccountName:\n                        description: Specifies the service account to run the backup\n                          workload.\n                        type: string\n                    type: object\n                  targetVolumes:\n                    description: Specifies which volumes from the target should be\n                      mounted in the backup workload.\n                    properties:\n                      volumeMounts:\n                        description: Specifies the mount for the volumes specified\n                          in `volumes` section.\n                        items:\n                          description: VolumeMount describes a mounting of a Volume\n                            within a container.\n                          properties:\n                            mountPath:\n                              description: |-\n                                Path within the container at which the volume should be mounted.  Must\n                                not contain ':'.\n                              type: string\n                            mountPropagation:\n                              description: |-\n                                mountPropagation determines how mounts are propagated from the host\n                                to container and the other way around.\n                                When not set, MountPropagationNone is used.\n                                This field is beta in 1.10.\n                              type: string\n                            name:\n                              description: This must match the Name of a Volume.\n                              type: string\n                            readOnly:\n                              description: |-\n                                Mounted read-only if true, read-write otherwise (false or unspecified).\n                                Defaults to false.\n                              type: boolean\n                            subPath:\n                              description: |-\n                                Path within the volume from which the container's volume should be mounted.\n                                Defaults to \"\" (volume's root).\n                              type: string\n                            subPathExpr:\n                              description: |-\n                                Expanded path within the volume from which the container's volume should be mounted.\n                                Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                Defaults to \"\" (volume's root).\n                                SubPathExpr and SubPath are mutually exclusive.\n                              type: string\n                          required:\n                          - mountPath\n                          - name\n                          type: object\n                        type: array\n                      volumes:\n                        description: |-\n                          Specifies the list of volumes of targeted application that should be mounted\n                          on the backup workload.\n                        items:\n                          type: string\n                        type: array\n                    type: object\n                  targets:\n                    description: |-\n                      Specifies multiple target information for backup operations. This includes details\n                      such as the target pod and cluster connection credentials. All specified targets\n                      will be backed up collectively.\n                    items:\n                      properties:\n                        connectionCredential:\n                          description: Specifies the connection credential to connect\n                            to the target database cluster.\n                          properties:\n                            hostKey:\n                              description: Specifies the map key of the host in the\n                                connection credential secret.\n                              type: string\n                            passwordKey:\n                              default: password\n                              description: |-\n                                Specifies the map key of the password in the connection credential secret.\n                                This password will be saved in the backup annotation for full backup.\n                                You can use the environment variable DP_ENCRYPTION_KEY to specify encryption key.\n                              type: string\n                            portKey:\n                              description: Specifies the map key of the port in the\n                                connection credential secret.\n                              type: string\n                            secretName:\n                              description: Refers to the Secret object that contains\n                                the connection credential.\n                              pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                              type: string\n                            usernameKey:\n                              default: username\n                              description: Specifies the map key of the user in the\n                                connection credential secret.\n                              type: string\n                          required:\n                          - secretName\n                          type: object\n                        containerPort:\n                          description: |-\n                            Specifies the container port in the target pod.\n                            If not specified, the first container and its first port will be used.\n                          properties:\n                            containerName:\n                              description: Specifies the name of container with the\n                                port.\n                              type: string\n                            portName:\n                              description: Specifies the port name.\n                              type: string\n                          type: object\n                        name:\n                          description: |-\n                            Specifies a mandatory and unique identifier for each target when using the \"targets\" field.\n                            The backup data for the current target is stored in a uniquely named subdirectory.\n                          type: string\n                        podSelector:\n                          description: Used to find the target pod. The volumes of\n                            the target pod will be backed up.\n                          properties:\n                            fallbackLabelSelector:\n                              description: |-\n                                fallbackLabelSelector is used to filter available pods when the labelSelector fails.\n                                This only takes effect when the `strategy` field below is set to `Any`.\n                              properties:\n                                matchExpressions:\n                                  description: matchExpressions is a list of label\n                                    selector requirements. The requirements are ANDed.\n                                  items:\n                                    description: |-\n                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                      relates the key and values.\n                                    properties:\n                                      key:\n                                        description: key is the label key that the\n                                          selector applies to.\n                                        type: string\n                                      operator:\n                                        description: |-\n                                          operator represents a key's relationship to a set of values.\n                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                        type: string\n                                      values:\n                                        description: |-\n                                          values is an array of string values. If the operator is In or NotIn,\n                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                          the values array must be empty. This array is replaced during a strategic\n                                          merge patch.\n                                        items:\n                                          type: string\n                                        type: array\n                                    required:\n                                    - key\n                                    - operator\n                                    type: object\n                                  type: array\n                                matchLabels:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                  type: object\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                            strategy:\n                              default: Any\n                              description: |-\n                                Specifies the strategy to select the target pod when multiple pods are selected.\n                                Valid values are:\n\n\n                                - `Any`: select any one pod that match the labelsSelector.\n                                - `All`: select all pods that match the labelsSelector. The backup data for the current pod\n                                will be stored in a subdirectory named after the pod.\n                              enum:\n                              - Any\n                              - All\n                              type: string\n                            useParentSelectedPods:\n                              description: |-\n                                UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                                If set to true, the backup will use the same pods selected by the parent.\n                                And only takes effect when the 'strategy' is set to 'Any'.\n                              type: boolean\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        resources:\n                          description: Specifies the kubernetes resources to back\n                            up.\n                          properties:\n                            excluded:\n                              description: |-\n                                excluded is a slice of namespaced-scoped resource type names to exclude in\n                                the kubernetes resources.\n                                The default value is empty.\n                              items:\n                                type: string\n                              type: array\n                            included:\n                              description: |-\n                                included is a slice of namespaced-scoped resource type names to include in\n                                the kubernetes resources.\n                                The default value is empty.\n                              items:\n                                type: string\n                              type: array\n                            selector:\n                              description: |-\n                                A metav1.LabelSelector to filter the target kubernetes resources that need\n                                to be backed up. If not set, will do not back up any kubernetes resources.\n                              properties:\n                                matchExpressions:\n                                  description: matchExpressions is a list of label\n                                    selector requirements. The requirements are ANDed.\n                                  items:\n                                    description: |-\n                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                      relates the key and values.\n                                    properties:\n                                      key:\n                                        description: key is the label key that the\n                                          selector applies to.\n                                        type: string\n                                      operator:\n                                        description: |-\n                                          operator represents a key's relationship to a set of values.\n                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                        type: string\n                                      values:\n                                        description: |-\n                                          values is an array of string values. If the operator is In or NotIn,\n                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                          the values array must be empty. This array is replaced during a strategic\n                                          merge patch.\n                                        items:\n                                          type: string\n                                        type: array\n                                    required:\n                                    - key\n                                    - operator\n                                    type: object\n                                  type: array\n                                matchLabels:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                  type: object\n                              type: object\n                              x-kubernetes-map-type: atomic\n                          type: object\n                        serviceAccountName:\n                          description: Specifies the service account to run the backup\n                            workload.\n                          type: string\n                      type: object\n                    type: array\n                required:\n                - name\n                type: object\n              backupRepoName:\n                description: The name of the backup repository.\n                type: string\n              baseBackupName:\n                description: |-\n                  Records the base full backup name for incremental backup or differential backup.\n                  When the base backup is deleted, the backup will also be deleted.\n                type: string\n              completionTimestamp:\n                description: |-\n                  Records the time when the backup operation was completed.\n                  This timestamp is recorded even if the backup operation fails.\n                  The server's time is used for this timestamp.\n                format: date-time\n                type: string\n              duration:\n                description: |-\n                  Records the duration of the backup operation.\n                  When converted to a string, the format is \"1h2m0.5s\".\n                type: string\n              encryptionConfig:\n                description: Records the encryption config for this backup.\n                properties:\n                  algorithm:\n                    default: AES-256-CFB\n                    description: |-\n                      Specifies the encryption algorithm. Currently supported algorithms are:\n\n\n                      - AES-128-CFB\n                      - AES-192-CFB\n                      - AES-256-CFB\n                    enum:\n                    - AES-128-CFB\n                    - AES-192-CFB\n                    - AES-256-CFB\n                    type: string\n                  passPhraseSecretKeyRef:\n                    description: |-\n                      Selects the key of a secret in the current namespace, the value of the secret\n                      is used as the encryption key.\n                    properties:\n                      key:\n                        description: The key of the secret to select from.  Must be\n                          a valid secret key.\n                        type: string\n                      name:\n                        description: |-\n                          Name of the referent.\n                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                          TODO: Add other useful fields. apiVersion, kind, uid?\n                        type: string\n                      optional:\n                        description: Specify whether the Secret or its key must be\n                          defined\n                        type: boolean\n                    required:\n                    - key\n                    type: object\n                    x-kubernetes-map-type: atomic\n                required:\n                - algorithm\n                - passPhraseSecretKeyRef\n                type: object\n              expiration:\n                description: |-\n                  Indicates when this backup becomes eligible for garbage collection.\n                  A 'null' value implies that the backup will not be cleaned up unless manually deleted.\n                format: date-time\n                type: string\n              extras:\n                description: Records any additional information for the backup.\n                items:\n                  additionalProperties:\n                    type: string\n                  type: object\n                type: array\n              failureReason:\n                description: Any error that caused the backup operation to fail.\n                type: string\n              formatVersion:\n                description: Specifies the backup format version, which includes major,\n                  minor, and patch versions.\n                type: string\n              kopiaRepoPath:\n                description: Records the path of the Kopia repository.\n                type: string\n              parentBackupName:\n                description: |-\n                  Records the parent backup name for incremental or differential backup.\n                  When the parent backup is deleted, the backup will also be deleted.\n                type: string\n              path:\n                description: |-\n                  The directory within the backup repository where the backup data is stored.\n                  This is an absolute path within the backup repository.\n                type: string\n              persistentVolumeClaimName:\n                description: Records the name of the persistent volume claim used\n                  to store the backup data.\n                type: string\n              phase:\n                description: Indicates the current state of the backup operation.\n                enum:\n                - New\n                - InProgress\n                - Running\n                - Completed\n                - Failed\n                - Deleting\n                type: string\n              startTimestamp:\n                description: |-\n                  Records the time when the backup operation was started.\n                  The server's time is used for this timestamp.\n                format: date-time\n                type: string\n              target:\n                description: Records the target information for this backup.\n                properties:\n                  connectionCredential:\n                    description: Specifies the connection credential to connect to\n                      the target database cluster.\n                    properties:\n                      hostKey:\n                        description: Specifies the map key of the host in the connection\n                          credential secret.\n                        type: string\n                      passwordKey:\n                        default: password\n                        description: |-\n                          Specifies the map key of the password in the connection credential secret.\n                          This password will be saved in the backup annotation for full backup.\n                          You can use the environment variable DP_ENCRYPTION_KEY to specify encryption key.\n                        type: string\n                      portKey:\n                        description: Specifies the map key of the port in the connection\n                          credential secret.\n                        type: string\n                      secretName:\n                        description: Refers to the Secret object that contains the\n                          connection credential.\n                        pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                        type: string\n                      usernameKey:\n                        default: username\n                        description: Specifies the map key of the user in the connection\n                          credential secret.\n                        type: string\n                    required:\n                    - secretName\n                    type: object\n                  containerPort:\n                    description: |-\n                      Specifies the container port in the target pod.\n                      If not specified, the first container and its first port will be used.\n                    properties:\n                      containerName:\n                        description: Specifies the name of container with the port.\n                        type: string\n                      portName:\n                        description: Specifies the port name.\n                        type: string\n                    type: object\n                  name:\n                    description: |-\n                      Specifies a mandatory and unique identifier for each target when using the \"targets\" field.\n                      The backup data for the current target is stored in a uniquely named subdirectory.\n                    type: string\n                  podSelector:\n                    description: Used to find the target pod. The volumes of the target\n                      pod will be backed up.\n                    properties:\n                      fallbackLabelSelector:\n                        description: |-\n                          fallbackLabelSelector is used to filter available pods when the labelSelector fails.\n                          This only takes effect when the `strategy` field below is set to `Any`.\n                        properties:\n                          matchExpressions:\n                            description: matchExpressions is a list of label selector\n                              requirements. The requirements are ANDed.\n                            items:\n                              description: |-\n                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                relates the key and values.\n                              properties:\n                                key:\n                                  description: key is the label key that the selector\n                                    applies to.\n                                  type: string\n                                operator:\n                                  description: |-\n                                    operator represents a key's relationship to a set of values.\n                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                  type: string\n                                values:\n                                  description: |-\n                                    values is an array of string values. If the operator is In or NotIn,\n                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                    the values array must be empty. This array is replaced during a strategic\n                                    merge patch.\n                                  items:\n                                    type: string\n                                  type: array\n                              required:\n                              - key\n                              - operator\n                              type: object\n                            type: array\n                          matchLabels:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                            type: object\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      matchExpressions:\n                        description: matchExpressions is a list of label selector\n                          requirements. The requirements are ANDed.\n                        items:\n                          description: |-\n                            A label selector requirement is a selector that contains values, a key, and an operator that\n                            relates the key and values.\n                          properties:\n                            key:\n                              description: key is the label key that the selector\n                                applies to.\n                              type: string\n                            operator:\n                              description: |-\n                                operator represents a key's relationship to a set of values.\n                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                              type: string\n                            values:\n                              description: |-\n                                values is an array of string values. If the operator is In or NotIn,\n                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                the values array must be empty. This array is replaced during a strategic\n                                merge patch.\n                              items:\n                                type: string\n                              type: array\n                          required:\n                          - key\n                          - operator\n                          type: object\n                        type: array\n                      matchLabels:\n                        additionalProperties:\n                          type: string\n                        description: |-\n                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                        type: object\n                      strategy:\n                        default: Any\n                        description: |-\n                          Specifies the strategy to select the target pod when multiple pods are selected.\n                          Valid values are:\n\n\n                          - `Any`: select any one pod that match the labelsSelector.\n                          - `All`: select all pods that match the labelsSelector. The backup data for the current pod\n                          will be stored in a subdirectory named after the pod.\n                        enum:\n                        - Any\n                        - All\n                        type: string\n                      useParentSelectedPods:\n                        description: |-\n                          UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                          If set to true, the backup will use the same pods selected by the parent.\n                          And only takes effect when the 'strategy' is set to 'Any'.\n                        type: boolean\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  resources:\n                    description: Specifies the kubernetes resources to back up.\n                    properties:\n                      excluded:\n                        description: |-\n                          excluded is a slice of namespaced-scoped resource type names to exclude in\n                          the kubernetes resources.\n                          The default value is empty.\n                        items:\n                          type: string\n                        type: array\n                      included:\n                        description: |-\n                          included is a slice of namespaced-scoped resource type names to include in\n                          the kubernetes resources.\n                          The default value is empty.\n                        items:\n                          type: string\n                        type: array\n                      selector:\n                        description: |-\n                          A metav1.LabelSelector to filter the target kubernetes resources that need\n                          to be backed up. If not set, will do not back up any kubernetes resources.\n                        properties:\n                          matchExpressions:\n                            description: matchExpressions is a list of label selector\n                              requirements. The requirements are ANDed.\n                            items:\n                              description: |-\n                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                relates the key and values.\n                              properties:\n                                key:\n                                  description: key is the label key that the selector\n                                    applies to.\n                                  type: string\n                                operator:\n                                  description: |-\n                                    operator represents a key's relationship to a set of values.\n                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                  type: string\n                                values:\n                                  description: |-\n                                    values is an array of string values. If the operator is In or NotIn,\n                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                    the values array must be empty. This array is replaced during a strategic\n                                    merge patch.\n                                  items:\n                                    type: string\n                                  type: array\n                              required:\n                              - key\n                              - operator\n                              type: object\n                            type: array\n                          matchLabels:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                            type: object\n                        type: object\n                        x-kubernetes-map-type: atomic\n                    type: object\n                  selectedTargetPods:\n                    description: Records the selected pods by the target info during\n                      backup.\n                    items:\n                      type: string\n                    type: array\n                  serviceAccountName:\n                    description: Specifies the service account to run the backup workload.\n                    type: string\n                type: object\n              targets:\n                description: Records the targets information for this backup.\n                items:\n                  properties:\n                    connectionCredential:\n                      description: Specifies the connection credential to connect\n                        to the target database cluster.\n                      properties:\n                        hostKey:\n                          description: Specifies the map key of the host in the connection\n                            credential secret.\n                          type: string\n                        passwordKey:\n                          default: password\n                          description: |-\n                            Specifies the map key of the password in the connection credential secret.\n                            This password will be saved in the backup annotation for full backup.\n                            You can use the environment variable DP_ENCRYPTION_KEY to specify encryption key.\n                          type: string\n                        portKey:\n                          description: Specifies the map key of the port in the connection\n                            credential secret.\n                          type: string\n                        secretName:\n                          description: Refers to the Secret object that contains the\n                            connection credential.\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                        usernameKey:\n                          default: username\n                          description: Specifies the map key of the user in the connection\n                            credential secret.\n                          type: string\n                      required:\n                      - secretName\n                      type: object\n                    containerPort:\n                      description: |-\n                        Specifies the container port in the target pod.\n                        If not specified, the first container and its first port will be used.\n                      properties:\n                        containerName:\n                          description: Specifies the name of container with the port.\n                          type: string\n                        portName:\n                          description: Specifies the port name.\n                          type: string\n                      type: object\n                    name:\n                      description: |-\n                        Specifies a mandatory and unique identifier for each target when using the \"targets\" field.\n                        The backup data for the current target is stored in a uniquely named subdirectory.\n                      type: string\n                    podSelector:\n                      description: Used to find the target pod. The volumes of the\n                        target pod will be backed up.\n                      properties:\n                        fallbackLabelSelector:\n                          description: |-\n                            fallbackLabelSelector is used to filter available pods when the labelSelector fails.\n                            This only takes effect when the `strategy` field below is set to `Any`.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        matchExpressions:\n                          description: matchExpressions is a list of label selector\n                            requirements. The requirements are ANDed.\n                          items:\n                            description: |-\n                              A label selector requirement is a selector that contains values, a key, and an operator that\n                              relates the key and values.\n                            properties:\n                              key:\n                                description: key is the label key that the selector\n                                  applies to.\n                                type: string\n                              operator:\n                                description: |-\n                                  operator represents a key's relationship to a set of values.\n                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                type: string\n                              values:\n                                description: |-\n                                  values is an array of string values. If the operator is In or NotIn,\n                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                  the values array must be empty. This array is replaced during a strategic\n                                  merge patch.\n                                items:\n                                  type: string\n                                type: array\n                            required:\n                            - key\n                            - operator\n                            type: object\n                          type: array\n                        matchLabels:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                          type: object\n                        strategy:\n                          default: Any\n                          description: |-\n                            Specifies the strategy to select the target pod when multiple pods are selected.\n                            Valid values are:\n\n\n                            - `Any`: select any one pod that match the labelsSelector.\n                            - `All`: select all pods that match the labelsSelector. The backup data for the current pod\n                            will be stored in a subdirectory named after the pod.\n                          enum:\n                          - Any\n                          - All\n                          type: string\n                        useParentSelectedPods:\n                          description: |-\n                            UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                            If set to true, the backup will use the same pods selected by the parent.\n                            And only takes effect when the 'strategy' is set to 'Any'.\n                          type: boolean\n                      type: object\n                      x-kubernetes-map-type: atomic\n                    resources:\n                      description: Specifies the kubernetes resources to back up.\n                      properties:\n                        excluded:\n                          description: |-\n                            excluded is a slice of namespaced-scoped resource type names to exclude in\n                            the kubernetes resources.\n                            The default value is empty.\n                          items:\n                            type: string\n                          type: array\n                        included:\n                          description: |-\n                            included is a slice of namespaced-scoped resource type names to include in\n                            the kubernetes resources.\n                            The default value is empty.\n                          items:\n                            type: string\n                          type: array\n                        selector:\n                          description: |-\n                            A metav1.LabelSelector to filter the target kubernetes resources that need\n                            to be backed up. If not set, will do not back up any kubernetes resources.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                      type: object\n                    selectedTargetPods:\n                      description: Records the selected pods by the target info during\n                        backup.\n                      items:\n                        type: string\n                      type: array\n                    serviceAccountName:\n                      description: Specifies the service account to run the backup\n                        workload.\n                      type: string\n                  type: object\n                type: array\n              timeRange:\n                description: |-\n                  Records the time range of the data backed up. For Point-in-Time Recovery (PITR),\n                  this is the time range of recoverable data.\n                properties:\n                  end:\n                    description: Records the end time of the backup, in Coordinated\n                      Universal Time (UTC).\n                    format: date-time\n                    type: string\n                  start:\n                    description: Records the start time of the backup, in Coordinated\n                      Universal Time (UTC).\n                    format: date-time\n                    type: string\n                  timeZone:\n                    description: time zone, supports only zone offset, with a value\n                      range of \"-12:59 ~ +13:00\".\n                    pattern: ^(\\+|\\-)(0[0-9]|1[0-3]):([0-5][0-9])$\n                    type: string\n                type: object\n              totalSize:\n                description: |-\n                  Records the total size of the data backed up.\n                  The size is represented as a string with capacity units in the format of \"1Gi\", \"1Mi\", \"1Ki\".\n                  If no capacity unit is specified, it is assumed to be in bytes.\n                type: string\n              volumeSnapshots:\n                description: Records the volume snapshot status for the action.\n                items:\n                  properties:\n                    contentName:\n                      description: The name of the volume snapshot content.\n                      type: string\n                    name:\n                      description: The name of the volume snapshot.\n                      type: string\n                    size:\n                      description: The size of the volume snapshot.\n                      type: string\n                    targetName:\n                      description: Associates this volumeSnapshot with its corresponding\n                        target.\n                      type: string\n                    volumeName:\n                      description: The name of the volume.\n                      type: string\n                  type: object\n                type: array\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: backupschedules.dataprotection.kubeblocks.io\nspec:\n  group: dataprotection.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: BackupSchedule\n    listKind: BackupScheduleList\n    plural: backupschedules\n    shortNames:\n    - bs\n    singular: backupschedule\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: BackupSchedule is the Schema for the backupschedules API.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: BackupScheduleSpec defines the desired state of BackupSchedule.\n            properties:\n              backupPolicyName:\n                description: Specifies the backupPolicy to be applied for the `schedules`.\n                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                type: string\n              schedules:\n                description: Defines the list of backup schedules.\n                items:\n                  properties:\n                    backupMethod:\n                      description: Specifies the backup method name that is defined\n                        in backupPolicy.\n                      type: string\n                    cronExpression:\n                      description: |-\n                        Specifies the cron expression for the schedule. The timezone is in UTC.\n                        see https://en.wikipedia.org/wiki/Cron.\n                      type: string\n                    enabled:\n                      description: Specifies whether the backup schedule is enabled\n                        or not.\n                      type: boolean\n                    name:\n                      description: |-\n                        Specifies the name of the schedule. Names cannot be duplicated.\n                        If the name is empty, it will be considered the same as the value of the backupMethod below.\n                      type: string\n                    parameters:\n                      description: |-\n                        Specifies a list of name-value pairs representing parameters and their corresponding values.\n                        Parameters match the schema specified in the `actionset.spec.parametersSchema`\n                      items:\n                        properties:\n                          name:\n                            description: Represents the name of the parameter.\n                            type: string\n                          value:\n                            description: Represents the parameter values.\n                            type: string\n                        required:\n                        - name\n                        - value\n                        type: object\n                      maxItems: 128\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    retentionPeriod:\n                      default: 7d\n                      description: \"Determines the duration for which the backup should\n                        be kept.\\nKubeBlocks will remove all backups that are older\n                        than the RetentionPeriod.\\nFor example, RetentionPeriod of\n                        `30d` will keep only the backups of last 30 days.\\nSample\n                        duration format:\\n\\n\\n- years: \\t2y\\n- months: \\t6mo\\n- days:\n                        \\t\\t30d\\n- hours: \\t12h\\n- minutes: \\t30m\\n\\n\\nYou can also\n                        combine the above durations. For example: 30d12h30m\"\n                      type: string\n                  required:\n                  - backupMethod\n                  - cronExpression\n                  type: object\n                minItems: 1\n                type: array\n              startingDeadlineMinutes:\n                description: |-\n                  Defines the deadline in minutes for starting the backup workload if it\n                  misses its scheduled time for any reason.\n                format: int64\n                maximum: 1440\n                minimum: 0\n                type: integer\n            required:\n            - backupPolicyName\n            - schedules\n            type: object\n          status:\n            description: BackupScheduleStatus defines the observed state of BackupSchedule.\n            properties:\n              failureReason:\n                description: Represents an error that caused the backup to fail.\n                type: string\n              observedGeneration:\n                description: |-\n                  Represents the most recent generation observed for this BackupSchedule.\n                  It refers to the BackupSchedule's generation, which is updated on mutation\n                  by the API Server.\n                format: int64\n                type: integer\n              phase:\n                description: Describes the phase of the BackupSchedule.\n                type: string\n              schedules:\n                additionalProperties:\n                  description: ScheduleStatus represents the status of each schedule.\n                  properties:\n                    failureReason:\n                      description: Represents an error that caused the backup to fail.\n                      type: string\n                    lastScheduleTime:\n                      description: Records the last time the backup was scheduled.\n                      format: date-time\n                      type: string\n                    lastSuccessfulTime:\n                      description: Records the last time the backup was successfully\n                        completed.\n                      format: date-time\n                      type: string\n                    phase:\n                      description: Describes the phase of the schedule.\n                      type: string\n                  type: object\n                description: Describes the status of each schedule.\n                type: object\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: restores.dataprotection.kubeblocks.io\nspec:\n  group: dataprotection.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: Restore\n    listKind: RestoreList\n    plural: restores\n    singular: restore\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .spec.backup.name\n      name: BACKUP\n      type: string\n    - description: Point in time for restoring\n      jsonPath: .spec.restoreTime\n      name: RESTORE-TIME\n      type: string\n    - description: Restore Status.\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .status.duration\n      name: DURATION\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: CREATION-TIME\n      type: string\n    - jsonPath: .status.completionTimestamp\n      name: COMPLETION-TIME\n      type: string\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: Restore is the Schema for the restores API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: RestoreSpec defines the desired state of Restore\n            properties:\n              backoffLimit:\n                description: Specifies the number of retries before marking the restore\n                  failed.\n                format: int32\n                maximum: 10\n                minimum: 0\n                type: integer\n              backup:\n                description: |-\n                  Specifies the backup to be restored. The restore behavior is based on the backup type:\n\n\n                  1. Full: will be restored the full backup directly.\n                  2. Incremental: will be restored sequentially from the most recent full backup of this incremental backup.\n                  3. Differential: will be restored sequentially from the parent backup of the differential backup.\n                  4. Continuous: will find the most recent full backup at this time point and the continuous backups after it to restore.\n                properties:\n                  name:\n                    description: Specifies the backup name.\n                    type: string\n                  namespace:\n                    description: Specifies the backup namespace.\n                    type: string\n                  sourceTargetName:\n                    description: Specifies the source target for restoration, identified\n                      by its name.\n                    type: string\n                required:\n                - name\n                - namespace\n                type: object\n                x-kubernetes-validations:\n                - message: forbidden to update spec.backupName\n                  rule: self == oldSelf\n              containerResources:\n                description: Specifies the required resources of restore job's container.\n                properties:\n                  claims:\n                    description: |-\n                      Claims lists the names of resources, defined in spec.resourceClaims,\n                      that are used by this container.\n\n\n                      This is an alpha field and requires enabling the\n                      DynamicResourceAllocation feature gate.\n\n\n                      This field is immutable. It can only be set for containers.\n                    items:\n                      description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                      properties:\n                        name:\n                          description: |-\n                            Name must match the name of one entry in pod.spec.resourceClaims of\n                            the Pod where this field is used. It makes that resource available\n                            inside a container.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                  limits:\n                    additionalProperties:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                      x-kubernetes-int-or-string: true\n                    description: |-\n                      Limits describes the maximum amount of compute resources allowed.\n                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                    type: object\n                  requests:\n                    additionalProperties:\n                      anyOf:\n                      - type: integer\n                      - type: string\n                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                      x-kubernetes-int-or-string: true\n                    description: |-\n                      Requests describes the minimum amount of compute resources required.\n                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                    type: object\n                type: object\n              env:\n                description: |-\n                  List of environment variables to set in the container for restore. These will be\n                  merged with the env of Backup and ActionSet.\n\n\n                  The priority of merging is as follows: `Restore env > Backup env > ActionSet env`.\n                items:\n                  description: EnvVar represents an environment variable present in\n                    a Container.\n                  properties:\n                    name:\n                      description: Name of the environment variable. Must be a C_IDENTIFIER.\n                      type: string\n                    value:\n                      description: |-\n                        Variable references $(VAR_NAME) are expanded\n                        using the previously defined environment variables in the container and\n                        any service environment variables. If a variable cannot be resolved,\n                        the reference in the input string will be unchanged. Double $$ are reduced\n                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                        Escaped references will never be expanded, regardless of whether the variable\n                        exists or not.\n                        Defaults to \"\".\n                      type: string\n                    valueFrom:\n                      description: Source for the environment variable's value. Cannot\n                        be used if value is not empty.\n                      properties:\n                        configMapKeyRef:\n                          description: Selects a key of a ConfigMap.\n                          properties:\n                            key:\n                              description: The key to select.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the ConfigMap or its key\n                                must be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        fieldRef:\n                          description: |-\n                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                          properties:\n                            apiVersion:\n                              description: Version of the schema the FieldPath is\n                                written in terms of, defaults to \"v1\".\n                              type: string\n                            fieldPath:\n                              description: Path of the field to select in the specified\n                                API version.\n                              type: string\n                          required:\n                          - fieldPath\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        resourceFieldRef:\n                          description: |-\n                            Selects a resource of the container: only resources limits and requests\n                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                          properties:\n                            containerName:\n                              description: 'Container name: required for volumes,\n                                optional for env vars'\n                              type: string\n                            divisor:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: Specifies the output format of the exposed\n                                resources, defaults to \"1\"\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                            resource:\n                              description: 'Required: resource to select'\n                              type: string\n                          required:\n                          - resource\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        secretKeyRef:\n                          description: Selects a key of a secret in the pod's namespace\n                          properties:\n                            key:\n                              description: The key of the secret to select from.  Must\n                                be a valid secret key.\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                            optional:\n                              description: Specify whether the Secret or its key must\n                                be defined\n                              type: boolean\n                          required:\n                          - key\n                          type: object\n                          x-kubernetes-map-type: atomic\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-preserve-unknown-fields: true\n              parameters:\n                description: |-\n                  Specifies a list of name-value pairs representing parameters and their corresponding values.\n                  Parameters match the schema specified in the `actionset.spec.parametersSchema`\n                items:\n                  properties:\n                    name:\n                      description: Represents the name of the parameter.\n                      type: string\n                    value:\n                      description: Represents the parameter values.\n                      type: string\n                  required:\n                  - name\n                  - value\n                  type: object\n                maxItems: 128\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n                x-kubernetes-validations:\n                - message: forbidden to update spec.parameters\n                  rule: self == oldSelf\n              prepareDataConfig:\n                description: |-\n                  Configuration for the action of \"prepareData\" phase, including the persistent volume claims\n                  that need to be restored and scheduling strategy of temporary recovery pod.\n                properties:\n                  dataSourceRef:\n                    description: |-\n                      Specifies the configuration when using `persistentVolumeClaim.spec.dataSourceRef` method for restoring.\n                      Describes the source volume of the backup targetVolumes and the mount path in the restoring container.\n                    properties:\n                      mountPath:\n                        description: Specifies the path within the restoring container\n                          at which the volume should be mounted.\n                        type: string\n                      volumeSource:\n                        description: |-\n                          Describes the volume that will be restored from the specified volume of the backup targetVolumes.\n                          This is required if the backup uses a volume snapshot.\n                        type: string\n                    type: object\n                    x-kubernetes-validations:\n                    - message: at least one exists for volumeSource and mountPath.\n                      rule: self.volumeSource != '' || self.mountPath !=''\n                    - message: forbidden to update spec.prepareDataConfig.dataSourceRef\n                      rule: self == oldSelf\n                  requiredPolicyForAllPodSelection:\n                    description: |-\n                      Specifies the restore policy, which is required when the pod selection strategy for the source target is 'All'.\n                      This field is ignored if the pod selection strategy is 'Any'.\n                      optional\n                    properties:\n                      dataRestorePolicy:\n                        default: OneToOne\n                        description: |-\n                          Specifies the data restore policy. Options include:\n                          - OneToMany: Enables restoration of all volumes from a single data copy of the original target instance.\n                          The 'sourceOfOneToMany' field must be set when using this policy.\n                          - OneToOne: Restricts data restoration such that each data piece can only be restored to a single target instance.\n                          This is the default policy. When the number of target instances specified for restoration surpasses the count of original backup target instances.\n                        type: string\n                      sourceOfOneToMany:\n                        description: Specifies the name of the source target pod.\n                          This field is mandatory when the DataRestorePolicy is configured\n                          to 'OneToMany'.\n                        properties:\n                          targetPodName:\n                            description: Specifies the name of the source target pod.\n                            type: string\n                        required:\n                        - targetPodName\n                        type: object\n                    required:\n                    - dataRestorePolicy\n                    type: object\n                  schedulingSpec:\n                    description: Specifies the scheduling spec for the restoring pod.\n                    properties:\n                      affinity:\n                        description: |-\n                          Contains a group of affinity scheduling rules.\n                          Refer to https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                        properties:\n                          nodeAffinity:\n                            description: Describes node affinity scheduling rules\n                              for the pod.\n                            properties:\n                              preferredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  The scheduler will prefer to schedule pods to nodes that satisfy\n                                  the affinity expressions specified by this field, but it may choose\n                                  a node that violates one or more of the expressions. The node that is\n                                  most preferred is the one with the greatest sum of weights, i.e.\n                                  for each node that meets all of the scheduling requirements (resource\n                                  request, requiredDuringScheduling affinity expressions, etc.),\n                                  compute a sum by iterating through the elements of this field and adding\n                                  \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                  node(s) with the highest sum are the most preferred.\n                                items:\n                                  description: |-\n                                    An empty preferred scheduling term matches all objects with implicit weight 0\n                                    (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                  properties:\n                                    preference:\n                                      description: A node selector term, associated\n                                        with the corresponding weight.\n                                      properties:\n                                        matchExpressions:\n                                          description: A list of node selector requirements\n                                            by node's labels.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchFields:\n                                          description: A list of node selector requirements\n                                            by node's fields.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    weight:\n                                      description: Weight associated with matching\n                                        the corresponding nodeSelectorTerm, in the\n                                        range 1-100.\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - preference\n                                  - weight\n                                  type: object\n                                type: array\n                              requiredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  If the affinity requirements specified by this field are not met at\n                                  scheduling time, the pod will not be scheduled onto the node.\n                                  If the affinity requirements specified by this field cease to be met\n                                  at some point during pod execution (e.g. due to an update), the system\n                                  may or may not try to eventually evict the pod from its node.\n                                properties:\n                                  nodeSelectorTerms:\n                                    description: Required. A list of node selector\n                                      terms. The terms are ORed.\n                                    items:\n                                      description: |-\n                                        A null or empty node selector term matches no objects. The requirements of\n                                        them are ANDed.\n                                        The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                      properties:\n                                        matchExpressions:\n                                          description: A list of node selector requirements\n                                            by node's labels.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchFields:\n                                          description: A list of node selector requirements\n                                            by node's fields.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    type: array\n                                required:\n                                - nodeSelectorTerms\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          podAffinity:\n                            description: Describes pod affinity scheduling rules (e.g.\n                              co-locate this pod in the same node, zone, etc. as some\n                              other pod(s)).\n                            properties:\n                              preferredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  The scheduler will prefer to schedule pods to nodes that satisfy\n                                  the affinity expressions specified by this field, but it may choose\n                                  a node that violates one or more of the expressions. The node that is\n                                  most preferred is the one with the greatest sum of weights, i.e.\n                                  for each node that meets all of the scheduling requirements (resource\n                                  request, requiredDuringScheduling affinity expressions, etc.),\n                                  compute a sum by iterating through the elements of this field and adding\n                                  \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                  node(s) with the highest sum are the most preferred.\n                                items:\n                                  description: The weights of all of the matched WeightedPodAffinityTerm\n                                    fields are added per-node to find the most preferred\n                                    node(s)\n                                  properties:\n                                    podAffinityTerm:\n                                      description: Required. A pod affinity term,\n                                        associated with the corresponding weight.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            A label query over a set of resources, in this case pods.\n                                            If it's null, this PodAffinityTerm matches with no Pods.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        mismatchLabelKeys:\n                                          description: |-\n                                            MismatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                            Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        namespaceSelector:\n                                          description: |-\n                                            A label query over the set of namespaces that the term applies to.\n                                            The term is applied to the union of the namespaces selected by this field\n                                            and the ones listed in the namespaces field.\n                                            null selector and null or empty namespaces list means \"this pod's namespace\".\n                                            An empty selector ({}) matches all namespaces.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        namespaces:\n                                          description: |-\n                                            namespaces specifies a static list of namespace names that the term applies to.\n                                            The term is applied to the union of the namespaces listed in this field\n                                            and the ones selected by namespaceSelector.\n                                            null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                          items:\n                                            type: string\n                                          type: array\n                                        topologyKey:\n                                          description: |-\n                                            This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                            the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                            whose value of the label with key topologyKey matches that of any node on which any of the\n                                            selected pods is running.\n                                            Empty topologyKey is not allowed.\n                                          type: string\n                                      required:\n                                      - topologyKey\n                                      type: object\n                                    weight:\n                                      description: |-\n                                        weight associated with matching the corresponding podAffinityTerm,\n                                        in the range 1-100.\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - podAffinityTerm\n                                  - weight\n                                  type: object\n                                type: array\n                              requiredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  If the affinity requirements specified by this field are not met at\n                                  scheduling time, the pod will not be scheduled onto the node.\n                                  If the affinity requirements specified by this field cease to be met\n                                  at some point during pod execution (e.g. due to a pod label update), the\n                                  system may or may not try to eventually evict the pod from its node.\n                                  When there are multiple elements, the lists of nodes corresponding to each\n                                  podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                items:\n                                  description: |-\n                                    Defines a set of pods (namely those matching the labelSelector\n                                    relative to the given namespace(s)) that this pod should be\n                                    co-located (affinity) or not co-located (anti-affinity) with,\n                                    where co-located is defined as running on a node whose value of\n                                    the label with key <topologyKey> matches that of any node on which\n                                    a pod of the set of pods is running\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                type: array\n                            type: object\n                          podAntiAffinity:\n                            description: Describes pod anti-affinity scheduling rules\n                              (e.g. avoid putting this pod in the same node, zone,\n                              etc. as some other pod(s)).\n                            properties:\n                              preferredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  The scheduler will prefer to schedule pods to nodes that satisfy\n                                  the anti-affinity expressions specified by this field, but it may choose\n                                  a node that violates one or more of the expressions. The node that is\n                                  most preferred is the one with the greatest sum of weights, i.e.\n                                  for each node that meets all of the scheduling requirements (resource\n                                  request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                  compute a sum by iterating through the elements of this field and adding\n                                  \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                  node(s) with the highest sum are the most preferred.\n                                items:\n                                  description: The weights of all of the matched WeightedPodAffinityTerm\n                                    fields are added per-node to find the most preferred\n                                    node(s)\n                                  properties:\n                                    podAffinityTerm:\n                                      description: Required. A pod affinity term,\n                                        associated with the corresponding weight.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            A label query over a set of resources, in this case pods.\n                                            If it's null, this PodAffinityTerm matches with no Pods.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        mismatchLabelKeys:\n                                          description: |-\n                                            MismatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                            Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        namespaceSelector:\n                                          description: |-\n                                            A label query over the set of namespaces that the term applies to.\n                                            The term is applied to the union of the namespaces selected by this field\n                                            and the ones listed in the namespaces field.\n                                            null selector and null or empty namespaces list means \"this pod's namespace\".\n                                            An empty selector ({}) matches all namespaces.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        namespaces:\n                                          description: |-\n                                            namespaces specifies a static list of namespace names that the term applies to.\n                                            The term is applied to the union of the namespaces listed in this field\n                                            and the ones selected by namespaceSelector.\n                                            null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                          items:\n                                            type: string\n                                          type: array\n                                        topologyKey:\n                                          description: |-\n                                            This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                            the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                            whose value of the label with key topologyKey matches that of any node on which any of the\n                                            selected pods is running.\n                                            Empty topologyKey is not allowed.\n                                          type: string\n                                      required:\n                                      - topologyKey\n                                      type: object\n                                    weight:\n                                      description: |-\n                                        weight associated with matching the corresponding podAffinityTerm,\n                                        in the range 1-100.\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - podAffinityTerm\n                                  - weight\n                                  type: object\n                                type: array\n                              requiredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  If the anti-affinity requirements specified by this field are not met at\n                                  scheduling time, the pod will not be scheduled onto the node.\n                                  If the anti-affinity requirements specified by this field cease to be met\n                                  at some point during pod execution (e.g. due to a pod label update), the\n                                  system may or may not try to eventually evict the pod from its node.\n                                  When there are multiple elements, the lists of nodes corresponding to each\n                                  podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                items:\n                                  description: |-\n                                    Defines a set of pods (namely those matching the labelSelector\n                                    relative to the given namespace(s)) that this pod should be\n                                    co-located (affinity) or not co-located (anti-affinity) with,\n                                    where co-located is defined as running on a node whose value of\n                                    the label with key <topologyKey> matches that of any node on which\n                                    a pod of the set of pods is running\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                type: array\n                            type: object\n                        type: object\n                      nodeName:\n                        description: |-\n                          Specifies a request to schedule this pod onto a specific node. If it is non-empty,\n                          the scheduler simply schedules this pod onto that node, assuming that it fits resource\n                          requirements.\n                        type: string\n                      nodeSelector:\n                        additionalProperties:\n                          type: string\n                        description: |-\n                          Defines a selector which must be true for the pod to fit on a node.\n                          The selector must match a node's labels for the pod to be scheduled on that node.\n                          More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      schedulerName:\n                        description: |-\n                          Specifies the scheduler to dispatch the pod.\n                          If not specified, the pod will be dispatched by the default scheduler.\n                        type: string\n                      tolerations:\n                        description: Specifies the tolerations for the restoring pod.\n                        items:\n                          description: |-\n                            The pod this Toleration is attached to tolerates any taint that matches\n                            the triple <key,value,effect> using the matching operator <operator>.\n                          properties:\n                            effect:\n                              description: |-\n                                Effect indicates the taint effect to match. Empty means match all taint effects.\n                                When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                              type: string\n                            key:\n                              description: |-\n                                Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                              type: string\n                            operator:\n                              description: |-\n                                Operator represents a key's relationship to the value.\n                                Valid operators are Exists and Equal. Defaults to Equal.\n                                Exists is equivalent to wildcard for value, so that a pod can\n                                tolerate all taints of a particular category.\n                              type: string\n                            tolerationSeconds:\n                              description: |-\n                                TolerationSeconds represents the period of time the toleration (which must be\n                                of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                negative values will be treated as 0 (evict immediately) by the system.\n                              format: int64\n                              type: integer\n                            value:\n                              description: |-\n                                Value is the taint value the toleration matches to.\n                                If the operator is Exists, the value should be empty, otherwise just a regular string.\n                              type: string\n                          type: object\n                        type: array\n                      topologySpreadConstraints:\n                        description: |-\n                          Describes how a group of pods ought to spread across topology\n                          domains. The scheduler will schedule pods in a way which abides by the constraints.\n                          Refer to https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/\n                        items:\n                          description: TopologySpreadConstraint specifies how to spread\n                            matching pods among the given topology.\n                          properties:\n                            labelSelector:\n                              description: |-\n                                LabelSelector is used to find matching pods.\n                                Pods that match this label selector are counted to determine the number of pods\n                                in their corresponding topology domain.\n                              properties:\n                                matchExpressions:\n                                  description: matchExpressions is a list of label\n                                    selector requirements. The requirements are ANDed.\n                                  items:\n                                    description: |-\n                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                      relates the key and values.\n                                    properties:\n                                      key:\n                                        description: key is the label key that the\n                                          selector applies to.\n                                        type: string\n                                      operator:\n                                        description: |-\n                                          operator represents a key's relationship to a set of values.\n                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                        type: string\n                                      values:\n                                        description: |-\n                                          values is an array of string values. If the operator is In or NotIn,\n                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                          the values array must be empty. This array is replaced during a strategic\n                                          merge patch.\n                                        items:\n                                          type: string\n                                        type: array\n                                    required:\n                                    - key\n                                    - operator\n                                    type: object\n                                  type: array\n                                matchLabels:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                  type: object\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            matchLabelKeys:\n                              description: |-\n                                MatchLabelKeys is a set of pod label keys to select the pods over which\n                                spreading will be calculated. The keys are used to lookup values from the\n                                incoming pod labels, those key-value labels are ANDed with labelSelector\n                                to select the group of existing pods over which spreading will be calculated\n                                for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                Keys that don't exist in the incoming pod labels will\n                                be ignored. A null or empty list means only match against labelSelector.\n\n\n                                This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                              items:\n                                type: string\n                              type: array\n                              x-kubernetes-list-type: atomic\n                            maxSkew:\n                              description: |-\n                                MaxSkew describes the degree to which pods may be unevenly distributed.\n                                When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                between the number of matching pods in the target topology and the global minimum.\n                                The global minimum is the minimum number of matching pods in an eligible domain\n                                or zero if the number of eligible domains is less than MinDomains.\n                                For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                labelSelector spread as 2/2/1:\n                                In this case, the global minimum is 1.\n                                | zone1 | zone2 | zone3 |\n                                |  P P  |  P P  |   P   |\n                                - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                violate MaxSkew(1).\n                                - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                to topologies that satisfy it.\n                                It's a required field. Default value is 1 and 0 is not allowed.\n                              format: int32\n                              type: integer\n                            minDomains:\n                              description: |-\n                                MinDomains indicates a minimum number of eligible domains.\n                                When the number of eligible domains with matching topology keys is less than minDomains,\n                                Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                this value has no effect on scheduling.\n                                As a result, when the number of eligible domains is less than minDomains,\n                                scheduler won't schedule more than maxSkew Pods to those domains.\n                                If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                Valid values are integers greater than 0.\n                                When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                labelSelector spread as 2/2/2:\n                                | zone1 | zone2 | zone3 |\n                                |  P P  |  P P  |  P P  |\n                                The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                In this situation, new pod with the same labelSelector cannot be scheduled,\n                                because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                it will violate MaxSkew.\n\n\n                                This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                              format: int32\n                              type: integer\n                            nodeAffinityPolicy:\n                              description: |-\n                                NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                when calculating pod topology spread skew. Options are:\n                                - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                If this value is nil, the behavior is equivalent to the Honor policy.\n                                This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                              type: string\n                            nodeTaintsPolicy:\n                              description: |-\n                                NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                pod topology spread skew. Options are:\n                                - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                has a toleration, are included.\n                                - Ignore: node taints are ignored. All nodes are included.\n\n\n                                If this value is nil, the behavior is equivalent to the Ignore policy.\n                                This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                              type: string\n                            topologyKey:\n                              description: |-\n                                TopologyKey is the key of node labels. Nodes that have a label with this key\n                                and identical values are considered to be in the same topology.\n                                We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                of pods into each bucket.\n                                We define a domain as a particular instance of a topology.\n                                Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                nodeAffinityPolicy and nodeTaintsPolicy.\n                                e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                It's a required field.\n                              type: string\n                            whenUnsatisfiable:\n                              description: |-\n                                WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                the spread constraint.\n                                - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                  but giving higher precedence to topologies that would help reduce the\n                                  skew.\n                                A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                if and only if every possible node assignment for that pod would violate\n                                \"MaxSkew\" on some topology.\n                                For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                labelSelector spread as 3/1/1:\n                                | zone1 | zone2 | zone3 |\n                                | P P P |   P   |   P   |\n                                If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                won't make it *more* imbalanced.\n                                It's a required field.\n                              type: string\n                          required:\n                          - maxSkew\n                          - topologyKey\n                          - whenUnsatisfiable\n                          type: object\n                        type: array\n                    type: object\n                    x-kubernetes-validations:\n                    - message: forbidden to update spec.prepareDataConfig.schedulingSpec\n                      rule: self == oldSelf\n                  volumeClaimRestorePolicy:\n                    default: Parallel\n                    description: |-\n                      Defines restore policy for persistent volume claim.\n                      Supported policies are as follows:\n\n\n                      - `Parallel`: parallel recovery of persistent volume claim.\n                      - `Serial`: restore the persistent volume claim in sequence, and wait until the previous persistent volume claim is restored before restoring a new one.\n                    enum:\n                    - Parallel\n                    - Serial\n                    type: string\n                  volumeClaims:\n                    description: |-\n                      Defines the persistent Volume claims that need to be restored and mounted together into the restore job.\n                      These persistent Volume claims will be created if they do not exist.\n                    items:\n                      properties:\n                        metadata:\n                          description: |-\n                            Specifies the standard metadata for the object.\n                            More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata\n                          properties:\n                            annotations:\n                              additionalProperties:\n                                type: string\n                              type: object\n                            finalizers:\n                              items:\n                                type: string\n                              type: array\n                            labels:\n                              additionalProperties:\n                                type: string\n                              type: object\n                            name:\n                              type: string\n                            namespace:\n                              type: string\n                          type: object\n                        mountPath:\n                          description: Specifies the path within the restoring container\n                            at which the volume should be mounted.\n                          type: string\n                        volumeClaimSpec:\n                          description: Defines the desired characteristics of a persistent\n                            volume claim.\n                          properties:\n                            accessModes:\n                              description: |-\n                                accessModes contains the desired access modes the volume should have.\n                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                              items:\n                                type: string\n                              type: array\n                            dataSource:\n                              description: |-\n                                dataSource field can be used to specify either:\n                                * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                * An existing PVC (PersistentVolumeClaim)\n                                If the provisioner or an external controller can support the specified data source,\n                                it will create a new volume based on the contents of the specified data source.\n                                When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                              properties:\n                                apiGroup:\n                                  description: |-\n                                    APIGroup is the group for the resource being referenced.\n                                    If APIGroup is not specified, the specified Kind must be in the core API group.\n                                    For any other third-party types, APIGroup is required.\n                                  type: string\n                                kind:\n                                  description: Kind is the type of resource being\n                                    referenced\n                                  type: string\n                                name:\n                                  description: Name is the name of resource being\n                                    referenced\n                                  type: string\n                              required:\n                              - kind\n                              - name\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            dataSourceRef:\n                              description: |-\n                                dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                volume is desired. This may be any object from a non-empty API group (non\n                                core object) or a PersistentVolumeClaim object.\n                                When this field is specified, volume binding will only succeed if the type of\n                                the specified object matches some installed volume populator or dynamic\n                                provisioner.\n                                This field will replace the functionality of the dataSource field and as such\n                                if both fields are non-empty, they must have the same value. For backwards\n                                compatibility, when namespace isn't specified in dataSourceRef,\n                                both fields (dataSource and dataSourceRef) will be set to the same\n                                value automatically if one of them is empty and the other is non-empty.\n                                When namespace is specified in dataSourceRef,\n                                dataSource isn't set to the same value and must be empty.\n                                There are three important differences between dataSource and dataSourceRef:\n                                * While dataSource only allows two specific types of objects, dataSourceRef\n                                  allows any non-core object, as well as PersistentVolumeClaim objects.\n                                * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                  preserves all values, and generates an error if a disallowed value is\n                                  specified.\n                                * While dataSource only allows local objects, dataSourceRef allows objects\n                                  in any namespaces.\n                                (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                              properties:\n                                apiGroup:\n                                  description: |-\n                                    APIGroup is the group for the resource being referenced.\n                                    If APIGroup is not specified, the specified Kind must be in the core API group.\n                                    For any other third-party types, APIGroup is required.\n                                  type: string\n                                kind:\n                                  description: Kind is the type of resource being\n                                    referenced\n                                  type: string\n                                name:\n                                  description: Name is the name of resource being\n                                    referenced\n                                  type: string\n                                namespace:\n                                  description: |-\n                                    Namespace is the namespace of resource being referenced\n                                    Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                    (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                  type: string\n                              required:\n                              - kind\n                              - name\n                              type: object\n                            resources:\n                              description: |-\n                                resources represents the minimum resources the volume should have.\n                                If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                that are lower than previous value but must still be higher than capacity recorded in the\n                                status field of the claim.\n                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                              properties:\n                                limits:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Limits describes the maximum amount of compute resources allowed.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                                requests:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Requests describes the minimum amount of compute resources required.\n                                    If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                    otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                              type: object\n                            selector:\n                              description: selector is a label query over volumes\n                                to consider for binding.\n                              properties:\n                                matchExpressions:\n                                  description: matchExpressions is a list of label\n                                    selector requirements. The requirements are ANDed.\n                                  items:\n                                    description: |-\n                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                      relates the key and values.\n                                    properties:\n                                      key:\n                                        description: key is the label key that the\n                                          selector applies to.\n                                        type: string\n                                      operator:\n                                        description: |-\n                                          operator represents a key's relationship to a set of values.\n                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                        type: string\n                                      values:\n                                        description: |-\n                                          values is an array of string values. If the operator is In or NotIn,\n                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                          the values array must be empty. This array is replaced during a strategic\n                                          merge patch.\n                                        items:\n                                          type: string\n                                        type: array\n                                    required:\n                                    - key\n                                    - operator\n                                    type: object\n                                  type: array\n                                matchLabels:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                  type: object\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            storageClassName:\n                              description: |-\n                                storageClassName is the name of the StorageClass required by the claim.\n                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                              type: string\n                            volumeAttributesClassName:\n                              description: |-\n                                volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                If specified, the CSI driver will create or update the volume with the attributes defined\n                                in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                will be set by the persistentvolume controller if it exists.\n                                If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                exists.\n                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                              type: string\n                            volumeMode:\n                              description: |-\n                                volumeMode defines what type of volume is required by the claim.\n                                Value of Filesystem is implied when not included in claim spec.\n                              type: string\n                            volumeName:\n                              description: volumeName is the binding reference to\n                                the PersistentVolume backing this claim.\n                              type: string\n                          type: object\n                        volumeSource:\n                          description: |-\n                            Describes the volume that will be restored from the specified volume of the backup targetVolumes.\n                            This is required if the backup uses a volume snapshot.\n                          type: string\n                      required:\n                      - metadata\n                      - volumeClaimSpec\n                      type: object\n                      x-kubernetes-validations:\n                      - message: at least one exists for volumeSource and mountPath.\n                        rule: self.volumeSource != '' || self.mountPath !=''\n                    type: array\n                    x-kubernetes-validations:\n                    - message: forbidden to update spec.prepareDataConfig.volumeClaims\n                      rule: self == oldSelf\n                  volumeClaimsTemplate:\n                    description: |-\n                      Defines a template to build persistent Volume claims that need to be restored.\n                      These claims will be created in an orderly manner based on the number of replicas or reused if they already exist.\n                    properties:\n                      replicas:\n                        description: |-\n                          Specifies the replicas of persistent volume claim that need to be created and restored.\n                          The format of the created claim name is `$(template-name)-$(index)`.\n                        format: int32\n                        minimum: 1\n                        type: integer\n                      startingIndex:\n                        description: |-\n                          Specifies the starting index for the created persistent volume claim according to the template.\n                          The minimum value is 0.\n                        format: int32\n                        minimum: 0\n                        type: integer\n                      templates:\n                        description: Contains a list of volume claims.\n                        items:\n                          properties:\n                            metadata:\n                              description: |-\n                                Specifies the standard metadata for the object.\n                                More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata\n                              properties:\n                                annotations:\n                                  additionalProperties:\n                                    type: string\n                                  type: object\n                                finalizers:\n                                  items:\n                                    type: string\n                                  type: array\n                                labels:\n                                  additionalProperties:\n                                    type: string\n                                  type: object\n                                name:\n                                  type: string\n                                namespace:\n                                  type: string\n                              type: object\n                            mountPath:\n                              description: Specifies the path within the restoring\n                                container at which the volume should be mounted.\n                              type: string\n                            volumeClaimSpec:\n                              description: Defines the desired characteristics of\n                                a persistent volume claim.\n                              properties:\n                                accessModes:\n                                  description: |-\n                                    accessModes contains the desired access modes the volume should have.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                  items:\n                                    type: string\n                                  type: array\n                                dataSource:\n                                  description: |-\n                                    dataSource field can be used to specify either:\n                                    * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                    * An existing PVC (PersistentVolumeClaim)\n                                    If the provisioner or an external controller can support the specified data source,\n                                    it will create a new volume based on the contents of the specified data source.\n                                    When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                    and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                    If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                  properties:\n                                    apiGroup:\n                                      description: |-\n                                        APIGroup is the group for the resource being referenced.\n                                        If APIGroup is not specified, the specified Kind must be in the core API group.\n                                        For any other third-party types, APIGroup is required.\n                                      type: string\n                                    kind:\n                                      description: Kind is the type of resource being\n                                        referenced\n                                      type: string\n                                    name:\n                                      description: Name is the name of resource being\n                                        referenced\n                                      type: string\n                                  required:\n                                  - kind\n                                  - name\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                dataSourceRef:\n                                  description: |-\n                                    dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                    volume is desired. This may be any object from a non-empty API group (non\n                                    core object) or a PersistentVolumeClaim object.\n                                    When this field is specified, volume binding will only succeed if the type of\n                                    the specified object matches some installed volume populator or dynamic\n                                    provisioner.\n                                    This field will replace the functionality of the dataSource field and as such\n                                    if both fields are non-empty, they must have the same value. For backwards\n                                    compatibility, when namespace isn't specified in dataSourceRef,\n                                    both fields (dataSource and dataSourceRef) will be set to the same\n                                    value automatically if one of them is empty and the other is non-empty.\n                                    When namespace is specified in dataSourceRef,\n                                    dataSource isn't set to the same value and must be empty.\n                                    There are three important differences between dataSource and dataSourceRef:\n                                    * While dataSource only allows two specific types of objects, dataSourceRef\n                                      allows any non-core object, as well as PersistentVolumeClaim objects.\n                                    * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                      preserves all values, and generates an error if a disallowed value is\n                                      specified.\n                                    * While dataSource only allows local objects, dataSourceRef allows objects\n                                      in any namespaces.\n                                    (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                    (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                  properties:\n                                    apiGroup:\n                                      description: |-\n                                        APIGroup is the group for the resource being referenced.\n                                        If APIGroup is not specified, the specified Kind must be in the core API group.\n                                        For any other third-party types, APIGroup is required.\n                                      type: string\n                                    kind:\n                                      description: Kind is the type of resource being\n                                        referenced\n                                      type: string\n                                    name:\n                                      description: Name is the name of resource being\n                                        referenced\n                                      type: string\n                                    namespace:\n                                      description: |-\n                                        Namespace is the namespace of resource being referenced\n                                        Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                        (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                      type: string\n                                  required:\n                                  - kind\n                                  - name\n                                  type: object\n                                resources:\n                                  description: |-\n                                    resources represents the minimum resources the volume should have.\n                                    If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                    that are lower than previous value but must still be higher than capacity recorded in the\n                                    status field of the claim.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                  properties:\n                                    limits:\n                                      additionalProperties:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      description: |-\n                                        Limits describes the maximum amount of compute resources allowed.\n                                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                      type: object\n                                    requests:\n                                      additionalProperties:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                      description: |-\n                                        Requests describes the minimum amount of compute resources required.\n                                        If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                        otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                      type: object\n                                  type: object\n                                selector:\n                                  description: selector is a label query over volumes\n                                    to consider for binding.\n                                  properties:\n                                    matchExpressions:\n                                      description: matchExpressions is a list of label\n                                        selector requirements. The requirements are\n                                        ANDed.\n                                      items:\n                                        description: |-\n                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                          relates the key and values.\n                                        properties:\n                                          key:\n                                            description: key is the label key that\n                                              the selector applies to.\n                                            type: string\n                                          operator:\n                                            description: |-\n                                              operator represents a key's relationship to a set of values.\n                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                            type: string\n                                          values:\n                                            description: |-\n                                              values is an array of string values. If the operator is In or NotIn,\n                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                              the values array must be empty. This array is replaced during a strategic\n                                              merge patch.\n                                            items:\n                                              type: string\n                                            type: array\n                                        required:\n                                        - key\n                                        - operator\n                                        type: object\n                                      type: array\n                                    matchLabels:\n                                      additionalProperties:\n                                        type: string\n                                      description: |-\n                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                      type: object\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                storageClassName:\n                                  description: |-\n                                    storageClassName is the name of the StorageClass required by the claim.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                  type: string\n                                volumeAttributesClassName:\n                                  description: |-\n                                    volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                    If specified, the CSI driver will create or update the volume with the attributes defined\n                                    in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                    it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                    will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                    If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                    will be set by the persistentvolume controller if it exists.\n                                    If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                    set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                    exists.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                    (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                  type: string\n                                volumeMode:\n                                  description: |-\n                                    volumeMode defines what type of volume is required by the claim.\n                                    Value of Filesystem is implied when not included in claim spec.\n                                  type: string\n                                volumeName:\n                                  description: volumeName is the binding reference\n                                    to the PersistentVolume backing this claim.\n                                  type: string\n                              type: object\n                            volumeSource:\n                              description: |-\n                                Describes the volume that will be restored from the specified volume of the backup targetVolumes.\n                                This is required if the backup uses a volume snapshot.\n                              type: string\n                          required:\n                          - metadata\n                          - volumeClaimSpec\n                          type: object\n                          x-kubernetes-validations:\n                          - message: at least one exists for volumeSource and mountPath.\n                            rule: self.volumeSource != '' || self.mountPath !=''\n                        type: array\n                    required:\n                    - replicas\n                    - templates\n                    type: object\n                    x-kubernetes-validations:\n                    - message: forbidden to update spec.prepareDataConfig.volumeClaimsTemplate\n                      rule: self == oldSelf\n                required:\n                - volumeClaimRestorePolicy\n                type: object\n              readyConfig:\n                description: Configuration for the action of \"postReady\" phase.\n                properties:\n                  connectionCredential:\n                    description: Defines the credential template used to create a\n                      connection credential.\n                    properties:\n                      hostKey:\n                        description: Specifies the map key of the host in the connection\n                          credential secret.\n                        type: string\n                      passwordKey:\n                        default: password\n                        description: |-\n                          Specifies the map key of the password in the connection credential secret.\n                          This password will be saved in the backup annotation for full backup.\n                          You can use the environment variable DP_ENCRYPTION_KEY to specify encryption key.\n                        type: string\n                      portKey:\n                        description: Specifies the map key of the port in the connection\n                          credential secret.\n                        type: string\n                      secretName:\n                        description: Refers to the Secret object that contains the\n                          connection credential.\n                        pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                        type: string\n                      usernameKey:\n                        default: username\n                        description: Specifies the map key of the user in the connection\n                          credential secret.\n                        type: string\n                    required:\n                    - secretName\n                    type: object\n                  execAction:\n                    description: Specifies the configuration for an exec action.\n                    properties:\n                      target:\n                        description: |-\n                          Defines the pods that need to be executed for the exec action.\n                          Execution will occur on all pods that meet the conditions.\n                        properties:\n                          podSelector:\n                            description: Executes kubectl in all selected pods.\n                            properties:\n                              matchExpressions:\n                                description: matchExpressions is a list of label selector\n                                  requirements. The requirements are ANDed.\n                                items:\n                                  description: |-\n                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                    relates the key and values.\n                                  properties:\n                                    key:\n                                      description: key is the label key that the selector\n                                        applies to.\n                                      type: string\n                                    operator:\n                                      description: |-\n                                        operator represents a key's relationship to a set of values.\n                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                      type: string\n                                    values:\n                                      description: |-\n                                        values is an array of string values. If the operator is In or NotIn,\n                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                        the values array must be empty. This array is replaced during a strategic\n                                        merge patch.\n                                      items:\n                                        type: string\n                                      type: array\n                                  required:\n                                  - key\n                                  - operator\n                                  type: object\n                                type: array\n                              matchLabels:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                type: object\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        required:\n                        - podSelector\n                        type: object\n                    type: object\n                  jobAction:\n                    description: Specifies the configuration for a job action.\n                    properties:\n                      requiredPolicyForAllPodSelection:\n                        description: |-\n                          Specifies the restore policy, which is required when the pod selection strategy for the source target is 'All'.\n                          This field is ignored if the pod selection strategy is 'Any'.\n                          optional\n                        properties:\n                          dataRestorePolicy:\n                            default: OneToOne\n                            description: |-\n                              Specifies the data restore policy. Options include:\n                              - OneToMany: Enables restoration of all volumes from a single data copy of the original target instance.\n                              The 'sourceOfOneToMany' field must be set when using this policy.\n                              - OneToOne: Restricts data restoration such that each data piece can only be restored to a single target instance.\n                              This is the default policy. When the number of target instances specified for restoration surpasses the count of original backup target instances.\n                            type: string\n                          sourceOfOneToMany:\n                            description: Specifies the name of the source target pod.\n                              This field is mandatory when the DataRestorePolicy is\n                              configured to 'OneToMany'.\n                            properties:\n                              targetPodName:\n                                description: Specifies the name of the source target\n                                  pod.\n                                type: string\n                            required:\n                            - targetPodName\n                            type: object\n                        required:\n                        - dataRestorePolicy\n                        type: object\n                      target:\n                        description: Defines the pods that needs to be executed for\n                          the job action.\n                        properties:\n                          podSelector:\n                            description: |-\n                              Selects one of the pods, identified by labels, to build the job spec.\n                              This includes mounting required volumes and injecting built-in environment variables of the selected pod.\n                            properties:\n                              fallbackLabelSelector:\n                                description: |-\n                                  fallbackLabelSelector is used to filter available pods when the labelSelector fails.\n                                  This only takes effect when the `strategy` field below is set to `Any`.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              matchExpressions:\n                                description: matchExpressions is a list of label selector\n                                  requirements. The requirements are ANDed.\n                                items:\n                                  description: |-\n                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                    relates the key and values.\n                                  properties:\n                                    key:\n                                      description: key is the label key that the selector\n                                        applies to.\n                                      type: string\n                                    operator:\n                                      description: |-\n                                        operator represents a key's relationship to a set of values.\n                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                      type: string\n                                    values:\n                                      description: |-\n                                        values is an array of string values. If the operator is In or NotIn,\n                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                        the values array must be empty. This array is replaced during a strategic\n                                        merge patch.\n                                      items:\n                                        type: string\n                                      type: array\n                                  required:\n                                  - key\n                                  - operator\n                                  type: object\n                                type: array\n                              matchLabels:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                type: object\n                              strategy:\n                                default: Any\n                                description: |-\n                                  Specifies the strategy to select the target pod when multiple pods are selected.\n                                  Valid values are:\n\n\n                                  - `Any`: select any one pod that match the labelsSelector.\n                                  - `All`: select all pods that match the labelsSelector. The backup data for the current pod\n                                  will be stored in a subdirectory named after the pod.\n                                enum:\n                                - Any\n                                - All\n                                type: string\n                              useParentSelectedPods:\n                                description: |-\n                                  UseParentSelectedPods indicates whether to use the pods selected by the parent for backup.\n                                  If set to true, the backup will use the same pods selected by the parent.\n                                  And only takes effect when the 'strategy' is set to 'Any'.\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          volumeMounts:\n                            description: Defines which volumes of the selected pod\n                              need to be mounted on the restoring pod.\n                            items:\n                              description: VolumeMount describes a mounting of a Volume\n                                within a container.\n                              properties:\n                                mountPath:\n                                  description: |-\n                                    Path within the container at which the volume should be mounted.  Must\n                                    not contain ':'.\n                                  type: string\n                                mountPropagation:\n                                  description: |-\n                                    mountPropagation determines how mounts are propagated from the host\n                                    to container and the other way around.\n                                    When not set, MountPropagationNone is used.\n                                    This field is beta in 1.10.\n                                  type: string\n                                name:\n                                  description: This must match the Name of a Volume.\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    Mounted read-only if true, read-write otherwise (false or unspecified).\n                                    Defaults to false.\n                                  type: boolean\n                                subPath:\n                                  description: |-\n                                    Path within the volume from which the container's volume should be mounted.\n                                    Defaults to \"\" (volume's root).\n                                  type: string\n                                subPathExpr:\n                                  description: |-\n                                    Expanded path within the volume from which the container's volume should be mounted.\n                                    Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                    Defaults to \"\" (volume's root).\n                                    SubPathExpr and SubPath are mutually exclusive.\n                                  type: string\n                              required:\n                              - mountPath\n                              - name\n                              type: object\n                            type: array\n                        required:\n                        - podSelector\n                        type: object\n                    required:\n                    - target\n                    type: object\n                  readinessProbe:\n                    description: |-\n                      Defines a periodic probe of the service readiness.\n                      The controller will perform postReadyHooks of BackupScript.spec.restore\n                      after the service readiness when readinessProbe is configured.\n                    properties:\n                      exec:\n                        description: Specifies the action to take.\n                        properties:\n                          command:\n                            description: Refers to the container command.\n                            items:\n                              type: string\n                            type: array\n                          image:\n                            description: Refers to the container image.\n                            type: string\n                        required:\n                        - command\n                        - image\n                        type: object\n                      initialDelaySeconds:\n                        description: Specifies the number of seconds after the container\n                          has started before the probe is initiated.\n                        minimum: 0\n                        type: integer\n                      periodSeconds:\n                        default: 5\n                        description: |-\n                          Specifies how often (in seconds) to perform the probe.\n                          The default value is 5 seconds, and the minimum value is 1.\n                        minimum: 1\n                        type: integer\n                      timeoutSeconds:\n                        default: 30\n                        description: |-\n                          Specifies the number of seconds after which the probe times out.\n                          The default value is 30 seconds, and the minimum value is 1.\n                        minimum: 1\n                        type: integer\n                    required:\n                    - exec\n                    type: object\n                type: object\n                x-kubernetes-validations:\n                - message: at least one exists for jobAction and execAction.\n                  rule: has(self.jobAction) || has(self.execAction)\n              resources:\n                description: Restores the specified resources of Kubernetes.\n                properties:\n                  included:\n                    description: Restores the specified resources.\n                    items:\n                      properties:\n                        groupResource:\n                          type: string\n                        labelSelector:\n                          description: Selects the specified resource for recovery\n                            by label.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                      required:\n                      - groupResource\n                      type: object\n                    type: array\n                type: object\n                x-kubernetes-validations:\n                - message: forbidden to update spec.resources\n                  rule: self == oldSelf\n              restoreTime:\n                description: Specifies the point in time for restoring.\n                pattern: ^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.restoreTime\n                  rule: self == oldSelf\n              serviceAccountName:\n                description: Specifies the service account name needed for recovery\n                  pod.\n                type: string\n            required:\n            - backup\n            type: object\n            x-kubernetes-validations:\n            - message: forbidden to update spec.parameters\n              rule: has(oldSelf.parameters) == has(self.parameters)\n          status:\n            description: RestoreStatus defines the observed state of Restore\n            properties:\n              actions:\n                description: Records all restore actions performed.\n                properties:\n                  postReady:\n                    description: Records the actions for the postReady phase.\n                    items:\n                      properties:\n                        backupName:\n                          description: Describes which backup's restore action belongs\n                            to.\n                          type: string\n                        endTime:\n                          description: The completion time of the restore job.\n                          format: date-time\n                          type: string\n                        message:\n                          description: Provides a human-readable message indicating\n                            details about the object condition.\n                          type: string\n                        name:\n                          description: Describes the name of the restore action based\n                            on the current backup.\n                          type: string\n                        objectKey:\n                          description: Describes the execution object of the restore\n                            action.\n                          type: string\n                        startTime:\n                          description: The start time of the restore job.\n                          format: date-time\n                          type: string\n                        status:\n                          description: The status of this action.\n                          enum:\n                          - Processing\n                          - Completed\n                          - Failed\n                          type: string\n                      required:\n                      - backupName\n                      - name\n                      - objectKey\n                      type: object\n                    type: array\n                  prepareData:\n                    description: Records the actions for the prepareData phase.\n                    items:\n                      properties:\n                        backupName:\n                          description: Describes which backup's restore action belongs\n                            to.\n                          type: string\n                        endTime:\n                          description: The completion time of the restore job.\n                          format: date-time\n                          type: string\n                        message:\n                          description: Provides a human-readable message indicating\n                            details about the object condition.\n                          type: string\n                        name:\n                          description: Describes the name of the restore action based\n                            on the current backup.\n                          type: string\n                        objectKey:\n                          description: Describes the execution object of the restore\n                            action.\n                          type: string\n                        startTime:\n                          description: The start time of the restore job.\n                          format: date-time\n                          type: string\n                        status:\n                          description: The status of this action.\n                          enum:\n                          - Processing\n                          - Completed\n                          - Failed\n                          type: string\n                      required:\n                      - backupName\n                      - name\n                      - objectKey\n                      type: object\n                    type: array\n                type: object\n              completionTimestamp:\n                description: Records the date/time when the restore finished being\n                  processed.\n                format: date-time\n                type: string\n              conditions:\n                description: Describes the current state of the restore API Resource,\n                  like warning.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n              duration:\n                description: |-\n                  Records the duration of the restore execution.\n                  When converted to a string, the form is \"1h2m0.5s\".\n                type: string\n              phase:\n                description: Represents the current phase of the restore.\n                enum:\n                - Running\n                - Completed\n                - Failed\n                - AsDataSource\n                type: string\n              startTimestamp:\n                description: Records the date/time when the restore started being\n                  processed.\n                format: date-time\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: storageproviders.dataprotection.kubeblocks.io\nspec:\n  group: dataprotection.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: StorageProvider\n    listKind: StorageProviderList\n    plural: storageproviders\n    singular: storageprovider\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .spec.csiDriverName\n      name: CSIDRIVER\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          StorageProvider comprises specifications that provide guidance on accessing remote storage.\n          Currently the supported access methods are via a dedicated CSI driver or the `datasafed` tool.\n          In case of CSI driver, the specification expounds on provisioning PVCs for that driver.\n          As for the `datasafed` tool, the specification provides insights on generating the necessary\n          configuration file.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: StorageProviderSpec defines the desired state of `StorageProvider`.\n            properties:\n              csiDriverName:\n                description: |-\n                  Specifies the name of the CSI driver used to access remote storage.\n                  This field can be empty, it indicates that the storage is not accessible via CSI.\n                type: string\n              csiDriverSecretTemplate:\n                description: |-\n                  A Go template that used to render and generate `k8s.io/api/core/v1.Secret`\n                  resources for a specific CSI driver.\n                  For example, `accessKey` and `secretKey` needed by CSI-S3 are stored in this\n                  `Secret` resource.\n                type: string\n              datasafedConfigTemplate:\n                description: |-\n                  A Go template used to render and generate `k8s.io/api/core/v1.Secret`.\n                  This `Secret` involves the configuration details required by the `datasafed` tool\n                  to access remote storage. For example, the `Secret` should contain `endpoint`,\n                  `bucket`, 'region', 'accessKey', 'secretKey', or something else for S3 storage.\n                  This field can be empty, it means this kind of storage is not accessible via\n                  the `datasafed` tool.\n                type: string\n              parametersSchema:\n                description: |-\n                  Describes the parameters required for storage.\n                  The parameters defined here can be referenced in the above templates,\n                  and `kbcli` uses this definition for dynamic command-line parameter parsing.\n                properties:\n                  credentialFields:\n                    description: |-\n                      Defines which parameters are credential fields, which need to be handled specifically.\n                      For instance, these should be stored in a `Secret` instead of a `ConfigMap`.\n                    items:\n                      type: string\n                    type: array\n                  openAPIV3Schema:\n                    description: Defines the parameters in OpenAPI V3.\n                    type: object\n                    x-kubernetes-preserve-unknown-fields: true\n                type: object\n              persistentVolumeClaimTemplate:\n                description: |-\n                  A Go template that renders and generates `k8s.io/api/core/v1.PersistentVolumeClaim`\n                  resources. This PVC can reference the `StorageClass` created from `storageClassTemplate`,\n                  allowing Pods to access remote storage by mounting the PVC.\n                type: string\n              storageClassTemplate:\n                description: |-\n                  A Go template utilized to render and generate `kubernetes.storage.k8s.io.v1.StorageClass`\n                  resources. The `StorageClass' created by this template is aimed at using the CSI driver.\n                type: string\n            type: object\n          status:\n            description: StorageProviderStatus defines the observed state of `StorageProvider`.\n            properties:\n              conditions:\n                description: Describes the current state of the `StorageProvider`.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n              phase:\n                description: The phase of the `StorageProvider`. Valid phases are\n                  `NotReady` and `Ready`.\n                enum:\n                - NotReady\n                - Ready\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: nodecountscalers.experimental.kubeblocks.io\nspec:\n  group: experimental.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: NodeCountScaler\n    listKind: NodeCountScalerList\n    plural: nodecountscalers\n    shortNames:\n    - ncs\n    singular: nodecountscaler\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - description: target cluster name.\n      jsonPath: .spec.targetClusterName\n      name: TARGET-CLUSTER-NAME\n      type: string\n    - description: scale ready.\n      jsonPath: .status.conditions[?(@.type==\"ScaleReady\")].status\n      name: READY\n      type: string\n    - description: reason.\n      jsonPath: .status.conditions[?(@.type==\"ScaleReady\")].reason\n      name: REASON\n      type: string\n    - description: message.\n      jsonPath: .status.conditions[?(@.type==\"ScaleReady\")].message\n      name: MESSAGE\n      type: string\n    - jsonPath: .status.lastScaleTime\n      name: LAST-SCALE-TIME\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: NodeCountScaler is the Schema for the nodecountscalers API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: NodeCountScalerSpec defines the desired state of NodeCountScaler\n            properties:\n              targetClusterName:\n                description: Specified the target Cluster name this scaler applies\n                  to.\n                type: string\n              targetComponentNames:\n                description: |-\n                  Specified the target Component names this scaler applies to.\n                  All Components will be applied if not set.\n                items:\n                  type: string\n                type: array\n            required:\n            - targetClusterName\n            type: object\n          status:\n            description: NodeCountScalerStatus defines the observed state of NodeCountScaler\n            properties:\n              componentStatuses:\n                description: Records the current status information of all Components\n                  specified in the NodeCountScalerSpec.\n                items:\n                  properties:\n                    availableReplicas:\n                      description: The number of instances of this component with\n                        a Ready condition for at least MinReadySeconds defined in\n                        the instance template.\n                      format: int32\n                      type: integer\n                    currentReplicas:\n                      description: The current number of instances of this component.\n                      format: int32\n                      type: integer\n                    desiredReplicas:\n                      description: |-\n                        The desired number of instances of this component.\n                        Usually, it should be the number of nodes.\n                      format: int32\n                      type: integer\n                    name:\n                      description: Specified the Component name.\n                      type: string\n                    readyReplicas:\n                      description: The number of instances of this component with\n                        a Ready condition.\n                      format: int32\n                      type: integer\n                  required:\n                  - availableReplicas\n                  - currentReplicas\n                  - desiredReplicas\n                  - name\n                  - readyReplicas\n                  type: object\n                type: array\n              conditions:\n                description: |-\n                  Represents the latest available observations of a nodecountscaler's current state.\n                  Known .status.conditions.type are: \"ScaleReady\".\n                  ScaleReady - All target components are ready.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - type\n                x-kubernetes-list-type: map\n              lastScaleTime:\n                description: LastScaleTime is the last time the NodeCountScaler scaled\n                  the number of instances.\n                format: date-time\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: addons.extensions.kubeblocks.io\nspec:\n  group: extensions.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: Addon\n    listKind: AddonList\n    plural: addons\n    singular: addon\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: addon types\n      jsonPath: .spec.type\n      name: TYPE\n      type: string\n    - description: addon version\n      jsonPath: .spec.version\n      name: VERSION\n      type: string\n    - description: addon provider\n      jsonPath: .spec.provider\n      name: PROVIDER\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: Addon is the Schema for the add-ons API.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: AddonSpec defines the desired state of an add-on.\n            properties:\n              cliPlugins:\n                description: Specifies the CLI plugin installation specifications.\n                items:\n                  properties:\n                    description:\n                      description: Provides a brief description of the plugin.\n                      type: string\n                    indexRepository:\n                      description: Defines the index repository of the plugin.\n                      type: string\n                    name:\n                      description: Specifies the name of the plugin.\n                      type: string\n                  required:\n                  - indexRepository\n                  - name\n                  type: object\n                type: array\n              defaultInstallValues:\n                description: Specifies the default installation parameters.\n                items:\n                  properties:\n                    enabled:\n                      description: Can be set to true if there are no specific installation\n                        attributes to be set.\n                      type: boolean\n                    extras:\n                      description: Specifies the installation specifications for extra\n                        items.\n                      items:\n                        properties:\n                          name:\n                            description: Specifies the name of the item.\n                            type: string\n                          persistentVolumeEnabled:\n                            description: Indicates whether the Persistent Volume is\n                              enabled or not.\n                            type: boolean\n                          replicas:\n                            description: Specifies the number of replicas.\n                            format: int32\n                            type: integer\n                          resources:\n                            description: Specifies the resource requirements.\n                            properties:\n                              limits:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: |-\n                                  Limits describes the maximum amount of compute resources allowed.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/.\n                                type: object\n                              requests:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: |-\n                                  Requests describes the minimum amount of compute resources required.\n                                  If Requests is omitted for a container, it defaults to Limits if that is explicitly specified;\n                                  otherwise, it defaults to an implementation-defined value.\n                                  More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/.\n                                type: object\n                            type: object\n                          storageClass:\n                            description: Specifies the name of the storage class.\n                            type: string\n                          tolerations:\n                            description: Specifies the tolerations in a JSON array\n                              string format.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    persistentVolumeEnabled:\n                      description: Indicates whether the Persistent Volume is enabled\n                        or not.\n                      type: boolean\n                    replicas:\n                      description: Specifies the number of replicas.\n                      format: int32\n                      type: integer\n                    resources:\n                      description: Specifies the resource requirements.\n                      properties:\n                        limits:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Limits describes the maximum amount of compute resources allowed.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/.\n                          type: object\n                        requests:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Requests describes the minimum amount of compute resources required.\n                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified;\n                            otherwise, it defaults to an implementation-defined value.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/.\n                          type: object\n                      type: object\n                    selectors:\n                      description: |-\n                        Indicates the default selectors for add-on installations. If multiple selectors are provided,\n                        all selectors must evaluate to true.\n                      items:\n                        properties:\n                          key:\n                            description: |-\n                              The selector key. Valid values are KubeVersion, KubeGitVersion and KubeProvider.\n\n\n                              - `KubeVersion` the semver expression of Kubernetes versions, i.e., v1.24.\n                              - `KubeGitVersion` may contain distro. info., i.e., v1.24.4+eks.\n                              - `KubeProvider` the Kubernetes provider, i.e., aws, gcp, azure, huaweiCloud, tencentCloud etc.\n                            enum:\n                            - KubeGitVersion\n                            - KubeVersion\n                            - KubeProvider\n                            type: string\n                          operator:\n                            description: |-\n                              Represents a key's relationship to a set of values.\n                              Valid operators are Contains, NotIn, DoesNotContain, MatchRegex, and DoesNoteMatchRegex.\n\n\n                              Possible enum values:\n\n\n                              - `Contains` line contains a string.\n                              - `DoesNotContain` line does not contain a string.\n                              - `MatchRegex` line contains a match to the regular expression.\n                              - `DoesNotMatchRegex` line does not contain a match to the regular expression.\n                            enum:\n                            - Contains\n                            - DoesNotContain\n                            - MatchRegex\n                            - DoesNotMatchRegex\n                            type: string\n                          values:\n                            description: Represents an array of string values. This\n                              serves as an \"OR\" expression to the operator.\n                            items:\n                              type: string\n                            type: array\n                        required:\n                        - key\n                        - operator\n                        type: object\n                      type: array\n                    storageClass:\n                      description: Specifies the name of the storage class.\n                      type: string\n                    tolerations:\n                      description: Specifies the tolerations in a JSON array string\n                        format.\n                      type: string\n                  type: object\n                minItems: 1\n                type: array\n              description:\n                description: Specifies the description of the add-on.\n                type: string\n              helm:\n                description: |-\n                  Represents the Helm installation specifications. This is only processed\n                  when the type is set to 'helm'.\n                properties:\n                  chartLocationURL:\n                    description: Specifies the URL location of the Helm Chart.\n                    type: string\n                  chartsImage:\n                    description: Defines the image of Helm charts.\n                    type: string\n                  chartsPathInImage:\n                    description: |-\n                      Defines the path of Helm charts in the image. This path is used to copy\n                      Helm charts from the image to the shared volume. The default path is \"/charts\".\n                    type: string\n                  installOptions:\n                    additionalProperties:\n                      type: string\n                    description: Defines the options for Helm release installation.\n                    type: object\n                  installValues:\n                    description: Defines the set values for Helm release installation.\n                    properties:\n                      configMapRefs:\n                        description: |-\n                          Selects a key from a ConfigMap item list. The value can be\n                          a JSON or YAML string content. Use a key name with \".json\", \".yaml\", or \".yml\"\n                          extension to specify a content type.\n                        items:\n                          properties:\n                            key:\n                              description: Specifies the key to be selected.\n                              type: string\n                            name:\n                              description: Defines the name of the object being referred\n                                to.\n                              pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                              type: string\n                          required:\n                          - key\n                          - name\n                          type: object\n                        type: array\n                      secretRefs:\n                        description: |-\n                          Selects a key from a Secrets item list. The value can be\n                          a JSON or YAML string content. Use a key name with \".json\", \".yaml\", or \".yml\"\n                          extension to specify a content type.\n                        items:\n                          properties:\n                            key:\n                              description: Specifies the key to be selected.\n                              type: string\n                            name:\n                              description: Defines the name of the object being referred\n                                to.\n                              pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                              type: string\n                          required:\n                          - key\n                          - name\n                          type: object\n                        type: array\n                      setJSONValues:\n                        description: JSON values set during Helm installation. Multiple\n                          or separate values can be specified with commas (key1=jsonval1,key2=jsonval2).\n                        items:\n                          type: string\n                        type: array\n                      setValues:\n                        description: Values set during Helm installation. Multiple\n                          or separate values can be specified with commas (key1=val1,key2=val2).\n                        items:\n                          type: string\n                        type: array\n                      urls:\n                        description: Specifies the URL location of the values file.\n                        items:\n                          type: string\n                        type: array\n                    type: object\n                  valuesMapping:\n                    description: Defines the mapping of add-on normalized resources\n                      parameters to Helm values' keys.\n                    properties:\n                      extras:\n                        description: Helm value mapping items for extra items.\n                        items:\n                          properties:\n                            jsonMap:\n                              description: |-\n                                Defines the \"key\" mapping values. The valid key is tolerations.\n                                Enum values explained:\n\n\n                                - `tolerations` sets the toleration mapping key.\n                              properties:\n                                tolerations:\n                                  description: Specifies the toleration mapping key.\n                                  type: string\n                              type: object\n                            name:\n                              description: Name of the item.\n                              type: string\n                            resources:\n                              description: Sets resources related mapping keys.\n                              properties:\n                                cpu:\n                                  description: Specifies the key used for mapping\n                                    both CPU requests and limits.\n                                  properties:\n                                    limits:\n                                      description: Specifies the mapping key for the\n                                        limit value.\n                                      type: string\n                                    requests:\n                                      description: Specifies the mapping key for the\n                                        request value.\n                                      type: string\n                                  type: object\n                                memory:\n                                  description: Specifies the key used for mapping\n                                    both Memory requests and limits.\n                                  properties:\n                                    limits:\n                                      description: Specifies the mapping key for the\n                                        limit value.\n                                      type: string\n                                    requests:\n                                      description: Specifies the mapping key for the\n                                        request value.\n                                      type: string\n                                  type: object\n                                storage:\n                                  description: Specifies the key used for mapping\n                                    the storage size value.\n                                  type: string\n                              type: object\n                            valueMap:\n                              description: |-\n                                Defines the \"key\" mapping values. Valid keys include `replicaCount`,\n                                `persistentVolumeEnabled`, and `storageClass`.\n                                Enum values explained:\n\n\n                                - `replicaCount` sets the replicaCount value mapping key.\n                                - `persistentVolumeEnabled` sets the persistent volume enabled mapping key.\n                                - `storageClass` sets the storageClass mapping key.\n                              properties:\n                                persistentVolumeEnabled:\n                                  description: Indicates whether the persistent volume\n                                    is enabled in the Helm values map.\n                                  type: string\n                                replicaCount:\n                                  description: Defines the key for setting the replica\n                                    count in the Helm values map.\n                                  type: string\n                                storageClass:\n                                  description: Specifies the key for setting the storage\n                                    class in the Helm values map.\n                                  type: string\n                              type: object\n                          required:\n                          - name\n                          type: object\n                        type: array\n                        x-kubernetes-list-map-keys:\n                        - name\n                        x-kubernetes-list-type: map\n                      jsonMap:\n                        description: |-\n                          Defines the \"key\" mapping values. The valid key is tolerations.\n                          Enum values explained:\n\n\n                          - `tolerations` sets the toleration mapping key.\n                        properties:\n                          tolerations:\n                            description: Specifies the toleration mapping key.\n                            type: string\n                        type: object\n                      resources:\n                        description: Sets resources related mapping keys.\n                        properties:\n                          cpu:\n                            description: Specifies the key used for mapping both CPU\n                              requests and limits.\n                            properties:\n                              limits:\n                                description: Specifies the mapping key for the limit\n                                  value.\n                                type: string\n                              requests:\n                                description: Specifies the mapping key for the request\n                                  value.\n                                type: string\n                            type: object\n                          memory:\n                            description: Specifies the key used for mapping both Memory\n                              requests and limits.\n                            properties:\n                              limits:\n                                description: Specifies the mapping key for the limit\n                                  value.\n                                type: string\n                              requests:\n                                description: Specifies the mapping key for the request\n                                  value.\n                                type: string\n                            type: object\n                          storage:\n                            description: Specifies the key used for mapping the storage\n                              size value.\n                            type: string\n                        type: object\n                      valueMap:\n                        description: |-\n                          Defines the \"key\" mapping values. Valid keys include `replicaCount`,\n                          `persistentVolumeEnabled`, and `storageClass`.\n                          Enum values explained:\n\n\n                          - `replicaCount` sets the replicaCount value mapping key.\n                          - `persistentVolumeEnabled` sets the persistent volume enabled mapping key.\n                          - `storageClass` sets the storageClass mapping key.\n                        properties:\n                          persistentVolumeEnabled:\n                            description: Indicates whether the persistent volume is\n                              enabled in the Helm values map.\n                            type: string\n                          replicaCount:\n                            description: Defines the key for setting the replica count\n                              in the Helm values map.\n                            type: string\n                          storageClass:\n                            description: Specifies the key for setting the storage\n                              class in the Helm values map.\n                            type: string\n                        type: object\n                    type: object\n                required:\n                - chartLocationURL\n                type: object\n                x-kubernetes-validations:\n                - message: chartsImage is required when chartLocationURL starts with\n                    'file://'\n                  rule: 'self.chartLocationURL.startsWith(''file://'') ? has(self.chartsImage)\n                    : true'\n              install:\n                description: Defines the installation parameters.\n                properties:\n                  enabled:\n                    description: Can be set to true if there are no specific installation\n                      attributes to be set.\n                    type: boolean\n                  extras:\n                    description: Specifies the installation specifications for extra\n                      items.\n                    items:\n                      properties:\n                        name:\n                          description: Specifies the name of the item.\n                          type: string\n                        persistentVolumeEnabled:\n                          description: Indicates whether the Persistent Volume is\n                            enabled or not.\n                          type: boolean\n                        replicas:\n                          description: Specifies the number of replicas.\n                          format: int32\n                          type: integer\n                        resources:\n                          description: Specifies the resource requirements.\n                          properties:\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/.\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified;\n                                otherwise, it defaults to an implementation-defined value.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/.\n                              type: object\n                          type: object\n                        storageClass:\n                          description: Specifies the name of the storage class.\n                          type: string\n                        tolerations:\n                          description: Specifies the tolerations in a JSON array string\n                            format.\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                  persistentVolumeEnabled:\n                    description: Indicates whether the Persistent Volume is enabled\n                      or not.\n                    type: boolean\n                  replicas:\n                    description: Specifies the number of replicas.\n                    format: int32\n                    type: integer\n                  resources:\n                    description: Specifies the resource requirements.\n                    properties:\n                      limits:\n                        additionalProperties:\n                          anyOf:\n                          - type: integer\n                          - type: string\n                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                          x-kubernetes-int-or-string: true\n                        description: |-\n                          Limits describes the maximum amount of compute resources allowed.\n                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/.\n                        type: object\n                      requests:\n                        additionalProperties:\n                          anyOf:\n                          - type: integer\n                          - type: string\n                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                          x-kubernetes-int-or-string: true\n                        description: |-\n                          Requests describes the minimum amount of compute resources required.\n                          If Requests is omitted for a container, it defaults to Limits if that is explicitly specified;\n                          otherwise, it defaults to an implementation-defined value.\n                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/.\n                        type: object\n                    type: object\n                  storageClass:\n                    description: Specifies the name of the storage class.\n                    type: string\n                  tolerations:\n                    description: Specifies the tolerations in a JSON array string\n                      format.\n                    type: string\n                type: object\n              installable:\n                description: |-\n                  Represents the installable specifications of the add-on. This includes\n                  the selector and auto-install settings.\n                properties:\n                  autoInstall:\n                    default: false\n                    description: Indicates whether an add-on should be installed automatically.\n                    type: boolean\n                  selectors:\n                    description: |-\n                      Specifies the selectors for add-on installation. If multiple selectors are provided,\n                      they must all evaluate to true for the add-on to be installed.\n                    items:\n                      properties:\n                        key:\n                          description: |-\n                            The selector key. Valid values are KubeVersion, KubeGitVersion and KubeProvider.\n\n\n                            - `KubeVersion` the semver expression of Kubernetes versions, i.e., v1.24.\n                            - `KubeGitVersion` may contain distro. info., i.e., v1.24.4+eks.\n                            - `KubeProvider` the Kubernetes provider, i.e., aws, gcp, azure, huaweiCloud, tencentCloud etc.\n                          enum:\n                          - KubeGitVersion\n                          - KubeVersion\n                          - KubeProvider\n                          type: string\n                        operator:\n                          description: |-\n                            Represents a key's relationship to a set of values.\n                            Valid operators are Contains, NotIn, DoesNotContain, MatchRegex, and DoesNoteMatchRegex.\n\n\n                            Possible enum values:\n\n\n                            - `Contains` line contains a string.\n                            - `DoesNotContain` line does not contain a string.\n                            - `MatchRegex` line contains a match to the regular expression.\n                            - `DoesNotMatchRegex` line does not contain a match to the regular expression.\n                          enum:\n                          - Contains\n                          - DoesNotContain\n                          - MatchRegex\n                          - DoesNotMatchRegex\n                          type: string\n                        values:\n                          description: Represents an array of string values. This\n                            serves as an \"OR\" expression to the operator.\n                          items:\n                            type: string\n                          type: array\n                      required:\n                      - key\n                      - operator\n                      type: object\n                    type: array\n                required:\n                - autoInstall\n                type: object\n              provider:\n                description: Specifies the provider of the add-on.\n                type: string\n              type:\n                description: Defines the type of the add-on. The only valid value\n                  is 'helm'.\n                enum:\n                - Helm\n                type: string\n              version:\n                description: Indicates the version of the add-on.\n                type: string\n            required:\n            - defaultInstallValues\n            - type\n            type: object\n            x-kubernetes-validations:\n            - message: spec.helm is required when spec.type is Helm, and forbidden\n                otherwise\n              rule: 'has(self.type) && self.type == ''Helm'' ?  has(self.helm) : !has(self.helm)'\n          status:\n            description: AddonStatus defines the observed state of an add-on.\n            properties:\n              conditions:\n                description: Provides a detailed description of the current state\n                  of add-on API installation.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n              observedGeneration:\n                description: |-\n                  Represents the most recent generation observed for this add-on. It corresponds\n                  to the add-on's generation, which is updated on mutation by the API Server.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Defines the current installation phase of the add-on. It can take one of\n                  the following values: `Disabled`, `Enabled`, `Failed`, `Enabling`, `Disabling`.\n                enum:\n                - Disabled\n                - Enabled\n                - Failed\n                - Enabling\n                - Disabling\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: opsdefinitions.operations.kubeblocks.io\nspec:\n  group: operations.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: OpsDefinition\n    listKind: OpsDefinitionList\n    plural: opsdefinitions\n    shortNames:\n    - od\n    singular: opsdefinition\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: OpsDefinition status phase.\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: OpsDefinition is the Schema for the OpsDefinitions API.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: OpsDefinitionSpec defines the desired state of OpsDefinition.\n            properties:\n              actions:\n                description: Specifies a list of OpsAction where each customized action\n                  is executed sequentially.\n                items:\n                  description: |-\n                    OpsAction specifies a custom action defined in OpsDefinition for execution in a \"Custom\" OpsRequest.\n\n\n                    OpsAction can be of three types:\n\n\n                      - workload: Creates a Job or Pod to run custom scripts, ideal for isolated or long-running tasks.\n                      - exec: Executes commands directly within an existing container using the kubectl exec interface,\n                        suitable for immediate, short-lived operations.\n                      - resourceModifier: Modifies a K8s object using JSON patches, useful for updating the spec of some resource.\n                  properties:\n                    exec:\n                      description: |-\n                        Specifies the configuration for a 'exec' action.\n                        It creates a Pod and invokes a 'kubectl exec' to run command inside a specified container with the target Pod.\n                      properties:\n                        backoffLimit:\n                          default: 0\n                          description: Specifies the number of retries allowed before\n                            marking the action as failed.\n                          format: int32\n                          minimum: 0\n                          type: integer\n                        command:\n                          description: The command to be executed via 'kubectl exec\n                            --'.\n                          items:\n                            type: string\n                          minItems: 1\n                          type: array\n                        containerName:\n                          description: |-\n                            The name of the container in the target pod where the command should be executed.\n                            This corresponds to the `-c {containerName}` option in `kubectl exec`.\n\n\n                            If not set, the first container is used.\n                          type: string\n                        podInfoExtractorName:\n                          description: Specifies a PodInfoExtractor defined in the\n                            `opsDefinition.spec.podInfoExtractors`.\n                          type: string\n                      required:\n                      - command\n                      - podInfoExtractorName\n                      type: object\n                    failurePolicy:\n                      allOf:\n                      - enum:\n                        - Ignore\n                        - Fail\n                      - enum:\n                        - Ignore\n                        - Fail\n                      default: Fail\n                      description: |-\n                        Specifies the failure policy of the OpsAction.\n                        Valid values are:\n\n\n                        - \"Fail\": Marks the entire OpsRequest as failed if the action fails.\n                        - \"Ignore\": The OpsRequest continues processing despite the failure of the action.\n                      type: string\n                    name:\n                      description: Specifies the name of the OpsAction.\n                      maxLength: 20\n                      type: string\n                    parameters:\n                      description: |-\n                        Specifies the parameters for the OpsAction. Their usage varies based on the action type:\n\n\n                        - For 'workload' or 'exec' actions, parameters are injected as environment variables.\n                        - For 'resourceModifier' actions, parameter can be referenced using $() in fields\n                        `resourceModifier.completionProbe.matchExpressions` and `resourceModifier.jsonPatches[*].value`.\n                      items:\n                        type: string\n                      type: array\n                    resourceModifier:\n                      description: |-\n                        Specifies the configuration for a 'resourceModifier' action.\n                        This action allows for modifications to existing K8s objects.\n\n\n                        Note: This feature has not been implemented yet.\n                      properties:\n                        completionProbe:\n                          description: |-\n                            Specifies a method to determine if the action has been completed.\n\n\n                            Note: This feature has not been implemented yet.\n                          properties:\n                            initialDelaySeconds:\n                              default: 5\n                              description: |-\n                                Specifies the number of seconds to wait after the resource has been patched before initiating completion probes.\n                                The default value is 5 seconds, with a minimum value of 1.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                            matchExpressions:\n                              description: Executes expressions regularly, based on\n                                the value of PeriodSeconds, to determine if the action\n                                has been completed.\n                              properties:\n                                failure:\n                                  description: |-\n                                    Specifies a failure condition for an action using a Go template expression.\n                                    Should evaluate to either `true` or `false`.\n                                    The current resource object is parsed into the Go template.\n                                    for example, you can use '{{ eq .spec.replicas 1 }}'.\n                                  type: string\n                                success:\n                                  description: |-\n                                    Specifies a success condition for an action using a Go template expression.\n                                    Should evaluate to either `true` or `false`.\n                                    The current resource object is parsed into the Go template.\n                                    for example, using '{{ eq .spec.replicas 1 }}'\n                                  type: string\n                              required:\n                              - success\n                              type: object\n                            periodSeconds:\n                              default: 5\n                              description: |-\n                                Specifies the frequency (in seconds) at which the probe should be performed.\n                                The default value is 5 seconds, with a minimum value of 1.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                            timeoutSeconds:\n                              default: 60\n                              description: |-\n                                Specifies the number of seconds after which the probe times out.\n                                The default value is 60 seconds, with a minimum value of 1.\n                              format: int32\n                              minimum: 1\n                              type: integer\n                          required:\n                          - matchExpressions\n                          type: object\n                        jsonPatches:\n                          description: Specifies a list of patches for modifying the\n                            object.\n                          items:\n                            properties:\n                              op:\n                                description: 'Specifies the type of JSON patch operation.\n                                  It supports the following values: ''add'', ''remove'',\n                                  ''replace''.'\n                                enum:\n                                - add\n                                - remove\n                                - replace\n                                type: string\n                              path:\n                                description: Specifies the json patch path.\n                                type: string\n                              value:\n                                description: Specifies the value to be used in the\n                                  JSON patch operation.\n                                type: string\n                            required:\n                            - op\n                            - path\n                            - value\n                            type: object\n                          minItems: 1\n                          type: array\n                        resource:\n                          description: Specifies the K8s object that is to be updated.\n                          properties:\n                            apiGroup:\n                              description: |-\n                                Specifies the group for the resource being referenced.\n                                If not specified, the referenced Kind must belong to the core API group.\n                                For all third-party types, this is mandatory.\n                              type: string\n                            kind:\n                              description: Specifies the type of resource being referenced.\n                              type: string\n                            name:\n                              description: Indicates the name of the resource being\n                                referenced.\n                              type: string\n                          required:\n                          - apiGroup\n                          - kind\n                          - name\n                          type: object\n                      required:\n                      - completionProbe\n                      - jsonPatches\n                      - resource\n                      type: object\n                    workload:\n                      description: |-\n                        Specifies the configuration for a 'workload' action.\n                        This action leads to the creation of a K8s workload, such as a Pod or Job, to execute specified tasks.\n                      properties:\n                        backoffLimit:\n                          default: 0\n                          description: Specifies the number of retries allowed before\n                            marking the action as failed.\n                          format: int32\n                          minimum: 0\n                          type: integer\n                        podInfoExtractorName:\n                          description: Specifies a PodInfoExtractor defined in the\n                            `opsDefinition.spec.podInfoExtractors`.\n                          type: string\n                        podSpec:\n                          description: Specifies the PodSpec of the 'workload' action.\n                          properties:\n                            activeDeadlineSeconds:\n                              description: |-\n                                Optional duration in seconds the pod may be active on the node relative to\n                                StartTime before the system will actively try to mark it failed and kill associated containers.\n                                Value must be a positive integer.\n                              format: int64\n                              type: integer\n                            affinity:\n                              description: If specified, the pod's scheduling constraints\n                              properties:\n                                nodeAffinity:\n                                  description: Describes node affinity scheduling\n                                    rules for the pod.\n                                  properties:\n                                    preferredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        The scheduler will prefer to schedule pods to nodes that satisfy\n                                        the affinity expressions specified by this field, but it may choose\n                                        a node that violates one or more of the expressions. The node that is\n                                        most preferred is the one with the greatest sum of weights, i.e.\n                                        for each node that meets all of the scheduling requirements (resource\n                                        request, requiredDuringScheduling affinity expressions, etc.),\n                                        compute a sum by iterating through the elements of this field and adding\n                                        \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                        node(s) with the highest sum are the most preferred.\n                                      items:\n                                        description: |-\n                                          An empty preferred scheduling term matches all objects with implicit weight 0\n                                          (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                        properties:\n                                          preference:\n                                            description: A node selector term, associated\n                                              with the corresponding weight.\n                                            properties:\n                                              matchExpressions:\n                                                description: A list of node selector\n                                                  requirements by node's labels.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchFields:\n                                                description: A list of node selector\n                                                  requirements by node's fields.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          weight:\n                                            description: Weight associated with matching\n                                              the corresponding nodeSelectorTerm,\n                                              in the range 1-100.\n                                            format: int32\n                                            type: integer\n                                        required:\n                                        - preference\n                                        - weight\n                                        type: object\n                                      type: array\n                                    requiredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        If the affinity requirements specified by this field are not met at\n                                        scheduling time, the pod will not be scheduled onto the node.\n                                        If the affinity requirements specified by this field cease to be met\n                                        at some point during pod execution (e.g. due to an update), the system\n                                        may or may not try to eventually evict the pod from its node.\n                                      properties:\n                                        nodeSelectorTerms:\n                                          description: Required. A list of node selector\n                                            terms. The terms are ORed.\n                                          items:\n                                            description: |-\n                                              A null or empty node selector term matches no objects. The requirements of\n                                              them are ANDed.\n                                              The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                            properties:\n                                              matchExpressions:\n                                                description: A list of node selector\n                                                  requirements by node's labels.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchFields:\n                                                description: A list of node selector\n                                                  requirements by node's fields.\n                                                items:\n                                                  description: |-\n                                                    A node selector requirement is a selector that contains values, a key, and an operator\n                                                    that relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: The label key that\n                                                        the selector applies to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        Represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        An array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. If the operator is Gt or Lt, the values\n                                                        array must have a single element, which will be interpreted as an integer.\n                                                        This array is replaced during a strategic merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          type: array\n                                      required:\n                                      - nodeSelectorTerms\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                                podAffinity:\n                                  description: Describes pod affinity scheduling rules\n                                    (e.g. co-locate this pod in the same node, zone,\n                                    etc. as some other pod(s)).\n                                  properties:\n                                    preferredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        The scheduler will prefer to schedule pods to nodes that satisfy\n                                        the affinity expressions specified by this field, but it may choose\n                                        a node that violates one or more of the expressions. The node that is\n                                        most preferred is the one with the greatest sum of weights, i.e.\n                                        for each node that meets all of the scheduling requirements (resource\n                                        request, requiredDuringScheduling affinity expressions, etc.),\n                                        compute a sum by iterating through the elements of this field and adding\n                                        \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                        node(s) with the highest sum are the most preferred.\n                                      items:\n                                        description: The weights of all of the matched\n                                          WeightedPodAffinityTerm fields are added\n                                          per-node to find the most preferred node(s)\n                                        properties:\n                                          podAffinityTerm:\n                                            description: Required. A pod affinity\n                                              term, associated with the corresponding\n                                              weight.\n                                            properties:\n                                              labelSelector:\n                                                description: |-\n                                                  A label query over a set of resources, in this case pods.\n                                                  If it's null, this PodAffinityTerm matches with no Pods.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              matchLabelKeys:\n                                                description: |-\n                                                  MatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                  Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              mismatchLabelKeys:\n                                                description: |-\n                                                  MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                  Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              namespaceSelector:\n                                                description: |-\n                                                  A label query over the set of namespaces that the term applies to.\n                                                  The term is applied to the union of the namespaces selected by this field\n                                                  and the ones listed in the namespaces field.\n                                                  null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                  An empty selector ({}) matches all namespaces.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              namespaces:\n                                                description: |-\n                                                  namespaces specifies a static list of namespace names that the term applies to.\n                                                  The term is applied to the union of the namespaces listed in this field\n                                                  and the ones selected by namespaceSelector.\n                                                  null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                items:\n                                                  type: string\n                                                type: array\n                                              topologyKey:\n                                                description: |-\n                                                  This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                  the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                  whose value of the label with key topologyKey matches that of any node on which any of the\n                                                  selected pods is running.\n                                                  Empty topologyKey is not allowed.\n                                                type: string\n                                            required:\n                                            - topologyKey\n                                            type: object\n                                          weight:\n                                            description: |-\n                                              weight associated with matching the corresponding podAffinityTerm,\n                                              in the range 1-100.\n                                            format: int32\n                                            type: integer\n                                        required:\n                                        - podAffinityTerm\n                                        - weight\n                                        type: object\n                                      type: array\n                                    requiredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        If the affinity requirements specified by this field are not met at\n                                        scheduling time, the pod will not be scheduled onto the node.\n                                        If the affinity requirements specified by this field cease to be met\n                                        at some point during pod execution (e.g. due to a pod label update), the\n                                        system may or may not try to eventually evict the pod from its node.\n                                        When there are multiple elements, the lists of nodes corresponding to each\n                                        podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                      items:\n                                        description: |-\n                                          Defines a set of pods (namely those matching the labelSelector\n                                          relative to the given namespace(s)) that this pod should be\n                                          co-located (affinity) or not co-located (anti-affinity) with,\n                                          where co-located is defined as running on a node whose value of\n                                          the label with key <topologyKey> matches that of any node on which\n                                          a pod of the set of pods is running\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      type: array\n                                  type: object\n                                podAntiAffinity:\n                                  description: Describes pod anti-affinity scheduling\n                                    rules (e.g. avoid putting this pod in the same\n                                    node, zone, etc. as some other pod(s)).\n                                  properties:\n                                    preferredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        The scheduler will prefer to schedule pods to nodes that satisfy\n                                        the anti-affinity expressions specified by this field, but it may choose\n                                        a node that violates one or more of the expressions. The node that is\n                                        most preferred is the one with the greatest sum of weights, i.e.\n                                        for each node that meets all of the scheduling requirements (resource\n                                        request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                        compute a sum by iterating through the elements of this field and adding\n                                        \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                        node(s) with the highest sum are the most preferred.\n                                      items:\n                                        description: The weights of all of the matched\n                                          WeightedPodAffinityTerm fields are added\n                                          per-node to find the most preferred node(s)\n                                        properties:\n                                          podAffinityTerm:\n                                            description: Required. A pod affinity\n                                              term, associated with the corresponding\n                                              weight.\n                                            properties:\n                                              labelSelector:\n                                                description: |-\n                                                  A label query over a set of resources, in this case pods.\n                                                  If it's null, this PodAffinityTerm matches with no Pods.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              matchLabelKeys:\n                                                description: |-\n                                                  MatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                  Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              mismatchLabelKeys:\n                                                description: |-\n                                                  MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                  be taken into consideration. The keys are used to lookup values from the\n                                                  incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                  to select the group of existing pods which pods will be taken into consideration\n                                                  for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                  pod labels will be ignored. The default value is empty.\n                                                  The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                  Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                  This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                items:\n                                                  type: string\n                                                type: array\n                                                x-kubernetes-list-type: atomic\n                                              namespaceSelector:\n                                                description: |-\n                                                  A label query over the set of namespaces that the term applies to.\n                                                  The term is applied to the union of the namespaces selected by this field\n                                                  and the ones listed in the namespaces field.\n                                                  null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                  An empty selector ({}) matches all namespaces.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              namespaces:\n                                                description: |-\n                                                  namespaces specifies a static list of namespace names that the term applies to.\n                                                  The term is applied to the union of the namespaces listed in this field\n                                                  and the ones selected by namespaceSelector.\n                                                  null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                items:\n                                                  type: string\n                                                type: array\n                                              topologyKey:\n                                                description: |-\n                                                  This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                  the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                  whose value of the label with key topologyKey matches that of any node on which any of the\n                                                  selected pods is running.\n                                                  Empty topologyKey is not allowed.\n                                                type: string\n                                            required:\n                                            - topologyKey\n                                            type: object\n                                          weight:\n                                            description: |-\n                                              weight associated with matching the corresponding podAffinityTerm,\n                                              in the range 1-100.\n                                            format: int32\n                                            type: integer\n                                        required:\n                                        - podAffinityTerm\n                                        - weight\n                                        type: object\n                                      type: array\n                                    requiredDuringSchedulingIgnoredDuringExecution:\n                                      description: |-\n                                        If the anti-affinity requirements specified by this field are not met at\n                                        scheduling time, the pod will not be scheduled onto the node.\n                                        If the anti-affinity requirements specified by this field cease to be met\n                                        at some point during pod execution (e.g. due to a pod label update), the\n                                        system may or may not try to eventually evict the pod from its node.\n                                        When there are multiple elements, the lists of nodes corresponding to each\n                                        podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                      items:\n                                        description: |-\n                                          Defines a set of pods (namely those matching the labelSelector\n                                          relative to the given namespace(s)) that this pod should be\n                                          co-located (affinity) or not co-located (anti-affinity) with,\n                                          where co-located is defined as running on a node whose value of\n                                          the label with key <topologyKey> matches that of any node on which\n                                          a pod of the set of pods is running\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      type: array\n                                  type: object\n                              type: object\n                            automountServiceAccountToken:\n                              description: AutomountServiceAccountToken indicates\n                                whether a service account token should be automatically\n                                mounted.\n                              type: boolean\n                            containers:\n                              description: |-\n                                List of containers belonging to the pod.\n                                Containers cannot currently be added or removed.\n                                There must be at least one container in a Pod.\n                                Cannot be updated.\n                              items:\n                                description: A single application container that you\n                                  want to run within a pod.\n                                properties:\n                                  args:\n                                    description: |-\n                                      Arguments to the entrypoint.\n                                      The container image's CMD is used if this is not provided.\n                                      Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                      cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                      produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                      of whether the variable exists or not. Cannot be updated.\n                                      More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                    items:\n                                      type: string\n                                    type: array\n                                  command:\n                                    description: |-\n                                      Entrypoint array. Not executed within a shell.\n                                      The container image's ENTRYPOINT is used if this is not provided.\n                                      Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                      cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                      produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                      of whether the variable exists or not. Cannot be updated.\n                                      More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                    items:\n                                      type: string\n                                    type: array\n                                  env:\n                                    description: |-\n                                      List of environment variables to set in the container.\n                                      Cannot be updated.\n                                    items:\n                                      description: EnvVar represents an environment\n                                        variable present in a Container.\n                                      properties:\n                                        name:\n                                          description: Name of the environment variable.\n                                            Must be a C_IDENTIFIER.\n                                          type: string\n                                        value:\n                                          description: |-\n                                            Variable references $(VAR_NAME) are expanded\n                                            using the previously defined environment variables in the container and\n                                            any service environment variables. If a variable cannot be resolved,\n                                            the reference in the input string will be unchanged. Double $$ are reduced\n                                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                            \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                            Escaped references will never be expanded, regardless of whether the variable\n                                            exists or not.\n                                            Defaults to \"\".\n                                          type: string\n                                        valueFrom:\n                                          description: Source for the environment\n                                            variable's value. Cannot be used if value\n                                            is not empty.\n                                          properties:\n                                            configMapKeyRef:\n                                              description: Selects a key of a ConfigMap.\n                                              properties:\n                                                key:\n                                                  description: The key to select.\n                                                  type: string\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: Specify whether the\n                                                    ConfigMap or its key must be defined\n                                                  type: boolean\n                                              required:\n                                              - key\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            fieldRef:\n                                              description: |-\n                                                Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                                spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                              properties:\n                                                apiVersion:\n                                                  description: Version of the schema\n                                                    the FieldPath is written in terms\n                                                    of, defaults to \"v1\".\n                                                  type: string\n                                                fieldPath:\n                                                  description: Path of the field to\n                                                    select in the specified API version.\n                                                  type: string\n                                              required:\n                                              - fieldPath\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            resourceFieldRef:\n                                              description: |-\n                                                Selects a resource of the container: only resources limits and requests\n                                                (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                              properties:\n                                                containerName:\n                                                  description: 'Container name: required\n                                                    for volumes, optional for env\n                                                    vars'\n                                                  type: string\n                                                divisor:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  description: Specifies the output\n                                                    format of the exposed resources,\n                                                    defaults to \"1\"\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                resource:\n                                                  description: 'Required: resource\n                                                    to select'\n                                                  type: string\n                                              required:\n                                              - resource\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            secretKeyRef:\n                                              description: Selects a key of a secret\n                                                in the pod's namespace\n                                              properties:\n                                                key:\n                                                  description: The key of the secret\n                                                    to select from.  Must be a valid\n                                                    secret key.\n                                                  type: string\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: Specify whether the\n                                                    Secret or its key must be defined\n                                                  type: boolean\n                                              required:\n                                              - key\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                          type: object\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                  envFrom:\n                                    description: |-\n                                      List of sources to populate environment variables in the container.\n                                      The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                      will be reported as an event when the container is starting. When a key exists in multiple\n                                      sources, the value associated with the last source will take precedence.\n                                      Values defined by an Env with a duplicate key will take precedence.\n                                      Cannot be updated.\n                                    items:\n                                      description: EnvFromSource represents the source\n                                        of a set of ConfigMaps\n                                      properties:\n                                        configMapRef:\n                                          description: The ConfigMap to select from\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                must be defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        prefix:\n                                          description: An optional identifier to prepend\n                                            to each key in the ConfigMap. Must be\n                                            a C_IDENTIFIER.\n                                          type: string\n                                        secretRef:\n                                          description: The Secret to select from\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                must be defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                    type: array\n                                  image:\n                                    description: |-\n                                      Container image name.\n                                      More info: https://kubernetes.io/docs/concepts/containers/images\n                                      This field is optional to allow higher level config management to default or override\n                                      container images in workload controllers like Deployments and StatefulSets.\n                                    type: string\n                                  imagePullPolicy:\n                                    description: |-\n                                      Image pull policy.\n                                      One of Always, Never, IfNotPresent.\n                                      Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                      Cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                                    type: string\n                                  lifecycle:\n                                    description: |-\n                                      Actions that the management system should take in response to container lifecycle events.\n                                      Cannot be updated.\n                                    properties:\n                                      postStart:\n                                        description: |-\n                                          PostStart is called immediately after a container is created. If the handler fails,\n                                          the container is terminated and restarted according to its restart policy.\n                                          Other management of the container blocks until the hook completes.\n                                          More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                        properties:\n                                          exec:\n                                            description: Exec specifies the action\n                                              to take.\n                                            properties:\n                                              command:\n                                                description: |-\n                                                  Command is the command line to execute inside the container, the working directory for the\n                                                  command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                                  not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                                  a shell, you need to explicitly call out to that shell.\n                                                  Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            type: object\n                                          httpGet:\n                                            description: HTTPGet specifies the http\n                                              request to perform.\n                                            properties:\n                                              host:\n                                                description: |-\n                                                  Host name to connect to, defaults to the pod IP. You probably want to set\n                                                  \"Host\" in httpHeaders instead.\n                                                type: string\n                                              httpHeaders:\n                                                description: Custom headers to set\n                                                  in the request. HTTP allows repeated\n                                                  headers.\n                                                items:\n                                                  description: HTTPHeader describes\n                                                    a custom header to be used in\n                                                    HTTP probes\n                                                  properties:\n                                                    name:\n                                                      description: |-\n                                                        The header field name.\n                                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                      type: string\n                                                    value:\n                                                      description: The header field\n                                                        value\n                                                      type: string\n                                                  required:\n                                                  - name\n                                                  - value\n                                                  type: object\n                                                type: array\n                                              path:\n                                                description: Path to access on the\n                                                  HTTP server.\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Name or number of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                              scheme:\n                                                description: |-\n                                                  Scheme to use for connecting to the host.\n                                                  Defaults to HTTP.\n                                                type: string\n                                            required:\n                                            - port\n                                            type: object\n                                          sleep:\n                                            description: Sleep represents the duration\n                                              that the container should sleep before\n                                              being terminated.\n                                            properties:\n                                              seconds:\n                                                description: Seconds is the number\n                                                  of seconds to sleep.\n                                                format: int64\n                                                type: integer\n                                            required:\n                                            - seconds\n                                            type: object\n                                          tcpSocket:\n                                            description: |-\n                                              Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                              for the backward compatibility. There are no validation of this field and\n                                              lifecycle hooks will fail in runtime when tcp handler is specified.\n                                            properties:\n                                              host:\n                                                description: 'Optional: Host name\n                                                  to connect to, defaults to the pod\n                                                  IP.'\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Number or name of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                            required:\n                                            - port\n                                            type: object\n                                        type: object\n                                      preStop:\n                                        description: |-\n                                          PreStop is called immediately before a container is terminated due to an\n                                          API request or management event such as liveness/startup probe failure,\n                                          preemption, resource contention, etc. The handler is not called if the\n                                          container crashes or exits. The Pod's termination grace period countdown begins before the\n                                          PreStop hook is executed. Regardless of the outcome of the handler, the\n                                          container will eventually terminate within the Pod's termination grace\n                                          period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                          or until the termination grace period is reached.\n                                          More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                        properties:\n                                          exec:\n                                            description: Exec specifies the action\n                                              to take.\n                                            properties:\n                                              command:\n                                                description: |-\n                                                  Command is the command line to execute inside the container, the working directory for the\n                                                  command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                                  not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                                  a shell, you need to explicitly call out to that shell.\n                                                  Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            type: object\n                                          httpGet:\n                                            description: HTTPGet specifies the http\n                                              request to perform.\n                                            properties:\n                                              host:\n                                                description: |-\n                                                  Host name to connect to, defaults to the pod IP. You probably want to set\n                                                  \"Host\" in httpHeaders instead.\n                                                type: string\n                                              httpHeaders:\n                                                description: Custom headers to set\n                                                  in the request. HTTP allows repeated\n                                                  headers.\n                                                items:\n                                                  description: HTTPHeader describes\n                                                    a custom header to be used in\n                                                    HTTP probes\n                                                  properties:\n                                                    name:\n                                                      description: |-\n                                                        The header field name.\n                                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                      type: string\n                                                    value:\n                                                      description: The header field\n                                                        value\n                                                      type: string\n                                                  required:\n                                                  - name\n                                                  - value\n                                                  type: object\n                                                type: array\n                                              path:\n                                                description: Path to access on the\n                                                  HTTP server.\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Name or number of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                              scheme:\n                                                description: |-\n                                                  Scheme to use for connecting to the host.\n                                                  Defaults to HTTP.\n                                                type: string\n                                            required:\n                                            - port\n                                            type: object\n                                          sleep:\n                                            description: Sleep represents the duration\n                                              that the container should sleep before\n                                              being terminated.\n                                            properties:\n                                              seconds:\n                                                description: Seconds is the number\n                                                  of seconds to sleep.\n                                                format: int64\n                                                type: integer\n                                            required:\n                                            - seconds\n                                            type: object\n                                          tcpSocket:\n                                            description: |-\n                                              Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                              for the backward compatibility. There are no validation of this field and\n                                              lifecycle hooks will fail in runtime when tcp handler is specified.\n                                            properties:\n                                              host:\n                                                description: 'Optional: Host name\n                                                  to connect to, defaults to the pod\n                                                  IP.'\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Number or name of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                            required:\n                                            - port\n                                            type: object\n                                        type: object\n                                    type: object\n                                  livenessProbe:\n                                    description: |-\n                                      Periodic probe of container liveness.\n                                      Container will be restarted if the probe fails.\n                                      Cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      failureThreshold:\n                                        description: |-\n                                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                          Defaults to 3. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      grpc:\n                                        description: GRPC specifies an action involving\n                                          a GRPC port.\n                                        properties:\n                                          port:\n                                            description: Port number of the gRPC service.\n                                              Number must be in the range 1 to 65535.\n                                            format: int32\n                                            type: integer\n                                          service:\n                                            description: |-\n                                              Service is the name of the service to place in the gRPC HealthCheckRequest\n                                              (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                              If this is not specified, the default behavior is defined by gRPC.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      initialDelaySeconds:\n                                        description: |-\n                                          Number of seconds after the container has started before liveness probes are initiated.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                      periodSeconds:\n                                        description: |-\n                                          How often (in seconds) to perform the probe.\n                                          Default to 10 seconds. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      successThreshold:\n                                        description: |-\n                                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                                          Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      tcpSocket:\n                                        description: TCPSocket specifies an action\n                                          involving a TCP port.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                      terminationGracePeriodSeconds:\n                                        description: |-\n                                          Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                          The grace period is the duration in seconds after the processes running in the pod are sent\n                                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                          Set this value longer than the expected cleanup time for your process.\n                                          If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                          value overrides the value provided by the pod spec.\n                                          Value must be non-negative integer. The value zero indicates stop immediately via\n                                          the kill signal (no opportunity to shut down).\n                                          This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                          Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                        format: int64\n                                        type: integer\n                                      timeoutSeconds:\n                                        description: |-\n                                          Number of seconds after which the probe times out.\n                                          Defaults to 1 second. Minimum value is 1.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                    type: object\n                                  name:\n                                    description: |-\n                                      Name of the container specified as a DNS_LABEL.\n                                      Each container in a pod must have a unique name (DNS_LABEL).\n                                      Cannot be updated.\n                                    type: string\n                                  ports:\n                                    description: |-\n                                      List of ports to expose from the container. Not specifying a port here\n                                      DOES NOT prevent that port from being exposed. Any port which is\n                                      listening on the default \"0.0.0.0\" address inside a container will be\n                                      accessible from the network.\n                                      Modifying this array with strategic merge patch may corrupt the data.\n                                      For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                                      Cannot be updated.\n                                    items:\n                                      description: ContainerPort represents a network\n                                        port in a single container.\n                                      properties:\n                                        containerPort:\n                                          description: |-\n                                            Number of port to expose on the pod's IP address.\n                                            This must be a valid port number, 0 < x < 65536.\n                                          format: int32\n                                          type: integer\n                                        hostIP:\n                                          description: What host IP to bind the external\n                                            port to.\n                                          type: string\n                                        hostPort:\n                                          description: |-\n                                            Number of port to expose on the host.\n                                            If specified, this must be a valid port number, 0 < x < 65536.\n                                            If HostNetwork is specified, this must match ContainerPort.\n                                            Most containers do not need this.\n                                          format: int32\n                                          type: integer\n                                        name:\n                                          description: |-\n                                            If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                            named port in a pod must have a unique name. Name for the port that can be\n                                            referred to by services.\n                                          type: string\n                                        protocol:\n                                          default: TCP\n                                          description: |-\n                                            Protocol for port. Must be UDP, TCP, or SCTP.\n                                            Defaults to \"TCP\".\n                                          type: string\n                                      required:\n                                      - containerPort\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - containerPort\n                                    - protocol\n                                    x-kubernetes-list-type: map\n                                  readinessProbe:\n                                    description: |-\n                                      Periodic probe of container service readiness.\n                                      Container will be removed from service endpoints if the probe fails.\n                                      Cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      failureThreshold:\n                                        description: |-\n                                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                          Defaults to 3. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      grpc:\n                                        description: GRPC specifies an action involving\n                                          a GRPC port.\n                                        properties:\n                                          port:\n                                            description: Port number of the gRPC service.\n                                              Number must be in the range 1 to 65535.\n                                            format: int32\n                                            type: integer\n                                          service:\n                                            description: |-\n                                              Service is the name of the service to place in the gRPC HealthCheckRequest\n                                              (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                              If this is not specified, the default behavior is defined by gRPC.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      initialDelaySeconds:\n                                        description: |-\n                                          Number of seconds after the container has started before liveness probes are initiated.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                      periodSeconds:\n                                        description: |-\n                                          How often (in seconds) to perform the probe.\n                                          Default to 10 seconds. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      successThreshold:\n                                        description: |-\n                                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                                          Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      tcpSocket:\n                                        description: TCPSocket specifies an action\n                                          involving a TCP port.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                      terminationGracePeriodSeconds:\n                                        description: |-\n                                          Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                          The grace period is the duration in seconds after the processes running in the pod are sent\n                                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                          Set this value longer than the expected cleanup time for your process.\n                                          If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                          value overrides the value provided by the pod spec.\n                                          Value must be non-negative integer. The value zero indicates stop immediately via\n                                          the kill signal (no opportunity to shut down).\n                                          This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                          Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                        format: int64\n                                        type: integer\n                                      timeoutSeconds:\n                                        description: |-\n                                          Number of seconds after which the probe times out.\n                                          Defaults to 1 second. Minimum value is 1.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                    type: object\n                                  resizePolicy:\n                                    description: Resources resize policy for the container.\n                                    items:\n                                      description: ContainerResizePolicy represents\n                                        resource resize policy for the container.\n                                      properties:\n                                        resourceName:\n                                          description: |-\n                                            Name of the resource to which this resource resize policy applies.\n                                            Supported values: cpu, memory.\n                                          type: string\n                                        restartPolicy:\n                                          description: |-\n                                            Restart policy to apply when specified resource is resized.\n                                            If not specified, it defaults to NotRequired.\n                                          type: string\n                                      required:\n                                      - resourceName\n                                      - restartPolicy\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-type: atomic\n                                  resources:\n                                    description: |-\n                                      Compute Resources required by this container.\n                                      Cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    properties:\n                                      claims:\n                                        description: |-\n                                          Claims lists the names of resources, defined in spec.resourceClaims,\n                                          that are used by this container.\n\n\n                                          This is an alpha field and requires enabling the\n                                          DynamicResourceAllocation feature gate.\n\n\n                                          This field is immutable. It can only be set for containers.\n                                        items:\n                                          description: ResourceClaim references one\n                                            entry in PodSpec.ResourceClaims.\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name must match the name of one entry in pod.spec.resourceClaims of\n                                                the Pod where this field is used. It makes that resource available\n                                                inside a container.\n                                              type: string\n                                          required:\n                                          - name\n                                          type: object\n                                        type: array\n                                        x-kubernetes-list-map-keys:\n                                        - name\n                                        x-kubernetes-list-type: map\n                                      limits:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Limits describes the maximum amount of compute resources allowed.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                      requests:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Requests describes the minimum amount of compute resources required.\n                                          If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                          otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                    type: object\n                                  restartPolicy:\n                                    description: |-\n                                      RestartPolicy defines the restart behavior of individual containers in a pod.\n                                      This field may only be set for init containers, and the only allowed value is \"Always\".\n                                      For non-init containers or when this field is not specified,\n                                      the restart behavior is defined by the Pod's restart policy and the container type.\n                                      Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                                      this init container will be continually restarted on\n                                      exit until all regular containers have terminated. Once all regular\n                                      containers have completed, all init containers with restartPolicy \"Always\"\n                                      will be shut down. This lifecycle differs from normal init containers and\n                                      is often referred to as a \"sidecar\" container. Although this init\n                                      container still starts in the init container sequence, it does not wait\n                                      for the container to complete before proceeding to the next init\n                                      container. Instead, the next init container starts immediately after this\n                                      init container is started, or after any startupProbe has successfully\n                                      completed.\n                                    type: string\n                                  securityContext:\n                                    description: |-\n                                      SecurityContext defines the security options the container should be run with.\n                                      If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                      More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                                    properties:\n                                      allowPrivilegeEscalation:\n                                        description: |-\n                                          AllowPrivilegeEscalation controls whether a process can gain more\n                                          privileges than its parent process. This bool directly controls if\n                                          the no_new_privs flag will be set on the container process.\n                                          AllowPrivilegeEscalation is true always when the container is:\n                                          1) run as Privileged\n                                          2) has CAP_SYS_ADMIN\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: boolean\n                                      capabilities:\n                                        description: |-\n                                          The capabilities to add/drop when running containers.\n                                          Defaults to the default set of capabilities granted by the container runtime.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        properties:\n                                          add:\n                                            description: Added capabilities\n                                            items:\n                                              description: Capability represent POSIX\n                                                capabilities type\n                                              type: string\n                                            type: array\n                                          drop:\n                                            description: Removed capabilities\n                                            items:\n                                              description: Capability represent POSIX\n                                                capabilities type\n                                              type: string\n                                            type: array\n                                        type: object\n                                      privileged:\n                                        description: |-\n                                          Run container in privileged mode.\n                                          Processes in privileged containers are essentially equivalent to root on the host.\n                                          Defaults to false.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: boolean\n                                      procMount:\n                                        description: |-\n                                          procMount denotes the type of proc mount to use for the containers.\n                                          The default is DefaultProcMount which uses the container runtime defaults for\n                                          readonly paths and masked paths.\n                                          This requires the ProcMountType feature flag to be enabled.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: string\n                                      readOnlyRootFilesystem:\n                                        description: |-\n                                          Whether this container has a read-only root filesystem.\n                                          Default is false.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: boolean\n                                      runAsGroup:\n                                        description: |-\n                                          The GID to run the entrypoint of the container process.\n                                          Uses runtime default if unset.\n                                          May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        format: int64\n                                        type: integer\n                                      runAsNonRoot:\n                                        description: |-\n                                          Indicates that the container must run as a non-root user.\n                                          If true, the Kubelet will validate the image at runtime to ensure that it\n                                          does not run as UID 0 (root) and fail to start the container if it does.\n                                          If unset or false, no such validation will be performed.\n                                          May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                        type: boolean\n                                      runAsUser:\n                                        description: |-\n                                          The UID to run the entrypoint of the container process.\n                                          Defaults to user specified in image metadata if unspecified.\n                                          May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        format: int64\n                                        type: integer\n                                      seLinuxOptions:\n                                        description: |-\n                                          The SELinux context to be applied to the container.\n                                          If unspecified, the container runtime will allocate a random SELinux context for each\n                                          container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        properties:\n                                          level:\n                                            description: Level is SELinux level label\n                                              that applies to the container.\n                                            type: string\n                                          role:\n                                            description: Role is a SELinux role label\n                                              that applies to the container.\n                                            type: string\n                                          type:\n                                            description: Type is a SELinux type label\n                                              that applies to the container.\n                                            type: string\n                                          user:\n                                            description: User is a SELinux user label\n                                              that applies to the container.\n                                            type: string\n                                        type: object\n                                      seccompProfile:\n                                        description: |-\n                                          The seccomp options to use by this container. If seccomp options are\n                                          provided at both the pod & container level, the container options\n                                          override the pod options.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        properties:\n                                          localhostProfile:\n                                            description: |-\n                                              localhostProfile indicates a profile defined in a file on the node should be used.\n                                              The profile must be preconfigured on the node to work.\n                                              Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                              Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                            type: string\n                                          type:\n                                            description: |-\n                                              type indicates which kind of seccomp profile will be applied.\n                                              Valid options are:\n\n\n                                              Localhost - a profile defined in a file on the node should be used.\n                                              RuntimeDefault - the container runtime default profile should be used.\n                                              Unconfined - no profile should be applied.\n                                            type: string\n                                        required:\n                                        - type\n                                        type: object\n                                      windowsOptions:\n                                        description: |-\n                                          The Windows specific settings applied to all containers.\n                                          If unspecified, the options from the PodSecurityContext will be used.\n                                          If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is linux.\n                                        properties:\n                                          gmsaCredentialSpec:\n                                            description: |-\n                                              GMSACredentialSpec is where the GMSA admission webhook\n                                              (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                              GMSA credential spec named by the GMSACredentialSpecName field.\n                                            type: string\n                                          gmsaCredentialSpecName:\n                                            description: GMSACredentialSpecName is\n                                              the name of the GMSA credential spec\n                                              to use.\n                                            type: string\n                                          hostProcess:\n                                            description: |-\n                                              HostProcess determines if a container should be run as a 'Host Process' container.\n                                              All of a Pod's containers must have the same effective HostProcess value\n                                              (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                              In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                            type: boolean\n                                          runAsUserName:\n                                            description: |-\n                                              The UserName in Windows to run the entrypoint of the container process.\n                                              Defaults to the user specified in image metadata if unspecified.\n                                              May also be set in PodSecurityContext. If set in both SecurityContext and\n                                              PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                            type: string\n                                        type: object\n                                    type: object\n                                  startupProbe:\n                                    description: |-\n                                      StartupProbe indicates that the Pod has successfully initialized.\n                                      If specified, no other probes are executed until this completes successfully.\n                                      If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                                      This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                                      when it might take a long time to load data or warm a cache, than during steady-state operation.\n                                      This cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      failureThreshold:\n                                        description: |-\n                                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                          Defaults to 3. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      grpc:\n                                        description: GRPC specifies an action involving\n                                          a GRPC port.\n                                        properties:\n                                          port:\n                                            description: Port number of the gRPC service.\n                                              Number must be in the range 1 to 65535.\n                                            format: int32\n                                            type: integer\n                                          service:\n                                            description: |-\n                                              Service is the name of the service to place in the gRPC HealthCheckRequest\n                                              (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                              If this is not specified, the default behavior is defined by gRPC.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      initialDelaySeconds:\n                                        description: |-\n                                          Number of seconds after the container has started before liveness probes are initiated.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                      periodSeconds:\n                                        description: |-\n                                          How often (in seconds) to perform the probe.\n                                          Default to 10 seconds. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      successThreshold:\n                                        description: |-\n                                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                                          Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      tcpSocket:\n                                        description: TCPSocket specifies an action\n                                          involving a TCP port.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                      terminationGracePeriodSeconds:\n                                        description: |-\n                                          Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                          The grace period is the duration in seconds after the processes running in the pod are sent\n                                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                          Set this value longer than the expected cleanup time for your process.\n                                          If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                          value overrides the value provided by the pod spec.\n                                          Value must be non-negative integer. The value zero indicates stop immediately via\n                                          the kill signal (no opportunity to shut down).\n                                          This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                          Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                        format: int64\n                                        type: integer\n                                      timeoutSeconds:\n                                        description: |-\n                                          Number of seconds after which the probe times out.\n                                          Defaults to 1 second. Minimum value is 1.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                    type: object\n                                  stdin:\n                                    description: |-\n                                      Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                      is not set, reads from stdin in the container will always result in EOF.\n                                      Default is false.\n                                    type: boolean\n                                  stdinOnce:\n                                    description: |-\n                                      Whether the container runtime should close the stdin channel after it has been opened by\n                                      a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                      sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                      first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                      at which time stdin is closed and remains closed until the container is restarted. If this\n                                      flag is false, a container processes that reads from stdin will never receive an EOF.\n                                      Default is false\n                                    type: boolean\n                                  terminationMessagePath:\n                                    description: |-\n                                      Optional: Path at which the file to which the container's termination message\n                                      will be written is mounted into the container's filesystem.\n                                      Message written is intended to be brief final status, such as an assertion failure message.\n                                      Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                      all containers will be limited to 12kb.\n                                      Defaults to /dev/termination-log.\n                                      Cannot be updated.\n                                    type: string\n                                  terminationMessagePolicy:\n                                    description: |-\n                                      Indicate how the termination message should be populated. File will use the contents of\n                                      terminationMessagePath to populate the container status message on both success and failure.\n                                      FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                      message file is empty and the container exited with an error.\n                                      The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                      Defaults to File.\n                                      Cannot be updated.\n                                    type: string\n                                  tty:\n                                    description: |-\n                                      Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                      Default is false.\n                                    type: boolean\n                                  volumeDevices:\n                                    description: volumeDevices is the list of block\n                                      devices to be used by the container.\n                                    items:\n                                      description: volumeDevice describes a mapping\n                                        of a raw block device within a container.\n                                      properties:\n                                        devicePath:\n                                          description: devicePath is the path inside\n                                            of the container that the device will\n                                            be mapped to.\n                                          type: string\n                                        name:\n                                          description: name must match the name of\n                                            a persistentVolumeClaim in the pod\n                                          type: string\n                                      required:\n                                      - devicePath\n                                      - name\n                                      type: object\n                                    type: array\n                                  volumeMounts:\n                                    description: |-\n                                      Pod volumes to mount into the container's filesystem.\n                                      Cannot be updated.\n                                    items:\n                                      description: VolumeMount describes a mounting\n                                        of a Volume within a container.\n                                      properties:\n                                        mountPath:\n                                          description: |-\n                                            Path within the container at which the volume should be mounted.  Must\n                                            not contain ':'.\n                                          type: string\n                                        mountPropagation:\n                                          description: |-\n                                            mountPropagation determines how mounts are propagated from the host\n                                            to container and the other way around.\n                                            When not set, MountPropagationNone is used.\n                                            This field is beta in 1.10.\n                                          type: string\n                                        name:\n                                          description: This must match the Name of\n                                            a Volume.\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            Mounted read-only if true, read-write otherwise (false or unspecified).\n                                            Defaults to false.\n                                          type: boolean\n                                        subPath:\n                                          description: |-\n                                            Path within the volume from which the container's volume should be mounted.\n                                            Defaults to \"\" (volume's root).\n                                          type: string\n                                        subPathExpr:\n                                          description: |-\n                                            Expanded path within the volume from which the container's volume should be mounted.\n                                            Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                            Defaults to \"\" (volume's root).\n                                            SubPathExpr and SubPath are mutually exclusive.\n                                          type: string\n                                      required:\n                                      - mountPath\n                                      - name\n                                      type: object\n                                    type: array\n                                  workingDir:\n                                    description: |-\n                                      Container's working directory.\n                                      If not specified, the container runtime's default will be used, which\n                                      might be configured in the container image.\n                                      Cannot be updated.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            dnsConfig:\n                              description: |-\n                                Specifies the DNS parameters of a pod.\n                                Parameters specified here will be merged to the generated DNS\n                                configuration based on DNSPolicy.\n                              properties:\n                                nameservers:\n                                  description: |-\n                                    A list of DNS name server IP addresses.\n                                    This will be appended to the base nameservers generated from DNSPolicy.\n                                    Duplicated nameservers will be removed.\n                                  items:\n                                    type: string\n                                  type: array\n                                options:\n                                  description: |-\n                                    A list of DNS resolver options.\n                                    This will be merged with the base options generated from DNSPolicy.\n                                    Duplicated entries will be removed. Resolution options given in Options\n                                    will override those that appear in the base DNSPolicy.\n                                  items:\n                                    description: PodDNSConfigOption defines DNS resolver\n                                      options of a pod.\n                                    properties:\n                                      name:\n                                        description: Required.\n                                        type: string\n                                      value:\n                                        type: string\n                                    type: object\n                                  type: array\n                                searches:\n                                  description: |-\n                                    A list of DNS search domains for host-name lookup.\n                                    This will be appended to the base search paths generated from DNSPolicy.\n                                    Duplicated search paths will be removed.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            dnsPolicy:\n                              description: |-\n                                Set DNS policy for the pod.\n                                Defaults to \"ClusterFirst\".\n                                Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.\n                                DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy.\n                                To have DNS options set along with hostNetwork, you have to specify DNS policy\n                                explicitly to 'ClusterFirstWithHostNet'.\n                              type: string\n                            enableServiceLinks:\n                              description: |-\n                                EnableServiceLinks indicates whether information about services should be injected into pod's\n                                environment variables, matching the syntax of Docker links.\n                                Optional: Defaults to true.\n                              type: boolean\n                            ephemeralContainers:\n                              description: |-\n                                List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing\n                                pod to perform user-initiated actions such as debugging. This list cannot be specified when\n                                creating a pod, and it cannot be modified by updating the pod spec. In order to add an\n                                ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.\n                              items:\n                                description: |-\n                                  An EphemeralContainer is a temporary container that you may add to an existing Pod for\n                                  user-initiated activities such as debugging. Ephemeral containers have no resource or\n                                  scheduling guarantees, and they will not be restarted when they exit or when a Pod is\n                                  removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the\n                                  Pod to exceed its resource allocation.\n\n\n                                  To add an ephemeral container, use the ephemeralcontainers subresource of an existing\n                                  Pod. Ephemeral containers may not be removed or restarted.\n                                properties:\n                                  args:\n                                    description: |-\n                                      Arguments to the entrypoint.\n                                      The image's CMD is used if this is not provided.\n                                      Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                      cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                      produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                      of whether the variable exists or not. Cannot be updated.\n                                      More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                    items:\n                                      type: string\n                                    type: array\n                                  command:\n                                    description: |-\n                                      Entrypoint array. Not executed within a shell.\n                                      The image's ENTRYPOINT is used if this is not provided.\n                                      Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                      cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                      produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                      of whether the variable exists or not. Cannot be updated.\n                                      More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                    items:\n                                      type: string\n                                    type: array\n                                  env:\n                                    description: |-\n                                      List of environment variables to set in the container.\n                                      Cannot be updated.\n                                    items:\n                                      description: EnvVar represents an environment\n                                        variable present in a Container.\n                                      properties:\n                                        name:\n                                          description: Name of the environment variable.\n                                            Must be a C_IDENTIFIER.\n                                          type: string\n                                        value:\n                                          description: |-\n                                            Variable references $(VAR_NAME) are expanded\n                                            using the previously defined environment variables in the container and\n                                            any service environment variables. If a variable cannot be resolved,\n                                            the reference in the input string will be unchanged. Double $$ are reduced\n                                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                            \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                            Escaped references will never be expanded, regardless of whether the variable\n                                            exists or not.\n                                            Defaults to \"\".\n                                          type: string\n                                        valueFrom:\n                                          description: Source for the environment\n                                            variable's value. Cannot be used if value\n                                            is not empty.\n                                          properties:\n                                            configMapKeyRef:\n                                              description: Selects a key of a ConfigMap.\n                                              properties:\n                                                key:\n                                                  description: The key to select.\n                                                  type: string\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: Specify whether the\n                                                    ConfigMap or its key must be defined\n                                                  type: boolean\n                                              required:\n                                              - key\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            fieldRef:\n                                              description: |-\n                                                Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                                spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                              properties:\n                                                apiVersion:\n                                                  description: Version of the schema\n                                                    the FieldPath is written in terms\n                                                    of, defaults to \"v1\".\n                                                  type: string\n                                                fieldPath:\n                                                  description: Path of the field to\n                                                    select in the specified API version.\n                                                  type: string\n                                              required:\n                                              - fieldPath\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            resourceFieldRef:\n                                              description: |-\n                                                Selects a resource of the container: only resources limits and requests\n                                                (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                              properties:\n                                                containerName:\n                                                  description: 'Container name: required\n                                                    for volumes, optional for env\n                                                    vars'\n                                                  type: string\n                                                divisor:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  description: Specifies the output\n                                                    format of the exposed resources,\n                                                    defaults to \"1\"\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                resource:\n                                                  description: 'Required: resource\n                                                    to select'\n                                                  type: string\n                                              required:\n                                              - resource\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            secretKeyRef:\n                                              description: Selects a key of a secret\n                                                in the pod's namespace\n                                              properties:\n                                                key:\n                                                  description: The key of the secret\n                                                    to select from.  Must be a valid\n                                                    secret key.\n                                                  type: string\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: Specify whether the\n                                                    Secret or its key must be defined\n                                                  type: boolean\n                                              required:\n                                              - key\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                          type: object\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                  envFrom:\n                                    description: |-\n                                      List of sources to populate environment variables in the container.\n                                      The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                      will be reported as an event when the container is starting. When a key exists in multiple\n                                      sources, the value associated with the last source will take precedence.\n                                      Values defined by an Env with a duplicate key will take precedence.\n                                      Cannot be updated.\n                                    items:\n                                      description: EnvFromSource represents the source\n                                        of a set of ConfigMaps\n                                      properties:\n                                        configMapRef:\n                                          description: The ConfigMap to select from\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                must be defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        prefix:\n                                          description: An optional identifier to prepend\n                                            to each key in the ConfigMap. Must be\n                                            a C_IDENTIFIER.\n                                          type: string\n                                        secretRef:\n                                          description: The Secret to select from\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                must be defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                    type: array\n                                  image:\n                                    description: |-\n                                      Container image name.\n                                      More info: https://kubernetes.io/docs/concepts/containers/images\n                                    type: string\n                                  imagePullPolicy:\n                                    description: |-\n                                      Image pull policy.\n                                      One of Always, Never, IfNotPresent.\n                                      Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                      Cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                                    type: string\n                                  lifecycle:\n                                    description: Lifecycle is not allowed for ephemeral\n                                      containers.\n                                    properties:\n                                      postStart:\n                                        description: |-\n                                          PostStart is called immediately after a container is created. If the handler fails,\n                                          the container is terminated and restarted according to its restart policy.\n                                          Other management of the container blocks until the hook completes.\n                                          More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                        properties:\n                                          exec:\n                                            description: Exec specifies the action\n                                              to take.\n                                            properties:\n                                              command:\n                                                description: |-\n                                                  Command is the command line to execute inside the container, the working directory for the\n                                                  command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                                  not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                                  a shell, you need to explicitly call out to that shell.\n                                                  Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            type: object\n                                          httpGet:\n                                            description: HTTPGet specifies the http\n                                              request to perform.\n                                            properties:\n                                              host:\n                                                description: |-\n                                                  Host name to connect to, defaults to the pod IP. You probably want to set\n                                                  \"Host\" in httpHeaders instead.\n                                                type: string\n                                              httpHeaders:\n                                                description: Custom headers to set\n                                                  in the request. HTTP allows repeated\n                                                  headers.\n                                                items:\n                                                  description: HTTPHeader describes\n                                                    a custom header to be used in\n                                                    HTTP probes\n                                                  properties:\n                                                    name:\n                                                      description: |-\n                                                        The header field name.\n                                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                      type: string\n                                                    value:\n                                                      description: The header field\n                                                        value\n                                                      type: string\n                                                  required:\n                                                  - name\n                                                  - value\n                                                  type: object\n                                                type: array\n                                              path:\n                                                description: Path to access on the\n                                                  HTTP server.\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Name or number of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                              scheme:\n                                                description: |-\n                                                  Scheme to use for connecting to the host.\n                                                  Defaults to HTTP.\n                                                type: string\n                                            required:\n                                            - port\n                                            type: object\n                                          sleep:\n                                            description: Sleep represents the duration\n                                              that the container should sleep before\n                                              being terminated.\n                                            properties:\n                                              seconds:\n                                                description: Seconds is the number\n                                                  of seconds to sleep.\n                                                format: int64\n                                                type: integer\n                                            required:\n                                            - seconds\n                                            type: object\n                                          tcpSocket:\n                                            description: |-\n                                              Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                              for the backward compatibility. There are no validation of this field and\n                                              lifecycle hooks will fail in runtime when tcp handler is specified.\n                                            properties:\n                                              host:\n                                                description: 'Optional: Host name\n                                                  to connect to, defaults to the pod\n                                                  IP.'\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Number or name of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                            required:\n                                            - port\n                                            type: object\n                                        type: object\n                                      preStop:\n                                        description: |-\n                                          PreStop is called immediately before a container is terminated due to an\n                                          API request or management event such as liveness/startup probe failure,\n                                          preemption, resource contention, etc. The handler is not called if the\n                                          container crashes or exits. The Pod's termination grace period countdown begins before the\n                                          PreStop hook is executed. Regardless of the outcome of the handler, the\n                                          container will eventually terminate within the Pod's termination grace\n                                          period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                          or until the termination grace period is reached.\n                                          More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                        properties:\n                                          exec:\n                                            description: Exec specifies the action\n                                              to take.\n                                            properties:\n                                              command:\n                                                description: |-\n                                                  Command is the command line to execute inside the container, the working directory for the\n                                                  command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                                  not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                                  a shell, you need to explicitly call out to that shell.\n                                                  Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            type: object\n                                          httpGet:\n                                            description: HTTPGet specifies the http\n                                              request to perform.\n                                            properties:\n                                              host:\n                                                description: |-\n                                                  Host name to connect to, defaults to the pod IP. You probably want to set\n                                                  \"Host\" in httpHeaders instead.\n                                                type: string\n                                              httpHeaders:\n                                                description: Custom headers to set\n                                                  in the request. HTTP allows repeated\n                                                  headers.\n                                                items:\n                                                  description: HTTPHeader describes\n                                                    a custom header to be used in\n                                                    HTTP probes\n                                                  properties:\n                                                    name:\n                                                      description: |-\n                                                        The header field name.\n                                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                      type: string\n                                                    value:\n                                                      description: The header field\n                                                        value\n                                                      type: string\n                                                  required:\n                                                  - name\n                                                  - value\n                                                  type: object\n                                                type: array\n                                              path:\n                                                description: Path to access on the\n                                                  HTTP server.\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Name or number of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                              scheme:\n                                                description: |-\n                                                  Scheme to use for connecting to the host.\n                                                  Defaults to HTTP.\n                                                type: string\n                                            required:\n                                            - port\n                                            type: object\n                                          sleep:\n                                            description: Sleep represents the duration\n                                              that the container should sleep before\n                                              being terminated.\n                                            properties:\n                                              seconds:\n                                                description: Seconds is the number\n                                                  of seconds to sleep.\n                                                format: int64\n                                                type: integer\n                                            required:\n                                            - seconds\n                                            type: object\n                                          tcpSocket:\n                                            description: |-\n                                              Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                              for the backward compatibility. There are no validation of this field and\n                                              lifecycle hooks will fail in runtime when tcp handler is specified.\n                                            properties:\n                                              host:\n                                                description: 'Optional: Host name\n                                                  to connect to, defaults to the pod\n                                                  IP.'\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Number or name of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                            required:\n                                            - port\n                                            type: object\n                                        type: object\n                                    type: object\n                                  livenessProbe:\n                                    description: Probes are not allowed for ephemeral\n                                      containers.\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      failureThreshold:\n                                        description: |-\n                                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                          Defaults to 3. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      grpc:\n                                        description: GRPC specifies an action involving\n                                          a GRPC port.\n                                        properties:\n                                          port:\n                                            description: Port number of the gRPC service.\n                                              Number must be in the range 1 to 65535.\n                                            format: int32\n                                            type: integer\n                                          service:\n                                            description: |-\n                                              Service is the name of the service to place in the gRPC HealthCheckRequest\n                                              (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                              If this is not specified, the default behavior is defined by gRPC.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      initialDelaySeconds:\n                                        description: |-\n                                          Number of seconds after the container has started before liveness probes are initiated.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                      periodSeconds:\n                                        description: |-\n                                          How often (in seconds) to perform the probe.\n                                          Default to 10 seconds. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      successThreshold:\n                                        description: |-\n                                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                                          Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      tcpSocket:\n                                        description: TCPSocket specifies an action\n                                          involving a TCP port.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                      terminationGracePeriodSeconds:\n                                        description: |-\n                                          Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                          The grace period is the duration in seconds after the processes running in the pod are sent\n                                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                          Set this value longer than the expected cleanup time for your process.\n                                          If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                          value overrides the value provided by the pod spec.\n                                          Value must be non-negative integer. The value zero indicates stop immediately via\n                                          the kill signal (no opportunity to shut down).\n                                          This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                          Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                        format: int64\n                                        type: integer\n                                      timeoutSeconds:\n                                        description: |-\n                                          Number of seconds after which the probe times out.\n                                          Defaults to 1 second. Minimum value is 1.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                    type: object\n                                  name:\n                                    description: |-\n                                      Name of the ephemeral container specified as a DNS_LABEL.\n                                      This name must be unique among all containers, init containers and ephemeral containers.\n                                    type: string\n                                  ports:\n                                    description: Ports are not allowed for ephemeral\n                                      containers.\n                                    items:\n                                      description: ContainerPort represents a network\n                                        port in a single container.\n                                      properties:\n                                        containerPort:\n                                          description: |-\n                                            Number of port to expose on the pod's IP address.\n                                            This must be a valid port number, 0 < x < 65536.\n                                          format: int32\n                                          type: integer\n                                        hostIP:\n                                          description: What host IP to bind the external\n                                            port to.\n                                          type: string\n                                        hostPort:\n                                          description: |-\n                                            Number of port to expose on the host.\n                                            If specified, this must be a valid port number, 0 < x < 65536.\n                                            If HostNetwork is specified, this must match ContainerPort.\n                                            Most containers do not need this.\n                                          format: int32\n                                          type: integer\n                                        name:\n                                          description: |-\n                                            If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                            named port in a pod must have a unique name. Name for the port that can be\n                                            referred to by services.\n                                          type: string\n                                        protocol:\n                                          default: TCP\n                                          description: |-\n                                            Protocol for port. Must be UDP, TCP, or SCTP.\n                                            Defaults to \"TCP\".\n                                          type: string\n                                      required:\n                                      - containerPort\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - containerPort\n                                    - protocol\n                                    x-kubernetes-list-type: map\n                                  readinessProbe:\n                                    description: Probes are not allowed for ephemeral\n                                      containers.\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      failureThreshold:\n                                        description: |-\n                                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                          Defaults to 3. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      grpc:\n                                        description: GRPC specifies an action involving\n                                          a GRPC port.\n                                        properties:\n                                          port:\n                                            description: Port number of the gRPC service.\n                                              Number must be in the range 1 to 65535.\n                                            format: int32\n                                            type: integer\n                                          service:\n                                            description: |-\n                                              Service is the name of the service to place in the gRPC HealthCheckRequest\n                                              (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                              If this is not specified, the default behavior is defined by gRPC.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      initialDelaySeconds:\n                                        description: |-\n                                          Number of seconds after the container has started before liveness probes are initiated.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                      periodSeconds:\n                                        description: |-\n                                          How often (in seconds) to perform the probe.\n                                          Default to 10 seconds. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      successThreshold:\n                                        description: |-\n                                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                                          Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      tcpSocket:\n                                        description: TCPSocket specifies an action\n                                          involving a TCP port.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                      terminationGracePeriodSeconds:\n                                        description: |-\n                                          Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                          The grace period is the duration in seconds after the processes running in the pod are sent\n                                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                          Set this value longer than the expected cleanup time for your process.\n                                          If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                          value overrides the value provided by the pod spec.\n                                          Value must be non-negative integer. The value zero indicates stop immediately via\n                                          the kill signal (no opportunity to shut down).\n                                          This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                          Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                        format: int64\n                                        type: integer\n                                      timeoutSeconds:\n                                        description: |-\n                                          Number of seconds after which the probe times out.\n                                          Defaults to 1 second. Minimum value is 1.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                    type: object\n                                  resizePolicy:\n                                    description: Resources resize policy for the container.\n                                    items:\n                                      description: ContainerResizePolicy represents\n                                        resource resize policy for the container.\n                                      properties:\n                                        resourceName:\n                                          description: |-\n                                            Name of the resource to which this resource resize policy applies.\n                                            Supported values: cpu, memory.\n                                          type: string\n                                        restartPolicy:\n                                          description: |-\n                                            Restart policy to apply when specified resource is resized.\n                                            If not specified, it defaults to NotRequired.\n                                          type: string\n                                      required:\n                                      - resourceName\n                                      - restartPolicy\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-type: atomic\n                                  resources:\n                                    description: |-\n                                      Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources\n                                      already allocated to the pod.\n                                    properties:\n                                      claims:\n                                        description: |-\n                                          Claims lists the names of resources, defined in spec.resourceClaims,\n                                          that are used by this container.\n\n\n                                          This is an alpha field and requires enabling the\n                                          DynamicResourceAllocation feature gate.\n\n\n                                          This field is immutable. It can only be set for containers.\n                                        items:\n                                          description: ResourceClaim references one\n                                            entry in PodSpec.ResourceClaims.\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name must match the name of one entry in pod.spec.resourceClaims of\n                                                the Pod where this field is used. It makes that resource available\n                                                inside a container.\n                                              type: string\n                                          required:\n                                          - name\n                                          type: object\n                                        type: array\n                                        x-kubernetes-list-map-keys:\n                                        - name\n                                        x-kubernetes-list-type: map\n                                      limits:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Limits describes the maximum amount of compute resources allowed.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                      requests:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Requests describes the minimum amount of compute resources required.\n                                          If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                          otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                    type: object\n                                  restartPolicy:\n                                    description: |-\n                                      Restart policy for the container to manage the restart behavior of each\n                                      container within a pod.\n                                      This may only be set for init containers. You cannot set this field on\n                                      ephemeral containers.\n                                    type: string\n                                  securityContext:\n                                    description: |-\n                                      Optional: SecurityContext defines the security options the ephemeral container should be run with.\n                                      If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                    properties:\n                                      allowPrivilegeEscalation:\n                                        description: |-\n                                          AllowPrivilegeEscalation controls whether a process can gain more\n                                          privileges than its parent process. This bool directly controls if\n                                          the no_new_privs flag will be set on the container process.\n                                          AllowPrivilegeEscalation is true always when the container is:\n                                          1) run as Privileged\n                                          2) has CAP_SYS_ADMIN\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: boolean\n                                      capabilities:\n                                        description: |-\n                                          The capabilities to add/drop when running containers.\n                                          Defaults to the default set of capabilities granted by the container runtime.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        properties:\n                                          add:\n                                            description: Added capabilities\n                                            items:\n                                              description: Capability represent POSIX\n                                                capabilities type\n                                              type: string\n                                            type: array\n                                          drop:\n                                            description: Removed capabilities\n                                            items:\n                                              description: Capability represent POSIX\n                                                capabilities type\n                                              type: string\n                                            type: array\n                                        type: object\n                                      privileged:\n                                        description: |-\n                                          Run container in privileged mode.\n                                          Processes in privileged containers are essentially equivalent to root on the host.\n                                          Defaults to false.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: boolean\n                                      procMount:\n                                        description: |-\n                                          procMount denotes the type of proc mount to use for the containers.\n                                          The default is DefaultProcMount which uses the container runtime defaults for\n                                          readonly paths and masked paths.\n                                          This requires the ProcMountType feature flag to be enabled.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: string\n                                      readOnlyRootFilesystem:\n                                        description: |-\n                                          Whether this container has a read-only root filesystem.\n                                          Default is false.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: boolean\n                                      runAsGroup:\n                                        description: |-\n                                          The GID to run the entrypoint of the container process.\n                                          Uses runtime default if unset.\n                                          May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        format: int64\n                                        type: integer\n                                      runAsNonRoot:\n                                        description: |-\n                                          Indicates that the container must run as a non-root user.\n                                          If true, the Kubelet will validate the image at runtime to ensure that it\n                                          does not run as UID 0 (root) and fail to start the container if it does.\n                                          If unset or false, no such validation will be performed.\n                                          May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                        type: boolean\n                                      runAsUser:\n                                        description: |-\n                                          The UID to run the entrypoint of the container process.\n                                          Defaults to user specified in image metadata if unspecified.\n                                          May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        format: int64\n                                        type: integer\n                                      seLinuxOptions:\n                                        description: |-\n                                          The SELinux context to be applied to the container.\n                                          If unspecified, the container runtime will allocate a random SELinux context for each\n                                          container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        properties:\n                                          level:\n                                            description: Level is SELinux level label\n                                              that applies to the container.\n                                            type: string\n                                          role:\n                                            description: Role is a SELinux role label\n                                              that applies to the container.\n                                            type: string\n                                          type:\n                                            description: Type is a SELinux type label\n                                              that applies to the container.\n                                            type: string\n                                          user:\n                                            description: User is a SELinux user label\n                                              that applies to the container.\n                                            type: string\n                                        type: object\n                                      seccompProfile:\n                                        description: |-\n                                          The seccomp options to use by this container. If seccomp options are\n                                          provided at both the pod & container level, the container options\n                                          override the pod options.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        properties:\n                                          localhostProfile:\n                                            description: |-\n                                              localhostProfile indicates a profile defined in a file on the node should be used.\n                                              The profile must be preconfigured on the node to work.\n                                              Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                              Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                            type: string\n                                          type:\n                                            description: |-\n                                              type indicates which kind of seccomp profile will be applied.\n                                              Valid options are:\n\n\n                                              Localhost - a profile defined in a file on the node should be used.\n                                              RuntimeDefault - the container runtime default profile should be used.\n                                              Unconfined - no profile should be applied.\n                                            type: string\n                                        required:\n                                        - type\n                                        type: object\n                                      windowsOptions:\n                                        description: |-\n                                          The Windows specific settings applied to all containers.\n                                          If unspecified, the options from the PodSecurityContext will be used.\n                                          If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is linux.\n                                        properties:\n                                          gmsaCredentialSpec:\n                                            description: |-\n                                              GMSACredentialSpec is where the GMSA admission webhook\n                                              (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                              GMSA credential spec named by the GMSACredentialSpecName field.\n                                            type: string\n                                          gmsaCredentialSpecName:\n                                            description: GMSACredentialSpecName is\n                                              the name of the GMSA credential spec\n                                              to use.\n                                            type: string\n                                          hostProcess:\n                                            description: |-\n                                              HostProcess determines if a container should be run as a 'Host Process' container.\n                                              All of a Pod's containers must have the same effective HostProcess value\n                                              (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                              In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                            type: boolean\n                                          runAsUserName:\n                                            description: |-\n                                              The UserName in Windows to run the entrypoint of the container process.\n                                              Defaults to the user specified in image metadata if unspecified.\n                                              May also be set in PodSecurityContext. If set in both SecurityContext and\n                                              PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                            type: string\n                                        type: object\n                                    type: object\n                                  startupProbe:\n                                    description: Probes are not allowed for ephemeral\n                                      containers.\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      failureThreshold:\n                                        description: |-\n                                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                          Defaults to 3. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      grpc:\n                                        description: GRPC specifies an action involving\n                                          a GRPC port.\n                                        properties:\n                                          port:\n                                            description: Port number of the gRPC service.\n                                              Number must be in the range 1 to 65535.\n                                            format: int32\n                                            type: integer\n                                          service:\n                                            description: |-\n                                              Service is the name of the service to place in the gRPC HealthCheckRequest\n                                              (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                              If this is not specified, the default behavior is defined by gRPC.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      initialDelaySeconds:\n                                        description: |-\n                                          Number of seconds after the container has started before liveness probes are initiated.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                      periodSeconds:\n                                        description: |-\n                                          How often (in seconds) to perform the probe.\n                                          Default to 10 seconds. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      successThreshold:\n                                        description: |-\n                                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                                          Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      tcpSocket:\n                                        description: TCPSocket specifies an action\n                                          involving a TCP port.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                      terminationGracePeriodSeconds:\n                                        description: |-\n                                          Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                          The grace period is the duration in seconds after the processes running in the pod are sent\n                                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                          Set this value longer than the expected cleanup time for your process.\n                                          If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                          value overrides the value provided by the pod spec.\n                                          Value must be non-negative integer. The value zero indicates stop immediately via\n                                          the kill signal (no opportunity to shut down).\n                                          This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                          Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                        format: int64\n                                        type: integer\n                                      timeoutSeconds:\n                                        description: |-\n                                          Number of seconds after which the probe times out.\n                                          Defaults to 1 second. Minimum value is 1.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                    type: object\n                                  stdin:\n                                    description: |-\n                                      Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                      is not set, reads from stdin in the container will always result in EOF.\n                                      Default is false.\n                                    type: boolean\n                                  stdinOnce:\n                                    description: |-\n                                      Whether the container runtime should close the stdin channel after it has been opened by\n                                      a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                      sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                      first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                      at which time stdin is closed and remains closed until the container is restarted. If this\n                                      flag is false, a container processes that reads from stdin will never receive an EOF.\n                                      Default is false\n                                    type: boolean\n                                  targetContainerName:\n                                    description: |-\n                                      If set, the name of the container from PodSpec that this ephemeral container targets.\n                                      The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container.\n                                      If not set then the ephemeral container uses the namespaces configured in the Pod spec.\n\n\n                                      The container runtime must implement support for this feature. If the runtime does not\n                                      support namespace targeting then the result of setting this field is undefined.\n                                    type: string\n                                  terminationMessagePath:\n                                    description: |-\n                                      Optional: Path at which the file to which the container's termination message\n                                      will be written is mounted into the container's filesystem.\n                                      Message written is intended to be brief final status, such as an assertion failure message.\n                                      Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                      all containers will be limited to 12kb.\n                                      Defaults to /dev/termination-log.\n                                      Cannot be updated.\n                                    type: string\n                                  terminationMessagePolicy:\n                                    description: |-\n                                      Indicate how the termination message should be populated. File will use the contents of\n                                      terminationMessagePath to populate the container status message on both success and failure.\n                                      FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                      message file is empty and the container exited with an error.\n                                      The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                      Defaults to File.\n                                      Cannot be updated.\n                                    type: string\n                                  tty:\n                                    description: |-\n                                      Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                      Default is false.\n                                    type: boolean\n                                  volumeDevices:\n                                    description: volumeDevices is the list of block\n                                      devices to be used by the container.\n                                    items:\n                                      description: volumeDevice describes a mapping\n                                        of a raw block device within a container.\n                                      properties:\n                                        devicePath:\n                                          description: devicePath is the path inside\n                                            of the container that the device will\n                                            be mapped to.\n                                          type: string\n                                        name:\n                                          description: name must match the name of\n                                            a persistentVolumeClaim in the pod\n                                          type: string\n                                      required:\n                                      - devicePath\n                                      - name\n                                      type: object\n                                    type: array\n                                  volumeMounts:\n                                    description: |-\n                                      Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers.\n                                      Cannot be updated.\n                                    items:\n                                      description: VolumeMount describes a mounting\n                                        of a Volume within a container.\n                                      properties:\n                                        mountPath:\n                                          description: |-\n                                            Path within the container at which the volume should be mounted.  Must\n                                            not contain ':'.\n                                          type: string\n                                        mountPropagation:\n                                          description: |-\n                                            mountPropagation determines how mounts are propagated from the host\n                                            to container and the other way around.\n                                            When not set, MountPropagationNone is used.\n                                            This field is beta in 1.10.\n                                          type: string\n                                        name:\n                                          description: This must match the Name of\n                                            a Volume.\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            Mounted read-only if true, read-write otherwise (false or unspecified).\n                                            Defaults to false.\n                                          type: boolean\n                                        subPath:\n                                          description: |-\n                                            Path within the volume from which the container's volume should be mounted.\n                                            Defaults to \"\" (volume's root).\n                                          type: string\n                                        subPathExpr:\n                                          description: |-\n                                            Expanded path within the volume from which the container's volume should be mounted.\n                                            Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                            Defaults to \"\" (volume's root).\n                                            SubPathExpr and SubPath are mutually exclusive.\n                                          type: string\n                                      required:\n                                      - mountPath\n                                      - name\n                                      type: object\n                                    type: array\n                                  workingDir:\n                                    description: |-\n                                      Container's working directory.\n                                      If not specified, the container runtime's default will be used, which\n                                      might be configured in the container image.\n                                      Cannot be updated.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            hostAliases:\n                              description: |-\n                                HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts\n                                file if specified. This is only valid for non-hostNetwork pods.\n                              items:\n                                description: |-\n                                  HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the\n                                  pod's hosts file.\n                                properties:\n                                  hostnames:\n                                    description: Hostnames for the above IP address.\n                                    items:\n                                      type: string\n                                    type: array\n                                  ip:\n                                    description: IP address of the host file entry.\n                                    type: string\n                                type: object\n                              type: array\n                            hostIPC:\n                              description: |-\n                                Use the host's ipc namespace.\n                                Optional: Default to false.\n                              type: boolean\n                            hostNetwork:\n                              description: |-\n                                Host networking requested for this pod. Use the host's network namespace.\n                                If this option is set, the ports that will be used must be specified.\n                                Default to false.\n                              type: boolean\n                            hostPID:\n                              description: |-\n                                Use the host's pid namespace.\n                                Optional: Default to false.\n                              type: boolean\n                            hostUsers:\n                              description: |-\n                                Use the host's user namespace.\n                                Optional: Default to true.\n                                If set to true or not present, the pod will be run in the host user namespace, useful\n                                for when the pod needs a feature only available to the host user namespace, such as\n                                loading a kernel module with CAP_SYS_MODULE.\n                                When set to false, a new userns is created for the pod. Setting false is useful for\n                                mitigating container breakout vulnerabilities even allowing users to run their\n                                containers as root without actually having root privileges on the host.\n                                This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.\n                              type: boolean\n                            hostname:\n                              description: |-\n                                Specifies the hostname of the Pod\n                                If not specified, the pod's hostname will be set to a system-defined value.\n                              type: string\n                            imagePullSecrets:\n                              description: |-\n                                ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec.\n                                If specified, these secrets will be passed to individual puller implementations for them to use.\n                                More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod\n                              items:\n                                description: |-\n                                  LocalObjectReference contains enough information to let you locate the\n                                  referenced object inside the same namespace.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              type: array\n                            initContainers:\n                              description: |-\n                                List of initialization containers belonging to the pod.\n                                Init containers are executed in order prior to containers being started. If any\n                                init container fails, the pod is considered to have failed and is handled according\n                                to its restartPolicy. The name for an init container or normal container must be\n                                unique among all containers.\n                                Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes.\n                                The resourceRequirements of an init container are taken into account during scheduling\n                                by finding the highest request/limit for each resource type, and then using the max of\n                                of that value or the sum of the normal containers. Limits are applied to init containers\n                                in a similar fashion.\n                                Init containers cannot currently be added or removed.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n                              items:\n                                description: A single application container that you\n                                  want to run within a pod.\n                                properties:\n                                  args:\n                                    description: |-\n                                      Arguments to the entrypoint.\n                                      The container image's CMD is used if this is not provided.\n                                      Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                      cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                      produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                      of whether the variable exists or not. Cannot be updated.\n                                      More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                    items:\n                                      type: string\n                                    type: array\n                                  command:\n                                    description: |-\n                                      Entrypoint array. Not executed within a shell.\n                                      The container image's ENTRYPOINT is used if this is not provided.\n                                      Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                      cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                      produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                      of whether the variable exists or not. Cannot be updated.\n                                      More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                                    items:\n                                      type: string\n                                    type: array\n                                  env:\n                                    description: |-\n                                      List of environment variables to set in the container.\n                                      Cannot be updated.\n                                    items:\n                                      description: EnvVar represents an environment\n                                        variable present in a Container.\n                                      properties:\n                                        name:\n                                          description: Name of the environment variable.\n                                            Must be a C_IDENTIFIER.\n                                          type: string\n                                        value:\n                                          description: |-\n                                            Variable references $(VAR_NAME) are expanded\n                                            using the previously defined environment variables in the container and\n                                            any service environment variables. If a variable cannot be resolved,\n                                            the reference in the input string will be unchanged. Double $$ are reduced\n                                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                            \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                            Escaped references will never be expanded, regardless of whether the variable\n                                            exists or not.\n                                            Defaults to \"\".\n                                          type: string\n                                        valueFrom:\n                                          description: Source for the environment\n                                            variable's value. Cannot be used if value\n                                            is not empty.\n                                          properties:\n                                            configMapKeyRef:\n                                              description: Selects a key of a ConfigMap.\n                                              properties:\n                                                key:\n                                                  description: The key to select.\n                                                  type: string\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: Specify whether the\n                                                    ConfigMap or its key must be defined\n                                                  type: boolean\n                                              required:\n                                              - key\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            fieldRef:\n                                              description: |-\n                                                Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                                spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                              properties:\n                                                apiVersion:\n                                                  description: Version of the schema\n                                                    the FieldPath is written in terms\n                                                    of, defaults to \"v1\".\n                                                  type: string\n                                                fieldPath:\n                                                  description: Path of the field to\n                                                    select in the specified API version.\n                                                  type: string\n                                              required:\n                                              - fieldPath\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            resourceFieldRef:\n                                              description: |-\n                                                Selects a resource of the container: only resources limits and requests\n                                                (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                              properties:\n                                                containerName:\n                                                  description: 'Container name: required\n                                                    for volumes, optional for env\n                                                    vars'\n                                                  type: string\n                                                divisor:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  description: Specifies the output\n                                                    format of the exposed resources,\n                                                    defaults to \"1\"\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                resource:\n                                                  description: 'Required: resource\n                                                    to select'\n                                                  type: string\n                                              required:\n                                              - resource\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            secretKeyRef:\n                                              description: Selects a key of a secret\n                                                in the pod's namespace\n                                              properties:\n                                                key:\n                                                  description: The key of the secret\n                                                    to select from.  Must be a valid\n                                                    secret key.\n                                                  type: string\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: Specify whether the\n                                                    Secret or its key must be defined\n                                                  type: boolean\n                                              required:\n                                              - key\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                          type: object\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                  envFrom:\n                                    description: |-\n                                      List of sources to populate environment variables in the container.\n                                      The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                      will be reported as an event when the container is starting. When a key exists in multiple\n                                      sources, the value associated with the last source will take precedence.\n                                      Values defined by an Env with a duplicate key will take precedence.\n                                      Cannot be updated.\n                                    items:\n                                      description: EnvFromSource represents the source\n                                        of a set of ConfigMaps\n                                      properties:\n                                        configMapRef:\n                                          description: The ConfigMap to select from\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                must be defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        prefix:\n                                          description: An optional identifier to prepend\n                                            to each key in the ConfigMap. Must be\n                                            a C_IDENTIFIER.\n                                          type: string\n                                        secretRef:\n                                          description: The Secret to select from\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                must be defined\n                                              type: boolean\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                    type: array\n                                  image:\n                                    description: |-\n                                      Container image name.\n                                      More info: https://kubernetes.io/docs/concepts/containers/images\n                                      This field is optional to allow higher level config management to default or override\n                                      container images in workload controllers like Deployments and StatefulSets.\n                                    type: string\n                                  imagePullPolicy:\n                                    description: |-\n                                      Image pull policy.\n                                      One of Always, Never, IfNotPresent.\n                                      Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                      Cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                                    type: string\n                                  lifecycle:\n                                    description: |-\n                                      Actions that the management system should take in response to container lifecycle events.\n                                      Cannot be updated.\n                                    properties:\n                                      postStart:\n                                        description: |-\n                                          PostStart is called immediately after a container is created. If the handler fails,\n                                          the container is terminated and restarted according to its restart policy.\n                                          Other management of the container blocks until the hook completes.\n                                          More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                        properties:\n                                          exec:\n                                            description: Exec specifies the action\n                                              to take.\n                                            properties:\n                                              command:\n                                                description: |-\n                                                  Command is the command line to execute inside the container, the working directory for the\n                                                  command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                                  not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                                  a shell, you need to explicitly call out to that shell.\n                                                  Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            type: object\n                                          httpGet:\n                                            description: HTTPGet specifies the http\n                                              request to perform.\n                                            properties:\n                                              host:\n                                                description: |-\n                                                  Host name to connect to, defaults to the pod IP. You probably want to set\n                                                  \"Host\" in httpHeaders instead.\n                                                type: string\n                                              httpHeaders:\n                                                description: Custom headers to set\n                                                  in the request. HTTP allows repeated\n                                                  headers.\n                                                items:\n                                                  description: HTTPHeader describes\n                                                    a custom header to be used in\n                                                    HTTP probes\n                                                  properties:\n                                                    name:\n                                                      description: |-\n                                                        The header field name.\n                                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                      type: string\n                                                    value:\n                                                      description: The header field\n                                                        value\n                                                      type: string\n                                                  required:\n                                                  - name\n                                                  - value\n                                                  type: object\n                                                type: array\n                                              path:\n                                                description: Path to access on the\n                                                  HTTP server.\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Name or number of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                              scheme:\n                                                description: |-\n                                                  Scheme to use for connecting to the host.\n                                                  Defaults to HTTP.\n                                                type: string\n                                            required:\n                                            - port\n                                            type: object\n                                          sleep:\n                                            description: Sleep represents the duration\n                                              that the container should sleep before\n                                              being terminated.\n                                            properties:\n                                              seconds:\n                                                description: Seconds is the number\n                                                  of seconds to sleep.\n                                                format: int64\n                                                type: integer\n                                            required:\n                                            - seconds\n                                            type: object\n                                          tcpSocket:\n                                            description: |-\n                                              Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                              for the backward compatibility. There are no validation of this field and\n                                              lifecycle hooks will fail in runtime when tcp handler is specified.\n                                            properties:\n                                              host:\n                                                description: 'Optional: Host name\n                                                  to connect to, defaults to the pod\n                                                  IP.'\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Number or name of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                            required:\n                                            - port\n                                            type: object\n                                        type: object\n                                      preStop:\n                                        description: |-\n                                          PreStop is called immediately before a container is terminated due to an\n                                          API request or management event such as liveness/startup probe failure,\n                                          preemption, resource contention, etc. The handler is not called if the\n                                          container crashes or exits. The Pod's termination grace period countdown begins before the\n                                          PreStop hook is executed. Regardless of the outcome of the handler, the\n                                          container will eventually terminate within the Pod's termination grace\n                                          period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                          or until the termination grace period is reached.\n                                          More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                        properties:\n                                          exec:\n                                            description: Exec specifies the action\n                                              to take.\n                                            properties:\n                                              command:\n                                                description: |-\n                                                  Command is the command line to execute inside the container, the working directory for the\n                                                  command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                                  not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                                  a shell, you need to explicitly call out to that shell.\n                                                  Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            type: object\n                                          httpGet:\n                                            description: HTTPGet specifies the http\n                                              request to perform.\n                                            properties:\n                                              host:\n                                                description: |-\n                                                  Host name to connect to, defaults to the pod IP. You probably want to set\n                                                  \"Host\" in httpHeaders instead.\n                                                type: string\n                                              httpHeaders:\n                                                description: Custom headers to set\n                                                  in the request. HTTP allows repeated\n                                                  headers.\n                                                items:\n                                                  description: HTTPHeader describes\n                                                    a custom header to be used in\n                                                    HTTP probes\n                                                  properties:\n                                                    name:\n                                                      description: |-\n                                                        The header field name.\n                                                        This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                      type: string\n                                                    value:\n                                                      description: The header field\n                                                        value\n                                                      type: string\n                                                  required:\n                                                  - name\n                                                  - value\n                                                  type: object\n                                                type: array\n                                              path:\n                                                description: Path to access on the\n                                                  HTTP server.\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Name or number of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                              scheme:\n                                                description: |-\n                                                  Scheme to use for connecting to the host.\n                                                  Defaults to HTTP.\n                                                type: string\n                                            required:\n                                            - port\n                                            type: object\n                                          sleep:\n                                            description: Sleep represents the duration\n                                              that the container should sleep before\n                                              being terminated.\n                                            properties:\n                                              seconds:\n                                                description: Seconds is the number\n                                                  of seconds to sleep.\n                                                format: int64\n                                                type: integer\n                                            required:\n                                            - seconds\n                                            type: object\n                                          tcpSocket:\n                                            description: |-\n                                              Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                              for the backward compatibility. There are no validation of this field and\n                                              lifecycle hooks will fail in runtime when tcp handler is specified.\n                                            properties:\n                                              host:\n                                                description: 'Optional: Host name\n                                                  to connect to, defaults to the pod\n                                                  IP.'\n                                                type: string\n                                              port:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                description: |-\n                                                  Number or name of the port to access on the container.\n                                                  Number must be in the range 1 to 65535.\n                                                  Name must be an IANA_SVC_NAME.\n                                                x-kubernetes-int-or-string: true\n                                            required:\n                                            - port\n                                            type: object\n                                        type: object\n                                    type: object\n                                  livenessProbe:\n                                    description: |-\n                                      Periodic probe of container liveness.\n                                      Container will be restarted if the probe fails.\n                                      Cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      failureThreshold:\n                                        description: |-\n                                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                          Defaults to 3. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      grpc:\n                                        description: GRPC specifies an action involving\n                                          a GRPC port.\n                                        properties:\n                                          port:\n                                            description: Port number of the gRPC service.\n                                              Number must be in the range 1 to 65535.\n                                            format: int32\n                                            type: integer\n                                          service:\n                                            description: |-\n                                              Service is the name of the service to place in the gRPC HealthCheckRequest\n                                              (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                              If this is not specified, the default behavior is defined by gRPC.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      initialDelaySeconds:\n                                        description: |-\n                                          Number of seconds after the container has started before liveness probes are initiated.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                      periodSeconds:\n                                        description: |-\n                                          How often (in seconds) to perform the probe.\n                                          Default to 10 seconds. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      successThreshold:\n                                        description: |-\n                                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                                          Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      tcpSocket:\n                                        description: TCPSocket specifies an action\n                                          involving a TCP port.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                      terminationGracePeriodSeconds:\n                                        description: |-\n                                          Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                          The grace period is the duration in seconds after the processes running in the pod are sent\n                                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                          Set this value longer than the expected cleanup time for your process.\n                                          If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                          value overrides the value provided by the pod spec.\n                                          Value must be non-negative integer. The value zero indicates stop immediately via\n                                          the kill signal (no opportunity to shut down).\n                                          This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                          Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                        format: int64\n                                        type: integer\n                                      timeoutSeconds:\n                                        description: |-\n                                          Number of seconds after which the probe times out.\n                                          Defaults to 1 second. Minimum value is 1.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                    type: object\n                                  name:\n                                    description: |-\n                                      Name of the container specified as a DNS_LABEL.\n                                      Each container in a pod must have a unique name (DNS_LABEL).\n                                      Cannot be updated.\n                                    type: string\n                                  ports:\n                                    description: |-\n                                      List of ports to expose from the container. Not specifying a port here\n                                      DOES NOT prevent that port from being exposed. Any port which is\n                                      listening on the default \"0.0.0.0\" address inside a container will be\n                                      accessible from the network.\n                                      Modifying this array with strategic merge patch may corrupt the data.\n                                      For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                                      Cannot be updated.\n                                    items:\n                                      description: ContainerPort represents a network\n                                        port in a single container.\n                                      properties:\n                                        containerPort:\n                                          description: |-\n                                            Number of port to expose on the pod's IP address.\n                                            This must be a valid port number, 0 < x < 65536.\n                                          format: int32\n                                          type: integer\n                                        hostIP:\n                                          description: What host IP to bind the external\n                                            port to.\n                                          type: string\n                                        hostPort:\n                                          description: |-\n                                            Number of port to expose on the host.\n                                            If specified, this must be a valid port number, 0 < x < 65536.\n                                            If HostNetwork is specified, this must match ContainerPort.\n                                            Most containers do not need this.\n                                          format: int32\n                                          type: integer\n                                        name:\n                                          description: |-\n                                            If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                            named port in a pod must have a unique name. Name for the port that can be\n                                            referred to by services.\n                                          type: string\n                                        protocol:\n                                          default: TCP\n                                          description: |-\n                                            Protocol for port. Must be UDP, TCP, or SCTP.\n                                            Defaults to \"TCP\".\n                                          type: string\n                                      required:\n                                      - containerPort\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - containerPort\n                                    - protocol\n                                    x-kubernetes-list-type: map\n                                  readinessProbe:\n                                    description: |-\n                                      Periodic probe of container service readiness.\n                                      Container will be removed from service endpoints if the probe fails.\n                                      Cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      failureThreshold:\n                                        description: |-\n                                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                          Defaults to 3. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      grpc:\n                                        description: GRPC specifies an action involving\n                                          a GRPC port.\n                                        properties:\n                                          port:\n                                            description: Port number of the gRPC service.\n                                              Number must be in the range 1 to 65535.\n                                            format: int32\n                                            type: integer\n                                          service:\n                                            description: |-\n                                              Service is the name of the service to place in the gRPC HealthCheckRequest\n                                              (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                              If this is not specified, the default behavior is defined by gRPC.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      initialDelaySeconds:\n                                        description: |-\n                                          Number of seconds after the container has started before liveness probes are initiated.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                      periodSeconds:\n                                        description: |-\n                                          How often (in seconds) to perform the probe.\n                                          Default to 10 seconds. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      successThreshold:\n                                        description: |-\n                                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                                          Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      tcpSocket:\n                                        description: TCPSocket specifies an action\n                                          involving a TCP port.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                      terminationGracePeriodSeconds:\n                                        description: |-\n                                          Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                          The grace period is the duration in seconds after the processes running in the pod are sent\n                                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                          Set this value longer than the expected cleanup time for your process.\n                                          If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                          value overrides the value provided by the pod spec.\n                                          Value must be non-negative integer. The value zero indicates stop immediately via\n                                          the kill signal (no opportunity to shut down).\n                                          This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                          Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                        format: int64\n                                        type: integer\n                                      timeoutSeconds:\n                                        description: |-\n                                          Number of seconds after which the probe times out.\n                                          Defaults to 1 second. Minimum value is 1.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                    type: object\n                                  resizePolicy:\n                                    description: Resources resize policy for the container.\n                                    items:\n                                      description: ContainerResizePolicy represents\n                                        resource resize policy for the container.\n                                      properties:\n                                        resourceName:\n                                          description: |-\n                                            Name of the resource to which this resource resize policy applies.\n                                            Supported values: cpu, memory.\n                                          type: string\n                                        restartPolicy:\n                                          description: |-\n                                            Restart policy to apply when specified resource is resized.\n                                            If not specified, it defaults to NotRequired.\n                                          type: string\n                                      required:\n                                      - resourceName\n                                      - restartPolicy\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-type: atomic\n                                  resources:\n                                    description: |-\n                                      Compute Resources required by this container.\n                                      Cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    properties:\n                                      claims:\n                                        description: |-\n                                          Claims lists the names of resources, defined in spec.resourceClaims,\n                                          that are used by this container.\n\n\n                                          This is an alpha field and requires enabling the\n                                          DynamicResourceAllocation feature gate.\n\n\n                                          This field is immutable. It can only be set for containers.\n                                        items:\n                                          description: ResourceClaim references one\n                                            entry in PodSpec.ResourceClaims.\n                                          properties:\n                                            name:\n                                              description: |-\n                                                Name must match the name of one entry in pod.spec.resourceClaims of\n                                                the Pod where this field is used. It makes that resource available\n                                                inside a container.\n                                              type: string\n                                          required:\n                                          - name\n                                          type: object\n                                        type: array\n                                        x-kubernetes-list-map-keys:\n                                        - name\n                                        x-kubernetes-list-type: map\n                                      limits:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Limits describes the maximum amount of compute resources allowed.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                      requests:\n                                        additionalProperties:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        description: |-\n                                          Requests describes the minimum amount of compute resources required.\n                                          If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                          otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                          More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                        type: object\n                                    type: object\n                                  restartPolicy:\n                                    description: |-\n                                      RestartPolicy defines the restart behavior of individual containers in a pod.\n                                      This field may only be set for init containers, and the only allowed value is \"Always\".\n                                      For non-init containers or when this field is not specified,\n                                      the restart behavior is defined by the Pod's restart policy and the container type.\n                                      Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                                      this init container will be continually restarted on\n                                      exit until all regular containers have terminated. Once all regular\n                                      containers have completed, all init containers with restartPolicy \"Always\"\n                                      will be shut down. This lifecycle differs from normal init containers and\n                                      is often referred to as a \"sidecar\" container. Although this init\n                                      container still starts in the init container sequence, it does not wait\n                                      for the container to complete before proceeding to the next init\n                                      container. Instead, the next init container starts immediately after this\n                                      init container is started, or after any startupProbe has successfully\n                                      completed.\n                                    type: string\n                                  securityContext:\n                                    description: |-\n                                      SecurityContext defines the security options the container should be run with.\n                                      If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                      More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                                    properties:\n                                      allowPrivilegeEscalation:\n                                        description: |-\n                                          AllowPrivilegeEscalation controls whether a process can gain more\n                                          privileges than its parent process. This bool directly controls if\n                                          the no_new_privs flag will be set on the container process.\n                                          AllowPrivilegeEscalation is true always when the container is:\n                                          1) run as Privileged\n                                          2) has CAP_SYS_ADMIN\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: boolean\n                                      capabilities:\n                                        description: |-\n                                          The capabilities to add/drop when running containers.\n                                          Defaults to the default set of capabilities granted by the container runtime.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        properties:\n                                          add:\n                                            description: Added capabilities\n                                            items:\n                                              description: Capability represent POSIX\n                                                capabilities type\n                                              type: string\n                                            type: array\n                                          drop:\n                                            description: Removed capabilities\n                                            items:\n                                              description: Capability represent POSIX\n                                                capabilities type\n                                              type: string\n                                            type: array\n                                        type: object\n                                      privileged:\n                                        description: |-\n                                          Run container in privileged mode.\n                                          Processes in privileged containers are essentially equivalent to root on the host.\n                                          Defaults to false.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: boolean\n                                      procMount:\n                                        description: |-\n                                          procMount denotes the type of proc mount to use for the containers.\n                                          The default is DefaultProcMount which uses the container runtime defaults for\n                                          readonly paths and masked paths.\n                                          This requires the ProcMountType feature flag to be enabled.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: string\n                                      readOnlyRootFilesystem:\n                                        description: |-\n                                          Whether this container has a read-only root filesystem.\n                                          Default is false.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        type: boolean\n                                      runAsGroup:\n                                        description: |-\n                                          The GID to run the entrypoint of the container process.\n                                          Uses runtime default if unset.\n                                          May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        format: int64\n                                        type: integer\n                                      runAsNonRoot:\n                                        description: |-\n                                          Indicates that the container must run as a non-root user.\n                                          If true, the Kubelet will validate the image at runtime to ensure that it\n                                          does not run as UID 0 (root) and fail to start the container if it does.\n                                          If unset or false, no such validation will be performed.\n                                          May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                        type: boolean\n                                      runAsUser:\n                                        description: |-\n                                          The UID to run the entrypoint of the container process.\n                                          Defaults to user specified in image metadata if unspecified.\n                                          May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        format: int64\n                                        type: integer\n                                      seLinuxOptions:\n                                        description: |-\n                                          The SELinux context to be applied to the container.\n                                          If unspecified, the container runtime will allocate a random SELinux context for each\n                                          container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                          PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        properties:\n                                          level:\n                                            description: Level is SELinux level label\n                                              that applies to the container.\n                                            type: string\n                                          role:\n                                            description: Role is a SELinux role label\n                                              that applies to the container.\n                                            type: string\n                                          type:\n                                            description: Type is a SELinux type label\n                                              that applies to the container.\n                                            type: string\n                                          user:\n                                            description: User is a SELinux user label\n                                              that applies to the container.\n                                            type: string\n                                        type: object\n                                      seccompProfile:\n                                        description: |-\n                                          The seccomp options to use by this container. If seccomp options are\n                                          provided at both the pod & container level, the container options\n                                          override the pod options.\n                                          Note that this field cannot be set when spec.os.name is windows.\n                                        properties:\n                                          localhostProfile:\n                                            description: |-\n                                              localhostProfile indicates a profile defined in a file on the node should be used.\n                                              The profile must be preconfigured on the node to work.\n                                              Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                              Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                            type: string\n                                          type:\n                                            description: |-\n                                              type indicates which kind of seccomp profile will be applied.\n                                              Valid options are:\n\n\n                                              Localhost - a profile defined in a file on the node should be used.\n                                              RuntimeDefault - the container runtime default profile should be used.\n                                              Unconfined - no profile should be applied.\n                                            type: string\n                                        required:\n                                        - type\n                                        type: object\n                                      windowsOptions:\n                                        description: |-\n                                          The Windows specific settings applied to all containers.\n                                          If unspecified, the options from the PodSecurityContext will be used.\n                                          If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                          Note that this field cannot be set when spec.os.name is linux.\n                                        properties:\n                                          gmsaCredentialSpec:\n                                            description: |-\n                                              GMSACredentialSpec is where the GMSA admission webhook\n                                              (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                              GMSA credential spec named by the GMSACredentialSpecName field.\n                                            type: string\n                                          gmsaCredentialSpecName:\n                                            description: GMSACredentialSpecName is\n                                              the name of the GMSA credential spec\n                                              to use.\n                                            type: string\n                                          hostProcess:\n                                            description: |-\n                                              HostProcess determines if a container should be run as a 'Host Process' container.\n                                              All of a Pod's containers must have the same effective HostProcess value\n                                              (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                              In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                            type: boolean\n                                          runAsUserName:\n                                            description: |-\n                                              The UserName in Windows to run the entrypoint of the container process.\n                                              Defaults to the user specified in image metadata if unspecified.\n                                              May also be set in PodSecurityContext. If set in both SecurityContext and\n                                              PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                            type: string\n                                        type: object\n                                    type: object\n                                  startupProbe:\n                                    description: |-\n                                      StartupProbe indicates that the Pod has successfully initialized.\n                                      If specified, no other probes are executed until this completes successfully.\n                                      If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                                      This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                                      when it might take a long time to load data or warm a cache, than during steady-state operation.\n                                      This cannot be updated.\n                                      More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                    properties:\n                                      exec:\n                                        description: Exec specifies the action to\n                                          take.\n                                        properties:\n                                          command:\n                                            description: |-\n                                              Command is the command line to execute inside the container, the working directory for the\n                                              command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                              not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                              a shell, you need to explicitly call out to that shell.\n                                              Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                            items:\n                                              type: string\n                                            type: array\n                                        type: object\n                                      failureThreshold:\n                                        description: |-\n                                          Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                          Defaults to 3. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      grpc:\n                                        description: GRPC specifies an action involving\n                                          a GRPC port.\n                                        properties:\n                                          port:\n                                            description: Port number of the gRPC service.\n                                              Number must be in the range 1 to 65535.\n                                            format: int32\n                                            type: integer\n                                          service:\n                                            description: |-\n                                              Service is the name of the service to place in the gRPC HealthCheckRequest\n                                              (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                              If this is not specified, the default behavior is defined by gRPC.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      httpGet:\n                                        description: HTTPGet specifies the http request\n                                          to perform.\n                                        properties:\n                                          host:\n                                            description: |-\n                                              Host name to connect to, defaults to the pod IP. You probably want to set\n                                              \"Host\" in httpHeaders instead.\n                                            type: string\n                                          httpHeaders:\n                                            description: Custom headers to set in\n                                              the request. HTTP allows repeated headers.\n                                            items:\n                                              description: HTTPHeader describes a\n                                                custom header to be used in HTTP probes\n                                              properties:\n                                                name:\n                                                  description: |-\n                                                    The header field name.\n                                                    This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                  type: string\n                                                value:\n                                                  description: The header field value\n                                                  type: string\n                                              required:\n                                              - name\n                                              - value\n                                              type: object\n                                            type: array\n                                          path:\n                                            description: Path to access on the HTTP\n                                              server.\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Name or number of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                          scheme:\n                                            description: |-\n                                              Scheme to use for connecting to the host.\n                                              Defaults to HTTP.\n                                            type: string\n                                        required:\n                                        - port\n                                        type: object\n                                      initialDelaySeconds:\n                                        description: |-\n                                          Number of seconds after the container has started before liveness probes are initiated.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                      periodSeconds:\n                                        description: |-\n                                          How often (in seconds) to perform the probe.\n                                          Default to 10 seconds. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      successThreshold:\n                                        description: |-\n                                          Minimum consecutive successes for the probe to be considered successful after having failed.\n                                          Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                        format: int32\n                                        type: integer\n                                      tcpSocket:\n                                        description: TCPSocket specifies an action\n                                          involving a TCP port.\n                                        properties:\n                                          host:\n                                            description: 'Optional: Host name to connect\n                                              to, defaults to the pod IP.'\n                                            type: string\n                                          port:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: |-\n                                              Number or name of the port to access on the container.\n                                              Number must be in the range 1 to 65535.\n                                              Name must be an IANA_SVC_NAME.\n                                            x-kubernetes-int-or-string: true\n                                        required:\n                                        - port\n                                        type: object\n                                      terminationGracePeriodSeconds:\n                                        description: |-\n                                          Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                          The grace period is the duration in seconds after the processes running in the pod are sent\n                                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                          Set this value longer than the expected cleanup time for your process.\n                                          If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                          value overrides the value provided by the pod spec.\n                                          Value must be non-negative integer. The value zero indicates stop immediately via\n                                          the kill signal (no opportunity to shut down).\n                                          This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                          Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                        format: int64\n                                        type: integer\n                                      timeoutSeconds:\n                                        description: |-\n                                          Number of seconds after which the probe times out.\n                                          Defaults to 1 second. Minimum value is 1.\n                                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                        format: int32\n                                        type: integer\n                                    type: object\n                                  stdin:\n                                    description: |-\n                                      Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                      is not set, reads from stdin in the container will always result in EOF.\n                                      Default is false.\n                                    type: boolean\n                                  stdinOnce:\n                                    description: |-\n                                      Whether the container runtime should close the stdin channel after it has been opened by\n                                      a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                      sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                      first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                      at which time stdin is closed and remains closed until the container is restarted. If this\n                                      flag is false, a container processes that reads from stdin will never receive an EOF.\n                                      Default is false\n                                    type: boolean\n                                  terminationMessagePath:\n                                    description: |-\n                                      Optional: Path at which the file to which the container's termination message\n                                      will be written is mounted into the container's filesystem.\n                                      Message written is intended to be brief final status, such as an assertion failure message.\n                                      Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                      all containers will be limited to 12kb.\n                                      Defaults to /dev/termination-log.\n                                      Cannot be updated.\n                                    type: string\n                                  terminationMessagePolicy:\n                                    description: |-\n                                      Indicate how the termination message should be populated. File will use the contents of\n                                      terminationMessagePath to populate the container status message on both success and failure.\n                                      FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                      message file is empty and the container exited with an error.\n                                      The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                      Defaults to File.\n                                      Cannot be updated.\n                                    type: string\n                                  tty:\n                                    description: |-\n                                      Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                      Default is false.\n                                    type: boolean\n                                  volumeDevices:\n                                    description: volumeDevices is the list of block\n                                      devices to be used by the container.\n                                    items:\n                                      description: volumeDevice describes a mapping\n                                        of a raw block device within a container.\n                                      properties:\n                                        devicePath:\n                                          description: devicePath is the path inside\n                                            of the container that the device will\n                                            be mapped to.\n                                          type: string\n                                        name:\n                                          description: name must match the name of\n                                            a persistentVolumeClaim in the pod\n                                          type: string\n                                      required:\n                                      - devicePath\n                                      - name\n                                      type: object\n                                    type: array\n                                  volumeMounts:\n                                    description: |-\n                                      Pod volumes to mount into the container's filesystem.\n                                      Cannot be updated.\n                                    items:\n                                      description: VolumeMount describes a mounting\n                                        of a Volume within a container.\n                                      properties:\n                                        mountPath:\n                                          description: |-\n                                            Path within the container at which the volume should be mounted.  Must\n                                            not contain ':'.\n                                          type: string\n                                        mountPropagation:\n                                          description: |-\n                                            mountPropagation determines how mounts are propagated from the host\n                                            to container and the other way around.\n                                            When not set, MountPropagationNone is used.\n                                            This field is beta in 1.10.\n                                          type: string\n                                        name:\n                                          description: This must match the Name of\n                                            a Volume.\n                                          type: string\n                                        readOnly:\n                                          description: |-\n                                            Mounted read-only if true, read-write otherwise (false or unspecified).\n                                            Defaults to false.\n                                          type: boolean\n                                        subPath:\n                                          description: |-\n                                            Path within the volume from which the container's volume should be mounted.\n                                            Defaults to \"\" (volume's root).\n                                          type: string\n                                        subPathExpr:\n                                          description: |-\n                                            Expanded path within the volume from which the container's volume should be mounted.\n                                            Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                            Defaults to \"\" (volume's root).\n                                            SubPathExpr and SubPath are mutually exclusive.\n                                          type: string\n                                      required:\n                                      - mountPath\n                                      - name\n                                      type: object\n                                    type: array\n                                  workingDir:\n                                    description: |-\n                                      Container's working directory.\n                                      If not specified, the container runtime's default will be used, which\n                                      might be configured in the container image.\n                                      Cannot be updated.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            nodeName:\n                              description: |-\n                                NodeName is a request to schedule this pod onto a specific node. If it is non-empty,\n                                the scheduler simply schedules this pod onto that node, assuming that it fits resource\n                                requirements.\n                              type: string\n                            nodeSelector:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                NodeSelector is a selector which must be true for the pod to fit on a node.\n                                Selector which must match a node's labels for the pod to be scheduled on that node.\n                                More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            os:\n                              description: |-\n                                Specifies the OS of the containers in the pod.\n                                Some pod and container fields are restricted if this is set.\n\n\n                                If the OS field is set to linux, the following fields must be unset:\n                                -securityContext.windowsOptions\n\n\n                                If the OS field is set to windows, following fields must be unset:\n                                - spec.hostPID\n                                - spec.hostIPC\n                                - spec.hostUsers\n                                - spec.securityContext.seLinuxOptions\n                                - spec.securityContext.seccompProfile\n                                - spec.securityContext.fsGroup\n                                - spec.securityContext.fsGroupChangePolicy\n                                - spec.securityContext.sysctls\n                                - spec.shareProcessNamespace\n                                - spec.securityContext.runAsUser\n                                - spec.securityContext.runAsGroup\n                                - spec.securityContext.supplementalGroups\n                                - spec.containers[*].securityContext.seLinuxOptions\n                                - spec.containers[*].securityContext.seccompProfile\n                                - spec.containers[*].securityContext.capabilities\n                                - spec.containers[*].securityContext.readOnlyRootFilesystem\n                                - spec.containers[*].securityContext.privileged\n                                - spec.containers[*].securityContext.allowPrivilegeEscalation\n                                - spec.containers[*].securityContext.procMount\n                                - spec.containers[*].securityContext.runAsUser\n                                - spec.containers[*].securityContext.runAsGroup\n                              properties:\n                                name:\n                                  description: |-\n                                    Name is the name of the operating system. The currently supported values are linux and windows.\n                                    Additional value may be defined in future and can be one of:\n                                    https://github.com/opencontainers/runtime-spec/blob/master/config.md#platform-specific-configuration\n                                    Clients should expect to handle additional values and treat unrecognized values in this field as os: null\n                                  type: string\n                              required:\n                              - name\n                              type: object\n                            overhead:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Overhead represents the resource overhead associated with running a pod for a given RuntimeClass.\n                                This field will be autopopulated at admission time by the RuntimeClass admission controller. If\n                                the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests.\n                                The RuntimeClass admission controller will reject Pod create requests which have the overhead already\n                                set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value\n                                defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero.\n                                More info: https://git.k8s.io/enhancements/keps/sig-node/688-pod-overhead/README.md\n                              type: object\n                            preemptionPolicy:\n                              description: |-\n                                PreemptionPolicy is the Policy for preempting pods with lower priority.\n                                One of Never, PreemptLowerPriority.\n                                Defaults to PreemptLowerPriority if unset.\n                              type: string\n                            priority:\n                              description: |-\n                                The priority value. Various system components use this field to find the\n                                priority of the pod. When Priority Admission Controller is enabled, it\n                                prevents users from setting this field. The admission controller populates\n                                this field from PriorityClassName.\n                                The higher the value, the higher the priority.\n                              format: int32\n                              type: integer\n                            priorityClassName:\n                              description: |-\n                                If specified, indicates the pod's priority. \"system-node-critical\" and\n                                \"system-cluster-critical\" are two special keywords which indicate the\n                                highest priorities with the former being the highest priority. Any other\n                                name must be defined by creating a PriorityClass object with that name.\n                                If not specified, the pod priority will be default or zero if there is no\n                                default.\n                              type: string\n                            readinessGates:\n                              description: |-\n                                If specified, all readiness gates will be evaluated for pod readiness.\n                                A pod is ready when all its containers are ready AND\n                                all conditions specified in the readiness gates have status equal to \"True\"\n                                More info: https://git.k8s.io/enhancements/keps/sig-network/580-pod-readiness-gates\n                              items:\n                                description: PodReadinessGate contains the reference\n                                  to a pod condition\n                                properties:\n                                  conditionType:\n                                    description: ConditionType refers to a condition\n                                      in the pod's condition list with matching type.\n                                    type: string\n                                required:\n                                - conditionType\n                                type: object\n                              type: array\n                            resourceClaims:\n                              description: |-\n                                ResourceClaims defines which ResourceClaims must be allocated\n                                and reserved before the Pod is allowed to start. The resources\n                                will be made available to those containers which consume them\n                                by name.\n\n\n                                This is an alpha field and requires enabling the\n                                DynamicResourceAllocation feature gate.\n\n\n                                This field is immutable.\n                              items:\n                                description: |-\n                                  PodResourceClaim references exactly one ResourceClaim through a ClaimSource.\n                                  It adds a name to it that uniquely identifies the ResourceClaim inside the Pod.\n                                  Containers that need access to the ResourceClaim reference it with this name.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name uniquely identifies this resource claim inside the pod.\n                                      This must be a DNS_LABEL.\n                                    type: string\n                                  source:\n                                    description: Source describes where to find the\n                                      ResourceClaim.\n                                    properties:\n                                      resourceClaimName:\n                                        description: |-\n                                          ResourceClaimName is the name of a ResourceClaim object in the same\n                                          namespace as this pod.\n                                        type: string\n                                      resourceClaimTemplateName:\n                                        description: |-\n                                          ResourceClaimTemplateName is the name of a ResourceClaimTemplate\n                                          object in the same namespace as this pod.\n\n\n                                          The template will be used to create a new ResourceClaim, which will\n                                          be bound to this pod. When this pod is deleted, the ResourceClaim\n                                          will also be deleted. The pod name and resource name, along with a\n                                          generated component, will be used to form a unique name for the\n                                          ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses.\n\n\n                                          This field is immutable and no changes will be made to the\n                                          corresponding ResourceClaim by the control plane after creating the\n                                          ResourceClaim.\n                                        type: string\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            restartPolicy:\n                              description: |-\n                                Restart policy for all containers within the pod.\n                                One of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted.\n                                Default to Always.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy\n                              type: string\n                            runtimeClassName:\n                              description: |-\n                                RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used\n                                to run this pod.  If no RuntimeClass resource matches the named class, the pod will not be run.\n                                If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an\n                                empty definition that uses the default runtime handler.\n                                More info: https://git.k8s.io/enhancements/keps/sig-node/585-runtime-class\n                              type: string\n                            schedulerName:\n                              description: |-\n                                If specified, the pod will be dispatched by specified scheduler.\n                                If not specified, the pod will be dispatched by default scheduler.\n                              type: string\n                            schedulingGates:\n                              description: |-\n                                SchedulingGates is an opaque list of values that if specified will block scheduling the pod.\n                                If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the\n                                scheduler will not attempt to schedule the pod.\n\n\n                                SchedulingGates can only be set at pod creation time, and be removed only afterwards.\n\n\n                                This is a beta feature enabled by the PodSchedulingReadiness feature gate.\n                              items:\n                                description: PodSchedulingGate is associated to a\n                                  Pod to guard its scheduling.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the scheduling gate.\n                                      Each scheduling gate must have a unique name field.\n                                    type: string\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - name\n                              x-kubernetes-list-type: map\n                            securityContext:\n                              description: |-\n                                SecurityContext holds pod-level security attributes and common container settings.\n                                Optional: Defaults to empty.  See type description for default values of each field.\n                              properties:\n                                fsGroup:\n                                  description: |-\n                                    A special supplemental group that applies to all containers in a pod.\n                                    Some volume types allow the Kubelet to change the ownership of that volume\n                                    to be owned by the pod:\n\n\n                                    1. The owning GID will be the FSGroup\n                                    2. The setgid bit is set (new files created in the volume will be owned by FSGroup)\n                                    3. The permission bits are OR'd with rw-rw----\n\n\n                                    If unset, the Kubelet will not modify the ownership and permissions of any volume.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                fsGroupChangePolicy:\n                                  description: |-\n                                    fsGroupChangePolicy defines behavior of changing ownership and permission of the volume\n                                    before being exposed inside Pod. This field will only apply to\n                                    volume types which support fsGroup based ownership(and permissions).\n                                    It will have no effect on ephemeral volume types such as: secret, configmaps\n                                    and emptydir.\n                                    Valid values are \"OnRootMismatch\" and \"Always\". If not specified, \"Always\" is used.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: string\n                                runAsGroup:\n                                  description: |-\n                                    The GID to run the entrypoint of the container process.\n                                    Uses runtime default if unset.\n                                    May also be set in SecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence\n                                    for that container.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                runAsNonRoot:\n                                  description: |-\n                                    Indicates that the container must run as a non-root user.\n                                    If true, the Kubelet will validate the image at runtime to ensure that it\n                                    does not run as UID 0 (root) and fail to start the container if it does.\n                                    If unset or false, no such validation will be performed.\n                                    May also be set in SecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: boolean\n                                runAsUser:\n                                  description: |-\n                                    The UID to run the entrypoint of the container process.\n                                    Defaults to user specified in image metadata if unspecified.\n                                    May also be set in SecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence\n                                    for that container.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                seLinuxOptions:\n                                  description: |-\n                                    The SELinux context to be applied to all containers.\n                                    If unspecified, the container runtime will allocate a random SELinux context for each\n                                    container.  May also be set in SecurityContext.  If set in\n                                    both SecurityContext and PodSecurityContext, the value specified in SecurityContext\n                                    takes precedence for that container.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    level:\n                                      description: Level is SELinux level label that\n                                        applies to the container.\n                                      type: string\n                                    role:\n                                      description: Role is a SELinux role label that\n                                        applies to the container.\n                                      type: string\n                                    type:\n                                      description: Type is a SELinux type label that\n                                        applies to the container.\n                                      type: string\n                                    user:\n                                      description: User is a SELinux user label that\n                                        applies to the container.\n                                      type: string\n                                  type: object\n                                seccompProfile:\n                                  description: |-\n                                    The seccomp options to use by the containers in this pod.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    localhostProfile:\n                                      description: |-\n                                        localhostProfile indicates a profile defined in a file on the node should be used.\n                                        The profile must be preconfigured on the node to work.\n                                        Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                        Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                      type: string\n                                    type:\n                                      description: |-\n                                        type indicates which kind of seccomp profile will be applied.\n                                        Valid options are:\n\n\n                                        Localhost - a profile defined in a file on the node should be used.\n                                        RuntimeDefault - the container runtime default profile should be used.\n                                        Unconfined - no profile should be applied.\n                                      type: string\n                                  required:\n                                  - type\n                                  type: object\n                                supplementalGroups:\n                                  description: |-\n                                    A list of groups applied to the first process run in each container, in addition\n                                    to the container's primary GID, the fsGroup (if specified), and group memberships\n                                    defined in the container image for the uid of the container process. If unspecified,\n                                    no additional groups are added to any container. Note that group memberships\n                                    defined in the container image for the uid of the container process are still effective,\n                                    even if they are not included in this list.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  items:\n                                    format: int64\n                                    type: integer\n                                  type: array\n                                sysctls:\n                                  description: |-\n                                    Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported\n                                    sysctls (by the container runtime) might fail to launch.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  items:\n                                    description: Sysctl defines a kernel parameter\n                                      to be set\n                                    properties:\n                                      name:\n                                        description: Name of a property to set\n                                        type: string\n                                      value:\n                                        description: Value of a property to set\n                                        type: string\n                                    required:\n                                    - name\n                                    - value\n                                    type: object\n                                  type: array\n                                windowsOptions:\n                                  description: |-\n                                    The Windows specific settings applied to all containers.\n                                    If unspecified, the options within a container's SecurityContext will be used.\n                                    If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is linux.\n                                  properties:\n                                    gmsaCredentialSpec:\n                                      description: |-\n                                        GMSACredentialSpec is where the GMSA admission webhook\n                                        (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                        GMSA credential spec named by the GMSACredentialSpecName field.\n                                      type: string\n                                    gmsaCredentialSpecName:\n                                      description: GMSACredentialSpecName is the name\n                                        of the GMSA credential spec to use.\n                                      type: string\n                                    hostProcess:\n                                      description: |-\n                                        HostProcess determines if a container should be run as a 'Host Process' container.\n                                        All of a Pod's containers must have the same effective HostProcess value\n                                        (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                        In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                      type: boolean\n                                    runAsUserName:\n                                      description: |-\n                                        The UserName in Windows to run the entrypoint of the container process.\n                                        Defaults to the user specified in image metadata if unspecified.\n                                        May also be set in PodSecurityContext. If set in both SecurityContext and\n                                        PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      type: string\n                                  type: object\n                              type: object\n                            serviceAccount:\n                              description: |-\n                                DeprecatedServiceAccount is a depreciated alias for ServiceAccountName.\n                                Deprecated: Use serviceAccountName instead.\n                              type: string\n                            serviceAccountName:\n                              description: |-\n                                ServiceAccountName is the name of the ServiceAccount to use to run this pod.\n                                More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n                              type: string\n                            setHostnameAsFQDN:\n                              description: |-\n                                If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default).\n                                In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname).\n                                In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip\\\\Parameters to FQDN.\n                                If a pod does not have FQDN, this has no effect.\n                                Default to false.\n                              type: boolean\n                            shareProcessNamespace:\n                              description: |-\n                                Share a single process namespace between all of the containers in a pod.\n                                When this is set containers will be able to view and signal processes from other containers\n                                in the same pod, and the first process in each container will not be assigned PID 1.\n                                HostPID and ShareProcessNamespace cannot both be set.\n                                Optional: Default to false.\n                              type: boolean\n                            subdomain:\n                              description: |-\n                                If specified, the fully qualified Pod hostname will be \"<hostname>.<subdomain>.<pod namespace>.svc.<cluster domain>\".\n                                If not specified, the pod will not have a domainname at all.\n                              type: string\n                            terminationGracePeriodSeconds:\n                              description: |-\n                                Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request.\n                                Value must be non-negative integer. The value zero indicates stop immediately via\n                                the kill signal (no opportunity to shut down).\n                                If this value is nil, the default grace period will be used instead.\n                                The grace period is the duration in seconds after the processes running in the pod are sent\n                                a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                Set this value longer than the expected cleanup time for your process.\n                                Defaults to 30 seconds.\n                              format: int64\n                              type: integer\n                            tolerations:\n                              description: If specified, the pod's tolerations.\n                              items:\n                                description: |-\n                                  The pod this Toleration is attached to tolerates any taint that matches\n                                  the triple <key,value,effect> using the matching operator <operator>.\n                                properties:\n                                  effect:\n                                    description: |-\n                                      Effect indicates the taint effect to match. Empty means match all taint effects.\n                                      When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                    type: string\n                                  key:\n                                    description: |-\n                                      Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                      If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      Operator represents a key's relationship to the value.\n                                      Valid operators are Exists and Equal. Defaults to Equal.\n                                      Exists is equivalent to wildcard for value, so that a pod can\n                                      tolerate all taints of a particular category.\n                                    type: string\n                                  tolerationSeconds:\n                                    description: |-\n                                      TolerationSeconds represents the period of time the toleration (which must be\n                                      of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                      it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                      negative values will be treated as 0 (evict immediately) by the system.\n                                    format: int64\n                                    type: integer\n                                  value:\n                                    description: |-\n                                      Value is the taint value the toleration matches to.\n                                      If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                    type: string\n                                type: object\n                              type: array\n                            topologySpreadConstraints:\n                              description: |-\n                                TopologySpreadConstraints describes how a group of pods ought to spread across topology\n                                domains. Scheduler will schedule pods in a way which abides by the constraints.\n                                All topologySpreadConstraints are ANDed.\n                              items:\n                                description: TopologySpreadConstraint specifies how\n                                  to spread matching pods among the given topology.\n                                properties:\n                                  labelSelector:\n                                    description: |-\n                                      LabelSelector is used to find matching pods.\n                                      Pods that match this label selector are counted to determine the number of pods\n                                      in their corresponding topology domain.\n                                    properties:\n                                      matchExpressions:\n                                        description: matchExpressions is a list of\n                                          label selector requirements. The requirements\n                                          are ANDed.\n                                        items:\n                                          description: |-\n                                            A label selector requirement is a selector that contains values, a key, and an operator that\n                                            relates the key and values.\n                                          properties:\n                                            key:\n                                              description: key is the label key that\n                                                the selector applies to.\n                                              type: string\n                                            operator:\n                                              description: |-\n                                                operator represents a key's relationship to a set of values.\n                                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                                              type: string\n                                            values:\n                                              description: |-\n                                                values is an array of string values. If the operator is In or NotIn,\n                                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                the values array must be empty. This array is replaced during a strategic\n                                                merge patch.\n                                              items:\n                                                type: string\n                                              type: array\n                                          required:\n                                          - key\n                                          - operator\n                                          type: object\n                                        type: array\n                                      matchLabels:\n                                        additionalProperties:\n                                          type: string\n                                        description: |-\n                                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                        type: object\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  matchLabelKeys:\n                                    description: |-\n                                      MatchLabelKeys is a set of pod label keys to select the pods over which\n                                      spreading will be calculated. The keys are used to lookup values from the\n                                      incoming pod labels, those key-value labels are ANDed with labelSelector\n                                      to select the group of existing pods over which spreading will be calculated\n                                      for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                      MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                      Keys that don't exist in the incoming pod labels will\n                                      be ignored. A null or empty list means only match against labelSelector.\n\n\n                                      This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                    items:\n                                      type: string\n                                    type: array\n                                    x-kubernetes-list-type: atomic\n                                  maxSkew:\n                                    description: |-\n                                      MaxSkew describes the degree to which pods may be unevenly distributed.\n                                      When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                      between the number of matching pods in the target topology and the global minimum.\n                                      The global minimum is the minimum number of matching pods in an eligible domain\n                                      or zero if the number of eligible domains is less than MinDomains.\n                                      For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                      labelSelector spread as 2/2/1:\n                                      In this case, the global minimum is 1.\n                                      | zone1 | zone2 | zone3 |\n                                      |  P P  |  P P  |   P   |\n                                      - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                      scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                      violate MaxSkew(1).\n                                      - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                      When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                      to topologies that satisfy it.\n                                      It's a required field. Default value is 1 and 0 is not allowed.\n                                    format: int32\n                                    type: integer\n                                  minDomains:\n                                    description: |-\n                                      MinDomains indicates a minimum number of eligible domains.\n                                      When the number of eligible domains with matching topology keys is less than minDomains,\n                                      Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                      And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                      this value has no effect on scheduling.\n                                      As a result, when the number of eligible domains is less than minDomains,\n                                      scheduler won't schedule more than maxSkew Pods to those domains.\n                                      If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                      Valid values are integers greater than 0.\n                                      When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                      For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                      labelSelector spread as 2/2/2:\n                                      | zone1 | zone2 | zone3 |\n                                      |  P P  |  P P  |  P P  |\n                                      The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                      In this situation, new pod with the same labelSelector cannot be scheduled,\n                                      because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                      it will violate MaxSkew.\n\n\n                                      This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                    format: int32\n                                    type: integer\n                                  nodeAffinityPolicy:\n                                    description: |-\n                                      NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                      when calculating pod topology spread skew. Options are:\n                                      - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                      - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                      If this value is nil, the behavior is equivalent to the Honor policy.\n                                      This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                    type: string\n                                  nodeTaintsPolicy:\n                                    description: |-\n                                      NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                      pod topology spread skew. Options are:\n                                      - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                      has a toleration, are included.\n                                      - Ignore: node taints are ignored. All nodes are included.\n\n\n                                      If this value is nil, the behavior is equivalent to the Ignore policy.\n                                      This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                    type: string\n                                  topologyKey:\n                                    description: |-\n                                      TopologyKey is the key of node labels. Nodes that have a label with this key\n                                      and identical values are considered to be in the same topology.\n                                      We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                      of pods into each bucket.\n                                      We define a domain as a particular instance of a topology.\n                                      Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                      nodeAffinityPolicy and nodeTaintsPolicy.\n                                      e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                      And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                      It's a required field.\n                                    type: string\n                                  whenUnsatisfiable:\n                                    description: |-\n                                      WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                      the spread constraint.\n                                      - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                      - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                        but giving higher precedence to topologies that would help reduce the\n                                        skew.\n                                      A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                      if and only if every possible node assignment for that pod would violate\n                                      \"MaxSkew\" on some topology.\n                                      For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                      labelSelector spread as 3/1/1:\n                                      | zone1 | zone2 | zone3 |\n                                      | P P P |   P   |   P   |\n                                      If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                      to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                      MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                      won't make it *more* imbalanced.\n                                      It's a required field.\n                                    type: string\n                                required:\n                                - maxSkew\n                                - topologyKey\n                                - whenUnsatisfiable\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - topologyKey\n                              - whenUnsatisfiable\n                              x-kubernetes-list-type: map\n                            volumes:\n                              description: |-\n                                List of volumes that can be mounted by containers belonging to the pod.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes\n                              items:\n                                description: Volume represents a named volume in a\n                                  pod that may be accessed by any container in the\n                                  pod.\n                                properties:\n                                  awsElasticBlockStore:\n                                    description: |-\n                                      awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                                      kubelet's host machine and then exposed to the pod.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fsType is the filesystem type of the volume that you want to mount.\n                                          Tip: Ensure that the filesystem type is supported by the host operating system.\n                                          Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                          TODO: how do we prevent errors in the filesystem from compromising the machine\n                                        type: string\n                                      partition:\n                                        description: |-\n                                          partition is the partition in the volume that you want to mount.\n                                          If omitted, the default is to mount by volume name.\n                                          Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                          Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                        format: int32\n                                        type: integer\n                                      readOnly:\n                                        description: |-\n                                          readOnly value true will force the readOnly setting in VolumeMounts.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                        type: boolean\n                                      volumeID:\n                                        description: |-\n                                          volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                        type: string\n                                    required:\n                                    - volumeID\n                                    type: object\n                                  azureDisk:\n                                    description: azureDisk represents an Azure Data\n                                      Disk mount on the host and bind mount to the\n                                      pod.\n                                    properties:\n                                      cachingMode:\n                                        description: 'cachingMode is the Host Caching\n                                          mode: None, Read Only, Read Write.'\n                                        type: string\n                                      diskName:\n                                        description: diskName is the Name of the data\n                                          disk in the blob storage\n                                        type: string\n                                      diskURI:\n                                        description: diskURI is the URI of data disk\n                                          in the blob storage\n                                        type: string\n                                      fsType:\n                                        description: |-\n                                          fsType is Filesystem type to mount.\n                                          Must be a filesystem type supported by the host operating system.\n                                          Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        type: string\n                                      kind:\n                                        description: 'kind expected values are Shared:\n                                          multiple blob disks per storage account  Dedicated:\n                                          single blob disk per storage account  Managed:\n                                          azure managed data disk (only in managed\n                                          availability set). defaults to shared'\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly Defaults to false (read/write). ReadOnly here will force\n                                          the ReadOnly setting in VolumeMounts.\n                                        type: boolean\n                                    required:\n                                    - diskName\n                                    - diskURI\n                                    type: object\n                                  azureFile:\n                                    description: azureFile represents an Azure File\n                                      Service mount on the host and bind mount to\n                                      the pod.\n                                    properties:\n                                      readOnly:\n                                        description: |-\n                                          readOnly defaults to false (read/write). ReadOnly here will force\n                                          the ReadOnly setting in VolumeMounts.\n                                        type: boolean\n                                      secretName:\n                                        description: secretName is the  name of secret\n                                          that contains Azure Storage Account Name\n                                          and Key\n                                        type: string\n                                      shareName:\n                                        description: shareName is the azure share\n                                          Name\n                                        type: string\n                                    required:\n                                    - secretName\n                                    - shareName\n                                    type: object\n                                  cephfs:\n                                    description: cephFS represents a Ceph FS mount\n                                      on the host that shares a pod's lifetime\n                                    properties:\n                                      monitors:\n                                        description: |-\n                                          monitors is Required: Monitors is a collection of Ceph monitors\n                                          More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                        items:\n                                          type: string\n                                        type: array\n                                      path:\n                                        description: 'path is Optional: Used as the\n                                          mounted root, rather than the full Ceph\n                                          tree, default is /'\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                          the ReadOnly setting in VolumeMounts.\n                                          More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                        type: boolean\n                                      secretFile:\n                                        description: |-\n                                          secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                          More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                        type: string\n                                      secretRef:\n                                        description: |-\n                                          secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                          More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                        properties:\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      user:\n                                        description: |-\n                                          user is optional: User is the rados user name, default is admin\n                                          More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                        type: string\n                                    required:\n                                    - monitors\n                                    type: object\n                                  cinder:\n                                    description: |-\n                                      cinder represents a cinder volume attached and mounted on kubelets host machine.\n                                      More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fsType is the filesystem type to mount.\n                                          Must be a filesystem type supported by the host operating system.\n                                          Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly defaults to false (read/write). ReadOnly here will force\n                                          the ReadOnly setting in VolumeMounts.\n                                          More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                        type: boolean\n                                      secretRef:\n                                        description: |-\n                                          secretRef is optional: points to a secret object containing parameters used to connect\n                                          to OpenStack.\n                                        properties:\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      volumeID:\n                                        description: |-\n                                          volumeID used to identify the volume in cinder.\n                                          More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                        type: string\n                                    required:\n                                    - volumeID\n                                    type: object\n                                  configMap:\n                                    description: configMap represents a configMap\n                                      that should populate this volume\n                                    properties:\n                                      defaultMode:\n                                        description: |-\n                                          defaultMode is optional: mode bits used to set permissions on created files by default.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          Defaults to 0644.\n                                          Directories within the path are not affected by this setting.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      items:\n                                        description: |-\n                                          items if unspecified, each key-value pair in the Data field of the referenced\n                                          ConfigMap will be projected into the volume as a file whose name is the\n                                          key and content is the value. If specified, the listed keys will be\n                                          projected into the specified paths, and unlisted keys will not be\n                                          present. If a key is specified which is not present in the ConfigMap,\n                                          the volume setup will error unless it is marked optional. Paths must be\n                                          relative and may not contain the '..' path or start with '..'.\n                                        items:\n                                          description: Maps a string key to a path\n                                            within a volume.\n                                          properties:\n                                            key:\n                                              description: key is the key to project.\n                                              type: string\n                                            mode:\n                                              description: |-\n                                                mode is Optional: mode bits used to set permissions on this file.\n                                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the relative path of the file to map the key to.\n                                                May not be an absolute path.\n                                                May not contain the path element '..'.\n                                                May not start with the string '..'.\n                                              type: string\n                                          required:\n                                          - key\n                                          - path\n                                          type: object\n                                        type: array\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: optional specify whether the\n                                          ConfigMap or its keys must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  csi:\n                                    description: csi (Container Storage Interface)\n                                      represents ephemeral storage that is handled\n                                      by certain external CSI drivers (Beta feature).\n                                    properties:\n                                      driver:\n                                        description: |-\n                                          driver is the name of the CSI driver that handles this volume.\n                                          Consult with your admin for the correct name as registered in the cluster.\n                                        type: string\n                                      fsType:\n                                        description: |-\n                                          fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                          If not provided, the empty value is passed to the associated CSI driver\n                                          which will determine the default filesystem to apply.\n                                        type: string\n                                      nodePublishSecretRef:\n                                        description: |-\n                                          nodePublishSecretRef is a reference to the secret object containing\n                                          sensitive information to pass to the CSI driver to complete the CSI\n                                          NodePublishVolume and NodeUnpublishVolume calls.\n                                          This field is optional, and  may be empty if no secret is required. If the\n                                          secret object contains more than one secret, all secret references are passed.\n                                        properties:\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      readOnly:\n                                        description: |-\n                                          readOnly specifies a read-only configuration for the volume.\n                                          Defaults to false (read/write).\n                                        type: boolean\n                                      volumeAttributes:\n                                        additionalProperties:\n                                          type: string\n                                        description: |-\n                                          volumeAttributes stores driver-specific properties that are passed to the CSI\n                                          driver. Consult your driver's documentation for supported values.\n                                        type: object\n                                    required:\n                                    - driver\n                                    type: object\n                                  downwardAPI:\n                                    description: downwardAPI represents downward API\n                                      about the pod that should populate this volume\n                                    properties:\n                                      defaultMode:\n                                        description: |-\n                                          Optional: mode bits to use on created files by default. Must be a\n                                          Optional: mode bits used to set permissions on created files by default.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          Defaults to 0644.\n                                          Directories within the path are not affected by this setting.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      items:\n                                        description: Items is a list of downward API\n                                          volume file\n                                        items:\n                                          description: DownwardAPIVolumeFile represents\n                                            information to create the file containing\n                                            the pod field\n                                          properties:\n                                            fieldRef:\n                                              description: 'Required: Selects a field\n                                                of the pod: only annotations, labels,\n                                                name and namespace are supported.'\n                                              properties:\n                                                apiVersion:\n                                                  description: Version of the schema\n                                                    the FieldPath is written in terms\n                                                    of, defaults to \"v1\".\n                                                  type: string\n                                                fieldPath:\n                                                  description: Path of the field to\n                                                    select in the specified API version.\n                                                  type: string\n                                              required:\n                                              - fieldPath\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            mode:\n                                              description: |-\n                                                Optional: mode bits used to set permissions on this file, must be an octal value\n                                                between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: 'Required: Path is  the\n                                                relative path name of the file to\n                                                be created. Must not be absolute or\n                                                contain the ''..'' path. Must be utf-8\n                                                encoded. The first item of the relative\n                                                path must not start with ''..'''\n                                              type: string\n                                            resourceFieldRef:\n                                              description: |-\n                                                Selects a resource of the container: only resources limits and requests\n                                                (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                              properties:\n                                                containerName:\n                                                  description: 'Container name: required\n                                                    for volumes, optional for env\n                                                    vars'\n                                                  type: string\n                                                divisor:\n                                                  anyOf:\n                                                  - type: integer\n                                                  - type: string\n                                                  description: Specifies the output\n                                                    format of the exposed resources,\n                                                    defaults to \"1\"\n                                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                  x-kubernetes-int-or-string: true\n                                                resource:\n                                                  description: 'Required: resource\n                                                    to select'\n                                                  type: string\n                                              required:\n                                              - resource\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                          required:\n                                          - path\n                                          type: object\n                                        type: array\n                                    type: object\n                                  emptyDir:\n                                    description: |-\n                                      emptyDir represents a temporary directory that shares a pod's lifetime.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                    properties:\n                                      medium:\n                                        description: |-\n                                          medium represents what type of storage medium should back this directory.\n                                          The default is \"\" which means to use the node's default medium.\n                                          Must be an empty string (default) or Memory.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                        type: string\n                                      sizeLimit:\n                                        anyOf:\n                                        - type: integer\n                                        - type: string\n                                        description: |-\n                                          sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                          The size limit is also applicable for memory medium.\n                                          The maximum usage on memory medium EmptyDir would be the minimum value between\n                                          the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                          The default is nil which means that the limit is undefined.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                        x-kubernetes-int-or-string: true\n                                    type: object\n                                  ephemeral:\n                                    description: |-\n                                      ephemeral represents a volume that is handled by a cluster storage driver.\n                                      The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                                      and deleted when the pod is removed.\n\n\n                                      Use this if:\n                                      a) the volume is only needed while the pod runs,\n                                      b) features of normal volumes like restoring from snapshot or capacity\n                                         tracking are needed,\n                                      c) the storage driver is specified through a storage class, and\n                                      d) the storage driver supports dynamic volume provisioning through\n                                         a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                         information on the connection between this volume type\n                                         and PersistentVolumeClaim).\n\n\n                                      Use PersistentVolumeClaim or one of the vendor-specific\n                                      APIs for volumes that persist for longer than the lifecycle\n                                      of an individual pod.\n\n\n                                      Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                                      be used that way - see the documentation of the driver for\n                                      more information.\n\n\n                                      A pod can use both types of ephemeral volumes and\n                                      persistent volumes at the same time.\n                                    properties:\n                                      volumeClaimTemplate:\n                                        description: |-\n                                          Will be used to create a stand-alone PVC to provision the volume.\n                                          The pod in which this EphemeralVolumeSource is embedded will be the\n                                          owner of the PVC, i.e. the PVC will be deleted together with the\n                                          pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                          `<volume name>` is the name from the `PodSpec.Volumes` array\n                                          entry. Pod validation will reject the pod if the concatenated name\n                                          is not valid for a PVC (for example, too long).\n\n\n                                          An existing PVC with that name that is not owned by the pod\n                                          will *not* be used for the pod to avoid using an unrelated\n                                          volume by mistake. Starting the pod is then blocked until\n                                          the unrelated PVC is removed. If such a pre-created PVC is\n                                          meant to be used by the pod, the PVC has to updated with an\n                                          owner reference to the pod once the pod exists. Normally\n                                          this should not be necessary, but it may be useful when\n                                          manually reconstructing a broken cluster.\n\n\n                                          This field is read-only and no changes will be made by Kubernetes\n                                          to the PVC after it has been created.\n\n\n                                          Required, must not be nil.\n                                        properties:\n                                          metadata:\n                                            description: |-\n                                              May contain labels and annotations that will be copied into the PVC\n                                              when creating it. No other fields are allowed and will be rejected during\n                                              validation.\n                                            properties:\n                                              annotations:\n                                                additionalProperties:\n                                                  type: string\n                                                type: object\n                                              finalizers:\n                                                items:\n                                                  type: string\n                                                type: array\n                                              labels:\n                                                additionalProperties:\n                                                  type: string\n                                                type: object\n                                              name:\n                                                type: string\n                                              namespace:\n                                                type: string\n                                            type: object\n                                          spec:\n                                            description: |-\n                                              The specification for the PersistentVolumeClaim. The entire content is\n                                              copied unchanged into the PVC that gets created from this\n                                              template. The same fields as in a PersistentVolumeClaim\n                                              are also valid here.\n                                            properties:\n                                              accessModes:\n                                                description: |-\n                                                  accessModes contains the desired access modes the volume should have.\n                                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                                items:\n                                                  type: string\n                                                type: array\n                                              dataSource:\n                                                description: |-\n                                                  dataSource field can be used to specify either:\n                                                  * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                                  * An existing PVC (PersistentVolumeClaim)\n                                                  If the provisioner or an external controller can support the specified data source,\n                                                  it will create a new volume based on the contents of the specified data source.\n                                                  When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                                  and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                                  If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                                properties:\n                                                  apiGroup:\n                                                    description: |-\n                                                      APIGroup is the group for the resource being referenced.\n                                                      If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                      For any other third-party types, APIGroup is required.\n                                                    type: string\n                                                  kind:\n                                                    description: Kind is the type\n                                                      of resource being referenced\n                                                    type: string\n                                                  name:\n                                                    description: Name is the name\n                                                      of resource being referenced\n                                                    type: string\n                                                required:\n                                                - kind\n                                                - name\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              dataSourceRef:\n                                                description: |-\n                                                  dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                                  volume is desired. This may be any object from a non-empty API group (non\n                                                  core object) or a PersistentVolumeClaim object.\n                                                  When this field is specified, volume binding will only succeed if the type of\n                                                  the specified object matches some installed volume populator or dynamic\n                                                  provisioner.\n                                                  This field will replace the functionality of the dataSource field and as such\n                                                  if both fields are non-empty, they must have the same value. For backwards\n                                                  compatibility, when namespace isn't specified in dataSourceRef,\n                                                  both fields (dataSource and dataSourceRef) will be set to the same\n                                                  value automatically if one of them is empty and the other is non-empty.\n                                                  When namespace is specified in dataSourceRef,\n                                                  dataSource isn't set to the same value and must be empty.\n                                                  There are three important differences between dataSource and dataSourceRef:\n                                                  * While dataSource only allows two specific types of objects, dataSourceRef\n                                                    allows any non-core object, as well as PersistentVolumeClaim objects.\n                                                  * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                                    preserves all values, and generates an error if a disallowed value is\n                                                    specified.\n                                                  * While dataSource only allows local objects, dataSourceRef allows objects\n                                                    in any namespaces.\n                                                  (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                                  (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                                properties:\n                                                  apiGroup:\n                                                    description: |-\n                                                      APIGroup is the group for the resource being referenced.\n                                                      If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                      For any other third-party types, APIGroup is required.\n                                                    type: string\n                                                  kind:\n                                                    description: Kind is the type\n                                                      of resource being referenced\n                                                    type: string\n                                                  name:\n                                                    description: Name is the name\n                                                      of resource being referenced\n                                                    type: string\n                                                  namespace:\n                                                    description: |-\n                                                      Namespace is the namespace of resource being referenced\n                                                      Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                                      (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                                    type: string\n                                                required:\n                                                - kind\n                                                - name\n                                                type: object\n                                              resources:\n                                                description: |-\n                                                  resources represents the minimum resources the volume should have.\n                                                  If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                                  that are lower than previous value but must still be higher than capacity recorded in the\n                                                  status field of the claim.\n                                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                                properties:\n                                                  limits:\n                                                    additionalProperties:\n                                                      anyOf:\n                                                      - type: integer\n                                                      - type: string\n                                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                      x-kubernetes-int-or-string: true\n                                                    description: |-\n                                                      Limits describes the maximum amount of compute resources allowed.\n                                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                    type: object\n                                                  requests:\n                                                    additionalProperties:\n                                                      anyOf:\n                                                      - type: integer\n                                                      - type: string\n                                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                      x-kubernetes-int-or-string: true\n                                                    description: |-\n                                                      Requests describes the minimum amount of compute resources required.\n                                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                                    type: object\n                                                type: object\n                                              selector:\n                                                description: selector is a label query\n                                                  over volumes to consider for binding.\n                                                properties:\n                                                  matchExpressions:\n                                                    description: matchExpressions\n                                                      is a list of label selector\n                                                      requirements. The requirements\n                                                      are ANDed.\n                                                    items:\n                                                      description: |-\n                                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                                        relates the key and values.\n                                                      properties:\n                                                        key:\n                                                          description: key is the\n                                                            label key that the selector\n                                                            applies to.\n                                                          type: string\n                                                        operator:\n                                                          description: |-\n                                                            operator represents a key's relationship to a set of values.\n                                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                          type: string\n                                                        values:\n                                                          description: |-\n                                                            values is an array of string values. If the operator is In or NotIn,\n                                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                            the values array must be empty. This array is replaced during a strategic\n                                                            merge patch.\n                                                          items:\n                                                            type: string\n                                                          type: array\n                                                      required:\n                                                      - key\n                                                      - operator\n                                                      type: object\n                                                    type: array\n                                                  matchLabels:\n                                                    additionalProperties:\n                                                      type: string\n                                                    description: |-\n                                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                    type: object\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              storageClassName:\n                                                description: |-\n                                                  storageClassName is the name of the StorageClass required by the claim.\n                                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                                type: string\n                                              volumeAttributesClassName:\n                                                description: |-\n                                                  volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                                  If specified, the CSI driver will create or update the volume with the attributes defined\n                                                  in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                                  it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                                  will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                                  If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                                  will be set by the persistentvolume controller if it exists.\n                                                  If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                                  set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                                  exists.\n                                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                                  (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                                type: string\n                                              volumeMode:\n                                                description: |-\n                                                  volumeMode defines what type of volume is required by the claim.\n                                                  Value of Filesystem is implied when not included in claim spec.\n                                                type: string\n                                              volumeName:\n                                                description: volumeName is the binding\n                                                  reference to the PersistentVolume\n                                                  backing this claim.\n                                                type: string\n                                            type: object\n                                        required:\n                                        - spec\n                                        type: object\n                                    type: object\n                                  fc:\n                                    description: fc represents a Fibre Channel resource\n                                      that is attached to a kubelet's host machine\n                                      and then exposed to the pod.\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fsType is the filesystem type to mount.\n                                          Must be a filesystem type supported by the host operating system.\n                                          Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          TODO: how do we prevent errors in the filesystem from compromising the machine\n                                        type: string\n                                      lun:\n                                        description: 'lun is Optional: FC target lun\n                                          number'\n                                        format: int32\n                                        type: integer\n                                      readOnly:\n                                        description: |-\n                                          readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                          the ReadOnly setting in VolumeMounts.\n                                        type: boolean\n                                      targetWWNs:\n                                        description: 'targetWWNs is Optional: FC target\n                                          worldwide names (WWNs)'\n                                        items:\n                                          type: string\n                                        type: array\n                                      wwids:\n                                        description: |-\n                                          wwids Optional: FC volume world wide identifiers (wwids)\n                                          Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                        items:\n                                          type: string\n                                        type: array\n                                    type: object\n                                  flexVolume:\n                                    description: |-\n                                      flexVolume represents a generic volume resource that is\n                                      provisioned/attached using an exec based plugin.\n                                    properties:\n                                      driver:\n                                        description: driver is the name of the driver\n                                          to use for this volume.\n                                        type: string\n                                      fsType:\n                                        description: |-\n                                          fsType is the filesystem type to mount.\n                                          Must be a filesystem type supported by the host operating system.\n                                          Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                        type: string\n                                      options:\n                                        additionalProperties:\n                                          type: string\n                                        description: 'options is Optional: this field\n                                          holds extra command options if any.'\n                                        type: object\n                                      readOnly:\n                                        description: |-\n                                          readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                          the ReadOnly setting in VolumeMounts.\n                                        type: boolean\n                                      secretRef:\n                                        description: |-\n                                          secretRef is Optional: secretRef is reference to the secret object containing\n                                          sensitive information to pass to the plugin scripts. This may be\n                                          empty if no secret object is specified. If the secret object\n                                          contains more than one secret, all secrets are passed to the plugin\n                                          scripts.\n                                        properties:\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    required:\n                                    - driver\n                                    type: object\n                                  flocker:\n                                    description: flocker represents a Flocker volume\n                                      attached to a kubelet's host machine. This depends\n                                      on the Flocker control service being running\n                                    properties:\n                                      datasetName:\n                                        description: |-\n                                          datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                          should be considered as deprecated\n                                        type: string\n                                      datasetUUID:\n                                        description: datasetUUID is the UUID of the\n                                          dataset. This is unique identifier of a\n                                          Flocker dataset\n                                        type: string\n                                    type: object\n                                  gcePersistentDisk:\n                                    description: |-\n                                      gcePersistentDisk represents a GCE Disk resource that is attached to a\n                                      kubelet's host machine and then exposed to the pod.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fsType is filesystem type of the volume that you want to mount.\n                                          Tip: Ensure that the filesystem type is supported by the host operating system.\n                                          Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                          TODO: how do we prevent errors in the filesystem from compromising the machine\n                                        type: string\n                                      partition:\n                                        description: |-\n                                          partition is the partition in the volume that you want to mount.\n                                          If omitted, the default is to mount by volume name.\n                                          Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                          Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                        format: int32\n                                        type: integer\n                                      pdName:\n                                        description: |-\n                                          pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly here will force the ReadOnly setting in VolumeMounts.\n                                          Defaults to false.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                        type: boolean\n                                    required:\n                                    - pdName\n                                    type: object\n                                  gitRepo:\n                                    description: |-\n                                      gitRepo represents a git repository at a particular revision.\n                                      DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                                      EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                                      into the Pod's container.\n                                    properties:\n                                      directory:\n                                        description: |-\n                                          directory is the target directory name.\n                                          Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                          git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                          the subdirectory with the given name.\n                                        type: string\n                                      repository:\n                                        description: repository is the URL\n                                        type: string\n                                      revision:\n                                        description: revision is the commit hash for\n                                          the specified revision.\n                                        type: string\n                                    required:\n                                    - repository\n                                    type: object\n                                  glusterfs:\n                                    description: |-\n                                      glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                                      More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                                    properties:\n                                      endpoints:\n                                        description: |-\n                                          endpoints is the endpoint name that details Glusterfs topology.\n                                          More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                        type: string\n                                      path:\n                                        description: |-\n                                          path is the Glusterfs volume path.\n                                          More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                          Defaults to false.\n                                          More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                        type: boolean\n                                    required:\n                                    - endpoints\n                                    - path\n                                    type: object\n                                  hostPath:\n                                    description: |-\n                                      hostPath represents a pre-existing file or directory on the host\n                                      machine that is directly exposed to the container. This is generally\n                                      used for system agents or other privileged things that are allowed\n                                      to see the host machine. Most containers will NOT need this.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                      ---\n                                      TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                                      mount host directories as read/write.\n                                    properties:\n                                      path:\n                                        description: |-\n                                          path of the directory on the host.\n                                          If the path is a symlink, it will follow the link to the real path.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                        type: string\n                                      type:\n                                        description: |-\n                                          type for HostPath Volume\n                                          Defaults to \"\"\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                        type: string\n                                    required:\n                                    - path\n                                    type: object\n                                  iscsi:\n                                    description: |-\n                                      iscsi represents an ISCSI Disk resource that is attached to a\n                                      kubelet's host machine and then exposed to the pod.\n                                      More info: https://examples.k8s.io/volumes/iscsi/README.md\n                                    properties:\n                                      chapAuthDiscovery:\n                                        description: chapAuthDiscovery defines whether\n                                          support iSCSI Discovery CHAP authentication\n                                        type: boolean\n                                      chapAuthSession:\n                                        description: chapAuthSession defines whether\n                                          support iSCSI Session CHAP authentication\n                                        type: boolean\n                                      fsType:\n                                        description: |-\n                                          fsType is the filesystem type of the volume that you want to mount.\n                                          Tip: Ensure that the filesystem type is supported by the host operating system.\n                                          Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                          TODO: how do we prevent errors in the filesystem from compromising the machine\n                                        type: string\n                                      initiatorName:\n                                        description: |-\n                                          initiatorName is the custom iSCSI Initiator Name.\n                                          If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                          <target portal>:<volume name> will be created for the connection.\n                                        type: string\n                                      iqn:\n                                        description: iqn is the target iSCSI Qualified\n                                          Name.\n                                        type: string\n                                      iscsiInterface:\n                                        description: |-\n                                          iscsiInterface is the interface Name that uses an iSCSI transport.\n                                          Defaults to 'default' (tcp).\n                                        type: string\n                                      lun:\n                                        description: lun represents iSCSI Target Lun\n                                          number.\n                                        format: int32\n                                        type: integer\n                                      portals:\n                                        description: |-\n                                          portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                          is other than default (typically TCP ports 860 and 3260).\n                                        items:\n                                          type: string\n                                        type: array\n                                      readOnly:\n                                        description: |-\n                                          readOnly here will force the ReadOnly setting in VolumeMounts.\n                                          Defaults to false.\n                                        type: boolean\n                                      secretRef:\n                                        description: secretRef is the CHAP Secret\n                                          for iSCSI target and initiator authentication\n                                        properties:\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      targetPortal:\n                                        description: |-\n                                          targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                          is other than default (typically TCP ports 860 and 3260).\n                                        type: string\n                                    required:\n                                    - iqn\n                                    - lun\n                                    - targetPortal\n                                    type: object\n                                  name:\n                                    description: |-\n                                      name of the volume.\n                                      Must be a DNS_LABEL and unique within the pod.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    type: string\n                                  nfs:\n                                    description: |-\n                                      nfs represents an NFS mount on the host that shares a pod's lifetime\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                    properties:\n                                      path:\n                                        description: |-\n                                          path that is exported by the NFS server.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly here will force the NFS export to be mounted with read-only permissions.\n                                          Defaults to false.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                        type: boolean\n                                      server:\n                                        description: |-\n                                          server is the hostname or IP address of the NFS server.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                        type: string\n                                    required:\n                                    - path\n                                    - server\n                                    type: object\n                                  persistentVolumeClaim:\n                                    description: |-\n                                      persistentVolumeClaimVolumeSource represents a reference to a\n                                      PersistentVolumeClaim in the same namespace.\n                                      More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                    properties:\n                                      claimName:\n                                        description: |-\n                                          claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly Will force the ReadOnly setting in VolumeMounts.\n                                          Default false.\n                                        type: boolean\n                                    required:\n                                    - claimName\n                                    type: object\n                                  photonPersistentDisk:\n                                    description: photonPersistentDisk represents a\n                                      PhotonController persistent disk attached and\n                                      mounted on kubelets host machine\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fsType is the filesystem type to mount.\n                                          Must be a filesystem type supported by the host operating system.\n                                          Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        type: string\n                                      pdID:\n                                        description: pdID is the ID that identifies\n                                          Photon Controller persistent disk\n                                        type: string\n                                    required:\n                                    - pdID\n                                    type: object\n                                  portworxVolume:\n                                    description: portworxVolume represents a portworx\n                                      volume attached and mounted on kubelets host\n                                      machine\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fSType represents the filesystem type to mount\n                                          Must be a filesystem type supported by the host operating system.\n                                          Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly defaults to false (read/write). ReadOnly here will force\n                                          the ReadOnly setting in VolumeMounts.\n                                        type: boolean\n                                      volumeID:\n                                        description: volumeID uniquely identifies\n                                          a Portworx volume\n                                        type: string\n                                    required:\n                                    - volumeID\n                                    type: object\n                                  projected:\n                                    description: projected items for all in one resources\n                                      secrets, configmaps, and downward API\n                                    properties:\n                                      defaultMode:\n                                        description: |-\n                                          defaultMode are the mode bits used to set permissions on created files by default.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          Directories within the path are not affected by this setting.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      sources:\n                                        description: sources is the list of volume\n                                          projections\n                                        items:\n                                          description: Projection that may be projected\n                                            along with other supported volume types\n                                          properties:\n                                            clusterTrustBundle:\n                                              description: |-\n                                                ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                                of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                                Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                                ClusterTrustBundle objects can either be selected by name, or by the\n                                                combination of signer name and a label selector.\n\n\n                                                Kubelet performs aggressive normalization of the PEM contents written\n                                                into the pod filesystem.  Esoteric PEM features such as inter-block\n                                                comments and block headers are stripped.  Certificates are deduplicated.\n                                                The ordering of certificates within the file is arbitrary, and Kubelet\n                                                may change the order over time.\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    Select all ClusterTrustBundles that match this label selector.  Only has\n                                                    effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                                    interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                                    everything\".\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                name:\n                                                  description: |-\n                                                    Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                                    with signerName and labelSelector.\n                                                  type: string\n                                                optional:\n                                                  description: |-\n                                                    If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                                    aren't available.  If using name, then the named ClusterTrustBundle is\n                                                    allowed not to exist.  If using signerName, then the combination of\n                                                    signerName and labelSelector is allowed to match zero\n                                                    ClusterTrustBundles.\n                                                  type: boolean\n                                                path:\n                                                  description: Relative path from\n                                                    the volume root to write the bundle.\n                                                  type: string\n                                                signerName:\n                                                  description: |-\n                                                    Select all ClusterTrustBundles that match this signer name.\n                                                    Mutually-exclusive with name.  The contents of all selected\n                                                    ClusterTrustBundles will be unified and deduplicated.\n                                                  type: string\n                                              required:\n                                              - path\n                                              type: object\n                                            configMap:\n                                              description: configMap information about\n                                                the configMap data to project\n                                              properties:\n                                                items:\n                                                  description: |-\n                                                    items if unspecified, each key-value pair in the Data field of the referenced\n                                                    ConfigMap will be projected into the volume as a file whose name is the\n                                                    key and content is the value. If specified, the listed keys will be\n                                                    projected into the specified paths, and unlisted keys will not be\n                                                    present. If a key is specified which is not present in the ConfigMap,\n                                                    the volume setup will error unless it is marked optional. Paths must be\n                                                    relative and may not contain the '..' path or start with '..'.\n                                                  items:\n                                                    description: Maps a string key\n                                                      to a path within a volume.\n                                                    properties:\n                                                      key:\n                                                        description: key is the key\n                                                          to project.\n                                                        type: string\n                                                      mode:\n                                                        description: |-\n                                                          mode is Optional: mode bits used to set permissions on this file.\n                                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                          If not specified, the volume defaultMode will be used.\n                                                          This might be in conflict with other options that affect the file\n                                                          mode, like fsGroup, and the result can be other mode bits set.\n                                                        format: int32\n                                                        type: integer\n                                                      path:\n                                                        description: |-\n                                                          path is the relative path of the file to map the key to.\n                                                          May not be an absolute path.\n                                                          May not contain the path element '..'.\n                                                          May not start with the string '..'.\n                                                        type: string\n                                                    required:\n                                                    - key\n                                                    - path\n                                                    type: object\n                                                  type: array\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: optional specify whether\n                                                    the ConfigMap or its keys must\n                                                    be defined\n                                                  type: boolean\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            downwardAPI:\n                                              description: downwardAPI information\n                                                about the downwardAPI data to project\n                                              properties:\n                                                items:\n                                                  description: Items is a list of\n                                                    DownwardAPIVolume file\n                                                  items:\n                                                    description: DownwardAPIVolumeFile\n                                                      represents information to create\n                                                      the file containing the pod\n                                                      field\n                                                    properties:\n                                                      fieldRef:\n                                                        description: 'Required: Selects\n                                                          a field of the pod: only\n                                                          annotations, labels, name\n                                                          and namespace are supported.'\n                                                        properties:\n                                                          apiVersion:\n                                                            description: Version of\n                                                              the schema the FieldPath\n                                                              is written in terms\n                                                              of, defaults to \"v1\".\n                                                            type: string\n                                                          fieldPath:\n                                                            description: Path of the\n                                                              field to select in the\n                                                              specified API version.\n                                                            type: string\n                                                        required:\n                                                        - fieldPath\n                                                        type: object\n                                                        x-kubernetes-map-type: atomic\n                                                      mode:\n                                                        description: |-\n                                                          Optional: mode bits used to set permissions on this file, must be an octal value\n                                                          between 0000 and 0777 or a decimal value between 0 and 511.\n                                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                          If not specified, the volume defaultMode will be used.\n                                                          This might be in conflict with other options that affect the file\n                                                          mode, like fsGroup, and the result can be other mode bits set.\n                                                        format: int32\n                                                        type: integer\n                                                      path:\n                                                        description: 'Required: Path\n                                                          is  the relative path name\n                                                          of the file to be created.\n                                                          Must not be absolute or\n                                                          contain the ''..'' path.\n                                                          Must be utf-8 encoded. The\n                                                          first item of the relative\n                                                          path must not start with\n                                                          ''..'''\n                                                        type: string\n                                                      resourceFieldRef:\n                                                        description: |-\n                                                          Selects a resource of the container: only resources limits and requests\n                                                          (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                        properties:\n                                                          containerName:\n                                                            description: 'Container\n                                                              name: required for volumes,\n                                                              optional for env vars'\n                                                            type: string\n                                                          divisor:\n                                                            anyOf:\n                                                            - type: integer\n                                                            - type: string\n                                                            description: Specifies\n                                                              the output format of\n                                                              the exposed resources,\n                                                              defaults to \"1\"\n                                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                            x-kubernetes-int-or-string: true\n                                                          resource:\n                                                            description: 'Required:\n                                                              resource to select'\n                                                            type: string\n                                                        required:\n                                                        - resource\n                                                        type: object\n                                                        x-kubernetes-map-type: atomic\n                                                    required:\n                                                    - path\n                                                    type: object\n                                                  type: array\n                                              type: object\n                                            secret:\n                                              description: secret information about\n                                                the secret data to project\n                                              properties:\n                                                items:\n                                                  description: |-\n                                                    items if unspecified, each key-value pair in the Data field of the referenced\n                                                    Secret will be projected into the volume as a file whose name is the\n                                                    key and content is the value. If specified, the listed keys will be\n                                                    projected into the specified paths, and unlisted keys will not be\n                                                    present. If a key is specified which is not present in the Secret,\n                                                    the volume setup will error unless it is marked optional. Paths must be\n                                                    relative and may not contain the '..' path or start with '..'.\n                                                  items:\n                                                    description: Maps a string key\n                                                      to a path within a volume.\n                                                    properties:\n                                                      key:\n                                                        description: key is the key\n                                                          to project.\n                                                        type: string\n                                                      mode:\n                                                        description: |-\n                                                          mode is Optional: mode bits used to set permissions on this file.\n                                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                          If not specified, the volume defaultMode will be used.\n                                                          This might be in conflict with other options that affect the file\n                                                          mode, like fsGroup, and the result can be other mode bits set.\n                                                        format: int32\n                                                        type: integer\n                                                      path:\n                                                        description: |-\n                                                          path is the relative path of the file to map the key to.\n                                                          May not be an absolute path.\n                                                          May not contain the path element '..'.\n                                                          May not start with the string '..'.\n                                                        type: string\n                                                    required:\n                                                    - key\n                                                    - path\n                                                    type: object\n                                                  type: array\n                                                name:\n                                                  description: |-\n                                                    Name of the referent.\n                                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                                  type: string\n                                                optional:\n                                                  description: optional field specify\n                                                    whether the Secret or its key\n                                                    must be defined\n                                                  type: boolean\n                                              type: object\n                                              x-kubernetes-map-type: atomic\n                                            serviceAccountToken:\n                                              description: serviceAccountToken is\n                                                information about the serviceAccountToken\n                                                data to project\n                                              properties:\n                                                audience:\n                                                  description: |-\n                                                    audience is the intended audience of the token. A recipient of a token\n                                                    must identify itself with an identifier specified in the audience of the\n                                                    token, and otherwise should reject the token. The audience defaults to the\n                                                    identifier of the apiserver.\n                                                  type: string\n                                                expirationSeconds:\n                                                  description: |-\n                                                    expirationSeconds is the requested duration of validity of the service\n                                                    account token. As the token approaches expiration, the kubelet volume\n                                                    plugin will proactively rotate the service account token. The kubelet will\n                                                    start trying to rotate the token if the token is older than 80 percent of\n                                                    its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                                    and must be at least 10 minutes.\n                                                  format: int64\n                                                  type: integer\n                                                path:\n                                                  description: |-\n                                                    path is the path relative to the mount point of the file to project the\n                                                    token into.\n                                                  type: string\n                                              required:\n                                              - path\n                                              type: object\n                                          type: object\n                                        type: array\n                                    type: object\n                                  quobyte:\n                                    description: quobyte represents a Quobyte mount\n                                      on the host that shares a pod's lifetime\n                                    properties:\n                                      group:\n                                        description: |-\n                                          group to map volume access to\n                                          Default is no group\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                          Defaults to false.\n                                        type: boolean\n                                      registry:\n                                        description: |-\n                                          registry represents a single or multiple Quobyte Registry services\n                                          specified as a string as host:port pair (multiple entries are separated with commas)\n                                          which acts as the central registry for volumes\n                                        type: string\n                                      tenant:\n                                        description: |-\n                                          tenant owning the given Quobyte volume in the Backend\n                                          Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                        type: string\n                                      user:\n                                        description: |-\n                                          user to map volume access to\n                                          Defaults to serivceaccount user\n                                        type: string\n                                      volume:\n                                        description: volume is a string that references\n                                          an already created Quobyte volume by name.\n                                        type: string\n                                    required:\n                                    - registry\n                                    - volume\n                                    type: object\n                                  rbd:\n                                    description: |-\n                                      rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                                      More info: https://examples.k8s.io/volumes/rbd/README.md\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fsType is the filesystem type of the volume that you want to mount.\n                                          Tip: Ensure that the filesystem type is supported by the host operating system.\n                                          Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                          TODO: how do we prevent errors in the filesystem from compromising the machine\n                                        type: string\n                                      image:\n                                        description: |-\n                                          image is the rados image name.\n                                          More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                        type: string\n                                      keyring:\n                                        description: |-\n                                          keyring is the path to key ring for RBDUser.\n                                          Default is /etc/ceph/keyring.\n                                          More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                        type: string\n                                      monitors:\n                                        description: |-\n                                          monitors is a collection of Ceph monitors.\n                                          More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                        items:\n                                          type: string\n                                        type: array\n                                      pool:\n                                        description: |-\n                                          pool is the rados pool name.\n                                          Default is rbd.\n                                          More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly here will force the ReadOnly setting in VolumeMounts.\n                                          Defaults to false.\n                                          More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                        type: boolean\n                                      secretRef:\n                                        description: |-\n                                          secretRef is name of the authentication secret for RBDUser. If provided\n                                          overrides keyring.\n                                          Default is nil.\n                                          More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                        properties:\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      user:\n                                        description: |-\n                                          user is the rados user name.\n                                          Default is admin.\n                                          More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                        type: string\n                                    required:\n                                    - image\n                                    - monitors\n                                    type: object\n                                  scaleIO:\n                                    description: scaleIO represents a ScaleIO persistent\n                                      volume attached and mounted on Kubernetes nodes.\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fsType is the filesystem type to mount.\n                                          Must be a filesystem type supported by the host operating system.\n                                          Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                          Default is \"xfs\".\n                                        type: string\n                                      gateway:\n                                        description: gateway is the host address of\n                                          the ScaleIO API Gateway.\n                                        type: string\n                                      protectionDomain:\n                                        description: protectionDomain is the name\n                                          of the ScaleIO Protection Domain for the\n                                          configured storage.\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly Defaults to false (read/write). ReadOnly here will force\n                                          the ReadOnly setting in VolumeMounts.\n                                        type: boolean\n                                      secretRef:\n                                        description: |-\n                                          secretRef references to the secret for ScaleIO user and other\n                                          sensitive information. If this is not provided, Login operation will fail.\n                                        properties:\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      sslEnabled:\n                                        description: sslEnabled Flag enable/disable\n                                          SSL communication with Gateway, default\n                                          false\n                                        type: boolean\n                                      storageMode:\n                                        description: |-\n                                          storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                          Default is ThinProvisioned.\n                                        type: string\n                                      storagePool:\n                                        description: storagePool is the ScaleIO Storage\n                                          Pool associated with the protection domain.\n                                        type: string\n                                      system:\n                                        description: system is the name of the storage\n                                          system as configured in ScaleIO.\n                                        type: string\n                                      volumeName:\n                                        description: |-\n                                          volumeName is the name of a volume already created in the ScaleIO system\n                                          that is associated with this volume source.\n                                        type: string\n                                    required:\n                                    - gateway\n                                    - secretRef\n                                    - system\n                                    type: object\n                                  secret:\n                                    description: |-\n                                      secret represents a secret that should populate this volume.\n                                      More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                    properties:\n                                      defaultMode:\n                                        description: |-\n                                          defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values\n                                          for mode bits. Defaults to 0644.\n                                          Directories within the path are not affected by this setting.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      items:\n                                        description: |-\n                                          items If unspecified, each key-value pair in the Data field of the referenced\n                                          Secret will be projected into the volume as a file whose name is the\n                                          key and content is the value. If specified, the listed keys will be\n                                          projected into the specified paths, and unlisted keys will not be\n                                          present. If a key is specified which is not present in the Secret,\n                                          the volume setup will error unless it is marked optional. Paths must be\n                                          relative and may not contain the '..' path or start with '..'.\n                                        items:\n                                          description: Maps a string key to a path\n                                            within a volume.\n                                          properties:\n                                            key:\n                                              description: key is the key to project.\n                                              type: string\n                                            mode:\n                                              description: |-\n                                                mode is Optional: mode bits used to set permissions on this file.\n                                                Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                If not specified, the volume defaultMode will be used.\n                                                This might be in conflict with other options that affect the file\n                                                mode, like fsGroup, and the result can be other mode bits set.\n                                              format: int32\n                                              type: integer\n                                            path:\n                                              description: |-\n                                                path is the relative path of the file to map the key to.\n                                                May not be an absolute path.\n                                                May not contain the path element '..'.\n                                                May not start with the string '..'.\n                                              type: string\n                                          required:\n                                          - key\n                                          - path\n                                          type: object\n                                        type: array\n                                      optional:\n                                        description: optional field specify whether\n                                          the Secret or its keys must be defined\n                                        type: boolean\n                                      secretName:\n                                        description: |-\n                                          secretName is the name of the secret in the pod's namespace to use.\n                                          More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                        type: string\n                                    type: object\n                                  storageos:\n                                    description: storageOS represents a StorageOS\n                                      volume attached and mounted on Kubernetes nodes.\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fsType is the filesystem type to mount.\n                                          Must be a filesystem type supported by the host operating system.\n                                          Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        type: string\n                                      readOnly:\n                                        description: |-\n                                          readOnly defaults to false (read/write). ReadOnly here will force\n                                          the ReadOnly setting in VolumeMounts.\n                                        type: boolean\n                                      secretRef:\n                                        description: |-\n                                          secretRef specifies the secret to use for obtaining the StorageOS API\n                                          credentials.  If not specified, default values will be attempted.\n                                        properties:\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      volumeName:\n                                        description: |-\n                                          volumeName is the human-readable name of the StorageOS volume.  Volume\n                                          names are only unique within a namespace.\n                                        type: string\n                                      volumeNamespace:\n                                        description: |-\n                                          volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                          namespace is specified then the Pod's namespace will be used.  This allows the\n                                          Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                          Set VolumeName to any name to override the default behaviour.\n                                          Set to \"default\" if you are not using namespaces within StorageOS.\n                                          Namespaces that do not pre-exist within StorageOS will be created.\n                                        type: string\n                                    type: object\n                                  vsphereVolume:\n                                    description: vsphereVolume represents a vSphere\n                                      volume attached and mounted on kubelets host\n                                      machine\n                                    properties:\n                                      fsType:\n                                        description: |-\n                                          fsType is filesystem type to mount.\n                                          Must be a filesystem type supported by the host operating system.\n                                          Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                        type: string\n                                      storagePolicyID:\n                                        description: storagePolicyID is the storage\n                                          Policy Based Management (SPBM) profile ID\n                                          associated with the StoragePolicyName.\n                                        type: string\n                                      storagePolicyName:\n                                        description: storagePolicyName is the storage\n                                          Policy Based Management (SPBM) profile name.\n                                        type: string\n                                      volumePath:\n                                        description: volumePath is the path that identifies\n                                          vSphere volume vmdk\n                                        type: string\n                                    required:\n                                    - volumePath\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                          required:\n                          - containers\n                          type: object\n                        type:\n                          description: |-\n                            Defines the workload type of the action. Valid values include \"Job\" and \"Pod\".\n\n\n                            - \"Job\": Creates a Job to execute the action.\n                            - \"Pod\": Creates a Pod to execute the action.\n                               Note: unlike Jobs, manually deleting a Pod does not affect the `backoffLimit`.\n                          enum:\n                          - Job\n                          - Pod\n                          type: string\n                      required:\n                      - podSpec\n                      - type\n                      type: object\n                  required:\n                  - name\n                  type: object\n                  x-kubernetes-validations:\n                  - message: at least one action exists for workload, exec and resourceModifier.\n                    rule: has(self.workload) || has(self.exec) || has(self.resourceModifier)\n                minItems: 1\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              componentInfos:\n                description: |-\n                  Specifies a list of ComponentDefinition for Components associated with this OpsDefinition.\n                  It also includes connection credentials (address and account) for each Component.\n                items:\n                  properties:\n                    accountName:\n                      description: |-\n                        Specifies the account name associated with the Component.\n                        If set, the corresponding account username and password are injected into containers' environment variables\n                        `KB_ACCOUNT_USERNAME` and `KB_ACCOUNT_PASSWORD`.\n                      type: string\n                    componentDefinitionName:\n                      description: |-\n                        Specifies the name of the ComponentDefinition.\n                        The name can represent an exact name, a name prefix, or a regular expression pattern.\n\n\n                        For example:\n\n\n                        - \"mysql-8.0.30-v1alpha1\": Matches the exact name \"mysql-8.0.30-v1alpha1\"\n                        - \"mysql-8.0.30\": Matches all names starting with \"mysql-8.0.30\"\n                        - \"^mysql-8.0.\\d{1,2}$\": Matches all names starting with \"mysql-8.0.\" followed by one or two digits.\n                      maxLength: 32\n                      type: string\n                    imageMappings:\n                      description: ImageMappings specifies the mapping from service\n                        versions to image addresses.\n                      items:\n                        properties:\n                          images:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Images are the container image addresses to use for the matched service versions.\n                              Key is the container name, and value is the image address.\n                            type: object\n                          serviceVersions:\n                            description: ServiceVersions is a list of service versions\n                              that this mapping applies to.\n                            items:\n                              type: string\n                            type: array\n                        required:\n                        - images\n                        - serviceVersions\n                        type: object\n                      type: array\n                    serviceName:\n                      description: |-\n                        Specifies the name of the Service.\n                        If set, the service name is injected as the `KB_COMP_SVC_NAME` environment variable in the containers,\n                        and each service port is mapped to a corresponding environment variable named `KB_COMP_SVC_PORT_$(portName)`.\n                        The `portName` is transformed by replacing '-' with '_' and converting to uppercase.\n                      type: string\n                  required:\n                  - componentDefinitionName\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - componentDefinitionName\n                x-kubernetes-list-type: map\n              parametersSchema:\n                description: Specifies the schema for validating the data types and\n                  value ranges of parameters in OpsActions before their usage.\n                properties:\n                  openAPIV3Schema:\n                    description: |-\n                      Defines the schema for parameters using the OpenAPI v3.\n                      The supported property types include:\n                      - string\n                      - number\n                      - integer\n                      - array: Note that only items of string type are supported.\n                    type: object\n                    x-kubernetes-preserve-unknown-fields: true\n                type: object\n              podInfoExtractors:\n                description: |-\n                  Specifies a list of PodInfoExtractor, each designed to select a specific Pod and extract selected runtime info\n                  from its PodSpec.\n                  The extracted information, such as environment variables, volumes and tolerations, are then injected into\n                  Jobs or Pods that execute the OpsActions defined in `actions`.\n                items:\n                  properties:\n                    env:\n                      description: |-\n                        Specifies a list of environment variables to be extracted from a selected Pod,\n                        and injected into the containers executing each OpsAction.\n                      items:\n                        properties:\n                          name:\n                            description: |-\n                              Specifies the name of the environment variable to be injected into Pods executing OpsActions.\n                              It must conform to the C_IDENTIFIER format, which includes only alphanumeric characters and underscores, and cannot begin with a digit.\n                            type: string\n                          optional:\n                            description: Specify whether the ENV must be defined.\n                            type: boolean\n                          valueFrom:\n                            description: Specifies the source of the environment variable's\n                              value.\n                            properties:\n                              envRef:\n                                description: |-\n                                  Specifies a reference to a specific environment variable within a container.\n                                  Used to specify the source of the variable, which can be either \"env\" or \"envFrom\".\n                                properties:\n                                  envName:\n                                    description: |-\n                                      Defines the name of the environment variable.\n                                      This name can originate from an 'env' entry or be a data key from an 'envFrom' source.\n                                    type: string\n                                  targetContainerName:\n                                    description: |-\n                                      Specifies the container name in the target Pod.\n                                      If not specified, the first container will be used by default.\n                                    type: string\n                                required:\n                                - envName\n                                type: object\n                              fieldPath:\n                                description: |-\n                                  Represents the JSONPath expression pointing to the specific data within the JSON structure of the target Pod.\n                                  It is used to extract precise data locations for operations on the Pod.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                            x-kubernetes-validations:\n                            - message: either fieldPath and envRef.\n                              rule: has(self.envRef) || has(self.fieldPath)\n                        required:\n                        - name\n                        - valueFrom\n                        type: object\n                      type: array\n                    name:\n                      description: Specifies the name of the PodInfoExtractor.\n                      maxLength: 32\n                      type: string\n                    podSelector:\n                      description: Used to select the target Pod from which environment\n                        variables and volumes are extracted from its PodSpec.\n                      properties:\n                        multiPodSelectionPolicy:\n                          default: Any\n                          description: |-\n                            Defines the policy for selecting the target pod when multiple pods match the podSelector.\n                            It can be either 'Any' (select any one pod that matches the podSelector)\n                            or 'All' (select all pods that match the podSelector).\n                          enum:\n                          - All\n                          - Any\n                          type: string\n                        role:\n                          description: Specifies the role of the target Pod.\n                          type: string\n                      type: object\n                    volumeMounts:\n                      description: |-\n                        Specifies a list of volumes, along with their respective mount points, that are to be extracted from a selected Pod,\n                        and mounted onto the containers executing each OpsAction.\n                        This allows the containers to access shared or persistent data necessary for the operation.\n                      items:\n                        description: VolumeMount describes a mounting of a Volume\n                          within a container.\n                        properties:\n                          mountPath:\n                            description: |-\n                              Path within the container at which the volume should be mounted.  Must\n                              not contain ':'.\n                            type: string\n                          mountPropagation:\n                            description: |-\n                              mountPropagation determines how mounts are propagated from the host\n                              to container and the other way around.\n                              When not set, MountPropagationNone is used.\n                              This field is beta in 1.10.\n                            type: string\n                          name:\n                            description: This must match the Name of a Volume.\n                            type: string\n                          readOnly:\n                            description: |-\n                              Mounted read-only if true, read-write otherwise (false or unspecified).\n                              Defaults to false.\n                            type: boolean\n                          subPath:\n                            description: |-\n                              Path within the volume from which the container's volume should be mounted.\n                              Defaults to \"\" (volume's root).\n                            type: string\n                          subPathExpr:\n                            description: |-\n                              Expanded path within the volume from which the container's volume should be mounted.\n                              Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                              Defaults to \"\" (volume's root).\n                              SubPathExpr and SubPath are mutually exclusive.\n                            type: string\n                        required:\n                        - mountPath\n                        - name\n                        type: object\n                      type: array\n                  required:\n                  - name\n                  - podSelector\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              preConditions:\n                description: |-\n                  Specifies the preconditions that must be met to run the actions for the operation.\n                  if set, it will check the condition before the Component runs this operation.\n                  Example:\n                  ```yaml\n                   preConditions:\n                   - rule:\n                       expression: '{{ eq .component.status.phase \"Running\" }}'\n                       message: Component is not in Running status.\n                  ```\n                items:\n                  properties:\n                    rule:\n                      description: Specifies the conditions that must be met for the\n                        operation to execute.\n                      properties:\n                        expression:\n                          description: |-\n                            Specifies a Go template expression that determines how the operation can be executed.\n                            The return value must be either `true` or `false`.\n                            Available built-in objects that can be referenced in the expression include:\n\n\n                            - `params`: Input parameters.\n                            - `cluster`: The referenced Cluster object.\n                            - `component`: The referenced Component object.\n                          type: string\n                        message:\n                          description: Specifies the error or status message reported\n                            if the `expression` does not evaluate to `true`.\n                          type: string\n                      required:\n                      - expression\n                      - message\n                      type: object\n                  type: object\n                type: array\n            required:\n            - actions\n            type: object\n          status:\n            description: OpsDefinitionStatus defines the observed state of OpsDefinition\n            properties:\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: Represents the most recent generation observed of this\n                  OpsDefinition.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Represents the current state of the OpsDefinition.\n                  Valid values are \"\", \"Available\", \"Unavailable\".\n                  When it equals to \"Available\", the OpsDefinition is ready and can be used in a \"Custom\" OpsRequest.\n                enum:\n                - Available\n                - Unavailable\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: opsrequests.operations.kubeblocks.io\nspec:\n  group: operations.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: OpsRequest\n    listKind: OpsRequestList\n    plural: opsrequests\n    shortNames:\n    - ops\n    singular: opsrequest\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - description: Operation request type.\n      jsonPath: .spec.type\n      name: TYPE\n      type: string\n    - description: Operand cluster.\n      jsonPath: .spec.clusterName\n      name: CLUSTER\n      type: string\n    - description: Operation status phase.\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - description: Operation processing progress.\n      jsonPath: .status.progress\n      name: PROGRESS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: OpsRequest is the Schema for the opsrequests API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: OpsRequestSpec defines the desired state of OpsRequest\n            properties:\n              backup:\n                description: Specifies the parameters to back up a Cluster.\n                properties:\n                  backupMethod:\n                    description: |-\n                      Specifies the name of BackupMethod.\n                      The specified BackupMethod must be defined in the BackupPolicy.\n                    type: string\n                  backupName:\n                    description: Specifies the name of the Backup custom resource.\n                    type: string\n                  backupPolicyName:\n                    description: Indicates the name of the BackupPolicy applied to\n                      perform this Backup.\n                    type: string\n                  deletionPolicy:\n                    default: Delete\n                    description: |-\n                      Determines whether the backup contents stored in backup repository\n                      should be deleted when the Backup custom resource is deleted.\n                      Supported values are `Retain` and `Delete`.\n                      - `Retain` means that the backup content and its physical snapshot on backup repository are kept.\n                      - `Delete` means that the backup content and its physical snapshot on backup repository are deleted.\n                    enum:\n                    - Delete\n                    - Retain\n                    type: string\n                  parameters:\n                    description: |-\n                      Specifies a list of name-value pairs representing parameters and their corresponding values.\n                      Parameters match the schema specified in the `actionset.spec.parametersSchema`\n                    items:\n                      properties:\n                        name:\n                          description: Represents the name of the parameter.\n                          type: string\n                        value:\n                          description: Represents the parameter values.\n                          type: string\n                      required:\n                      - name\n                      - value\n                      type: object\n                    maxItems: 128\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                    x-kubernetes-validations:\n                    - message: forbidden to update parameters\n                      rule: self == oldSelf\n                  parentBackupName:\n                    description: If the specified BackupMethod is incremental, `parentBackupName`\n                      is required.\n                    type: string\n                  retentionPeriod:\n                    description: |-\n                      Determines the duration for which the Backup custom resources should be retained.\n\n\n                      The controller will automatically remove all Backup objects that are older than the specified RetentionPeriod.\n                      For example, RetentionPeriod of `30d` will keep only the Backup objects of last 30 days.\n                      Sample duration format:\n\n\n                      - years: 2y\n                      - months: 6mo\n                      - days: 30d\n                      - hours: 12h\n                      - minutes: 30m\n\n\n                      You can also combine the above durations. For example: 30d12h30m.\n                      If not set, the Backup objects will be kept forever.\n\n\n                      If the `deletionPolicy` is set to 'Delete', then the associated backup data will also be deleted\n                      along with the Backup object.\n                      Otherwise, only the Backup custom resource will be deleted.\n                    type: string\n                type: object\n                x-kubernetes-validations:\n                - message: forbidden to update backup.parameters\n                  rule: has(oldSelf.parameters) == has(self.parameters)\n              cancel:\n                description: |-\n                  Indicates whether the current operation should be canceled and terminated gracefully if it's in the\n                  \"Pending\", \"Creating\", or \"Running\" state.\n\n\n                  This field applies only to \"VerticalScaling\" and \"HorizontalScaling\" opsRequests.\n\n\n                  Note: Setting `cancel` to true is irreversible; further modifications to this field are ineffective.\n                type: boolean\n              clusterName:\n                description: Specifies the name of the Cluster resource that this\n                  operation is targeting.\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.clusterName\n                  rule: self == oldSelf\n              custom:\n                description: Specifies a custom operation defined by OpsDefinition.\n                properties:\n                  components:\n                    description: |-\n                      Specifies the components and their parameters for executing custom actions as defined in OpsDefinition.\n                      Requires at least one component.\n                    items:\n                      properties:\n                        componentName:\n                          description: Specifies the name of the Component as defined\n                            in the cluster.spec\n                          type: string\n                        parameters:\n                          description: Specifies the parameters that match the schema\n                            specified in the `opsDefinition.spec.parametersSchema`.\n                          items:\n                            properties:\n                              name:\n                                description: Specifies the identifier of the parameter\n                                  as defined in the OpsDefinition.\n                                type: string\n                              value:\n                                description: |-\n                                  Holds the data associated with the parameter.\n                                  If the parameter type is an array, the format should be \"v1,v2,v3\".\n                                type: string\n                              valueFrom:\n                                description: Source for the parameter's value. Cannot\n                                  be used if value is not empty.\n                                properties:\n                                  configMapKeyRef:\n                                    description: Selects a key of a ConfigMap.\n                                    properties:\n                                      key:\n                                        description: The key to select.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          or its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  secretKeyRef:\n                                    description: Selects a key of a Secret.\n                                    properties:\n                                      key:\n                                        description: The key of the secret to select\n                                          from.  Must be a valid secret key.\n                                        type: string\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret or\n                                          its key must be defined\n                                        type: boolean\n                                    required:\n                                    - key\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                            required:\n                            - name\n                            - value\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                      required:\n                      - componentName\n                      type: object\n                    maxItems: 1024\n                    minItems: 1\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - componentName\n                    x-kubernetes-list-type: map\n                  maxConcurrentComponents:\n                    anyOf:\n                    - type: integer\n                    - type: string\n                    description: |-\n                      Specifies the maximum number of components to be operated on concurrently to mitigate performance impact\n                      on clusters with multiple components.\n\n\n                      It accepts an absolute number (e.g., 5) or a percentage of components to execute in parallel (e.g., \"10%\").\n                      Percentages are rounded up to the nearest whole number of components.\n                      For example, if \"10%\" results in less than one, it rounds up to 1.\n\n\n                      When unspecified, all components are processed simultaneously by default.\n\n\n                      Note: This feature is not implemented yet.\n                    x-kubernetes-int-or-string: true\n                  opsDefinitionName:\n                    description: Specifies the name of the OpsDefinition.\n                    type: string\n                  serviceAccountName:\n                    description: Specifies the name of the ServiceAccount to be used\n                      for executing the custom operation.\n                    type: string\n                required:\n                - components\n                - opsDefinitionName\n                type: object\n              enqueueOnForce:\n                default: false\n                description: Indicates whether opsRequest should continue to queue\n                  when 'force' is set to true.\n                type: boolean\n              expose:\n                description: Lists Expose objects, each specifying a Component and\n                  its services to be exposed.\n                items:\n                  properties:\n                    componentName:\n                      description: Specifies the name of the Component.\n                      type: string\n                    services:\n                      description: |-\n                        Specifies a list of OpsService.\n                        When an OpsService is exposed, a corresponding ClusterService will be added to `cluster.spec.services`.\n                        On the other hand, when an OpsService is unexposed, the corresponding ClusterService will be removed\n                        from `cluster.spec.services`.\n\n\n                        Note: If `componentName` is not specified, the `ports` and `selector` fields must be provided\n                        in each OpsService definition.\n                      items:\n                        description: OpsService represents the parameters to dynamically\n                          create or remove a ClusterService in the `cluster.spec.services`\n                          array.\n                        properties:\n                          annotations:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Contains cloud provider related parameters if ServiceType is LoadBalancer.\n\n\n                              More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                            type: object\n                          ipFamilies:\n                            description: |-\n                              A list of IP families (e.g., IPv4, IPv6) assigned to this Service.\n\n\n                              Usually assigned automatically based on the cluster configuration and the `ipFamilyPolicy` field.\n                              If specified manually, the requested IP family must be available in the cluster and allowed by the `ipFamilyPolicy`.\n                              If the requested IP family is not available or not allowed, the Service creation will fail.\n\n\n                              Valid values:\n\n\n                              - \"IPv4\"\n                              - \"IPv6\"\n\n\n                              This field may hold a maximum of two entries (dual-stack families, in either order).\n\n\n                              Common combinations of `ipFamilies` and `ipFamilyPolicy` are:\n\n\n                              - ipFamilies=[] + ipFamilyPolicy=\"PreferDualStack\" :\n                                The Service prefers dual-stack but can fall back to single-stack if the cluster does not support dual-stack.\n                                The IP family is automatically assigned based on the cluster configuration.\n                              - ipFamilies=[\"IPV4\",\"IPV6\"] + ipFamilyPolicy=\"RequiredDualStack\" :\n                                The Service requires dual-stack and will only be created if the cluster supports both IPv4 and IPv6.\n                                The primary IP family is IPV4.\n                              - ipFamilies=[\"IPV6\",\"IPV4\"] + ipFamilyPolicy=\"RequiredDualStack\" :\n                                The Service requires dual-stack and will only be created if the cluster supports both IPv4 and IPv6.\n                                The primary IP family is IPV6.\n                              - ipFamilies=[\"IPV4\"] + ipFamilyPolicy=\"SingleStack\" :\n                                The Service uses a single-stack with IPv4 only.\n                              - ipFamilies=[\"IPV6\"] + ipFamilyPolicy=\"SingleStack\" :\n                                The Service uses a single-stack with IPv6 only.\n                            items:\n                              description: |-\n                                IPFamily represents the IP Family (IPv4 or IPv6). This type is used\n                                to express the family of an IP expressed by a type (e.g. service.spec.ipFamilies).\n                              type: string\n                            type: array\n                            x-kubernetes-list-type: atomic\n                          ipFamilyPolicy:\n                            description: |-\n                              Specifies whether the Service should use a single IP family (SingleStack) or two IP families (DualStack).\n\n\n                              Possible values:\n\n\n                              - 'SingleStack' (default) : The Service uses a single IP family.\n                                If no value is provided, IPFamilyPolicy defaults to SingleStack.\n                              - 'PreferDualStack' : The Service prefers to use two IP families on dual-stack configured clusters\n                                or a single IP family on single-stack clusters.\n                              - 'RequiredDualStack' : The Service requires two IP families on dual-stack configured clusters.\n                                If the cluster is not configured for dual-stack, the Service creation fails.\n                            type: string\n                          name:\n                            description: |-\n                              Specifies the name of the Service. This name is used to set `clusterService.name`.\n\n\n                              Note: This field cannot be updated.\n                            type: string\n                          podSelector:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Routes service traffic to pods with matching label keys and values.\n                              If specified, the service will only be exposed to pods matching the selector.\n\n\n                              Note: If the component has roles, at least one of 'roleSelector' or 'podSelector' must be specified.\n                              If both are specified, a pod must match both conditions to be selected.\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          ports:\n                            description: |-\n                              Specifies Port definitions that are to be exposed by a ClusterService.\n\n\n                              If not specified, the Port definitions from non-NodePort and non-LoadBalancer type ComponentService\n                              defined in the ComponentDefinition (`componentDefinition.spec.services`) will be used.\n                              If no matching ComponentService is found, the expose operation will fail.\n\n\n                              More info: https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports\n                            items:\n                              description: ServicePort contains information on service's\n                                port.\n                              properties:\n                                appProtocol:\n                                  description: |-\n                                    The application protocol for this port.\n                                    This is used as a hint for implementations to offer richer behavior for protocols that they understand.\n                                    This field follows standard Kubernetes label syntax.\n                                    Valid values are either:\n\n\n                                    * Un-prefixed protocol names - reserved for IANA standard service names (as per\n                                    RFC-6335 and https://www.iana.org/assignments/service-names).\n\n\n                                    * Kubernetes-defined prefixed names:\n                                      * 'kubernetes.io/h2c' - HTTP/2 prior knowledge over cleartext as described in https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior-\n                                      * 'kubernetes.io/ws'  - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n                                      * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n\n                                    * Other protocols should use implementation-defined prefixed names such as\n                                    mycompany.com/my-custom-protocol.\n                                  type: string\n                                name:\n                                  description: |-\n                                    The name of this port within the service. This must be a DNS_LABEL.\n                                    All ports within a ServiceSpec must have unique names. When considering\n                                    the endpoints for a Service, this must match the 'name' field in the\n                                    EndpointPort.\n                                    Optional if only one ServicePort is defined on this service.\n                                  type: string\n                                nodePort:\n                                  description: |-\n                                    The port on each node on which this service is exposed when type is\n                                    NodePort or LoadBalancer.  Usually assigned by the system. If a value is\n                                    specified, in-range, and not in use it will be used, otherwise the\n                                    operation will fail.  If not specified, a port will be allocated if this\n                                    Service requires one.  If this field is specified when creating a\n                                    Service which does not need it, creation will fail. This field will be\n                                    wiped when updating a Service to no longer need it (e.g. changing type\n                                    from NodePort to ClusterIP).\n                                    More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n                                  format: int32\n                                  type: integer\n                                port:\n                                  description: The port that will be exposed by this\n                                    service.\n                                  format: int32\n                                  type: integer\n                                protocol:\n                                  default: TCP\n                                  description: |-\n                                    The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\".\n                                    Default is TCP.\n                                  type: string\n                                targetPort:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    Number or name of the port to access on the pods targeted by the service.\n                                    Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.\n                                    If this is a string, it will be looked up as a named port in the\n                                    target Pod's container ports. If this is not specified, the value\n                                    of the 'port' field is used (an identity map).\n                                    This field is ignored for services with clusterIP=None, and should be\n                                    omitted or set equal to the 'port' field.\n                                    More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service\n                                  x-kubernetes-int-or-string: true\n                              required:\n                              - port\n                              type: object\n                            type: array\n                            x-kubernetes-list-map-keys:\n                            - port\n                            - protocol\n                            x-kubernetes-list-type: map\n                          roleSelector:\n                            description: |-\n                              Specifies a role to target with the service.\n                              If specified, the service will only be exposed to pods with the matching role.\n\n\n                              Note: If the component has roles, at least one of 'roleSelector' or 'podSelector' must be specified.\n                              If both are specified, a pod must match both conditions to be selected.\n                            type: string\n                          serviceType:\n                            description: |-\n                              Determines how the Service is exposed. Defaults to 'ClusterIP'.\n                              Valid options are `ClusterIP`, `NodePort`, and `LoadBalancer`.\n\n\n                              - `ClusterIP`: allocates a cluster-internal IP address for load-balancing to endpoints.\n                                 Endpoints are determined by the selector or if that is not specified,\n                                 they are determined by manual construction of an Endpoints object or EndpointSlice objects.\n                              - `NodePort`: builds on ClusterIP and allocates a port on every node which routes to the same endpoints as the clusterIP.\n                              - `LoadBalancer`: builds on NodePort and creates an external load-balancer (if supported in the current cloud)\n                                 which routes to the same endpoints as the clusterIP.\n\n\n                              Note: although K8s Service type allows the 'ExternalName' type, it is not a valid option for the expose operation.\n\n\n                              For more info, see:\n                              https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    switch:\n                      description: |-\n                        Indicates whether the services will be exposed.\n                        'Enable' exposes the services. while 'Disable' removes the exposed Service.\n                      enum:\n                      - Enable\n                      - Disable\n                      type: string\n                  required:\n                  - services\n                  - switch\n                  type: object\n                type: array\n              force:\n                description: |-\n                  Instructs the system to bypass pre-checks (including cluster state checks and customized pre-conditions hooks)\n                  and immediately execute the opsRequest, except for the opsRequest of 'Start' type, which will still undergo\n                  pre-checks even if `force` is true.\n\n\n                  This is useful for concurrent execution of 'VerticalScaling' and 'HorizontalScaling' opsRequests.\n                  By setting `force` to true, you can bypass the default checks and demand these opsRequests to run\n                  simultaneously.\n\n\n                  Note: Once set, the `force` field is immutable and cannot be updated.\n                type: boolean\n                x-kubernetes-validations:\n                - message: forbidden to update spec.force\n                  rule: self == oldSelf\n              horizontalScaling:\n                description: |-\n                  Lists HorizontalScaling objects, each specifying scaling requirements for a Component,\n                  including desired replica changes, configurations for new instances, modifications for existing instances,\n                  and take offline/online the specified instances.\n                items:\n                  description: HorizontalScaling defines the parameters of a horizontal\n                    scaling operation.\n                  properties:\n                    componentName:\n                      description: Specifies the name of the Component as defined\n                        in the cluster.spec\n                      type: string\n                    scaleIn:\n                      description: |-\n                        Specifies the replica changes for scaling in components and instance templates,\n                        and takes specified instances offline. Can be used in conjunction with the \"scaleOut\" operation.\n                        Note: Any configuration that creates instances is considered invalid.\n                      properties:\n                        instances:\n                          description: |-\n                            Modifies the desired replicas count for existing InstanceTemplate.\n                            if the inst\n                          items:\n                            description: InstanceReplicasTemplate defines the template\n                              for instance replicas.\n                            properties:\n                              name:\n                                description: Specifies the name of the instance template.\n                                type: string\n                              replicaChanges:\n                                description: Specifies the replica changes for the\n                                  instance template.\n                                format: int32\n                                minimum: 0\n                                type: integer\n                            required:\n                            - name\n                            - replicaChanges\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        onlineInstancesToOffline:\n                          description: Specifies the instance names that need to be\n                            taken offline.\n                          items:\n                            type: string\n                          type: array\n                        replicaChanges:\n                          description: Specifies the replica changes for the component.\n                          format: int32\n                          minimum: 0\n                          type: integer\n                      type: object\n                    scaleOut:\n                      description: |-\n                        Specifies the replica changes for scaling out components and instance templates,\n                        and brings offline instances back online. Can be used in conjunction with the \"scaleIn\" operation.\n                        Note: Any configuration that deletes instances is considered invalid.\n                      properties:\n                        fromBackup:\n                          description: |-\n                            FromBackup specifies the configuration for creating new instances from an existing backup.\n                            This is only effective for non-sharding components.\n                            When specified, new instances will be created using data from the specified backup.\n                          properties:\n                            name:\n                              description: Specifies the name of the Backup name.\n                              type: string\n                            namespace:\n                              description: |-\n                                Specifies the namespace of the Backup namespace.\n                                If not specified, the namespace of the OpsRequest will be used.\n                              type: string\n                            restoreEnv:\n                              description: |-\n                                Defines container environment variables for the restore process.\n                                merged with the ones specified in the Backup and ActionSet resources.\n\n\n                                Merge priority: Restore env > Backup env > ActionSet env.\n\n\n                                Purpose: Some databases require different configurations when being restored as a standby\n                                compared to being restored as a primary.\n                                For example, when restoring MySQL as a replica, you need to set `skip_slave_start=\"ON\"` for 5.7\n                                or `skip_replica_start=\"ON\"` for 8.0.\n                                Allowing environment variables to be passed in makes it more convenient to control these behavioral differences\n                                during the restore process.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                              x-kubernetes-preserve-unknown-fields: true\n                            restorePointInTime:\n                              description: |-\n                                Specifies the point in time to which the restore should be performed.\n                                Supported time formats:\n\n\n                                - RFC3339 format, e.g. \"2023-11-25T18:52:53Z\"\n                                - A human-readable date-time format, e.g. \"Jul 25,2023 18:52:53 UTC+0800\"\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        instances:\n                          description: |-\n                            Modifies the desired replicas count for existing InstanceTemplate.\n                            if the inst\n                          items:\n                            description: InstanceReplicasTemplate defines the template\n                              for instance replicas.\n                            properties:\n                              name:\n                                description: Specifies the name of the instance template.\n                                type: string\n                              replicaChanges:\n                                description: Specifies the replica changes for the\n                                  instance template.\n                                format: int32\n                                minimum: 0\n                                type: integer\n                            required:\n                            - name\n                            - replicaChanges\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        newInstances:\n                          description: |-\n                            Defines the configuration for new instances added during scaling, including resource requirements, labels, annotations, etc.\n                            New instances are created based on the provided instance templates.\n                          items:\n                            description: InstanceTemplate allows customization of\n                              individual replica configurations in a Component.\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                                  Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                                type: object\n                              env:\n                                description: |-\n                                  Defines Env to override.\n                                  Add new or override existing envs.\n                                items:\n                                  description: EnvVar represents an environment variable\n                                    present in a Container.\n                                  properties:\n                                    name:\n                                      description: Name of the environment variable.\n                                        Must be a C_IDENTIFIER.\n                                      type: string\n                                    value:\n                                      description: |-\n                                        Variable references $(VAR_NAME) are expanded\n                                        using the previously defined environment variables in the container and\n                                        any service environment variables. If a variable cannot be resolved,\n                                        the reference in the input string will be unchanged. Double $$ are reduced\n                                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                        Escaped references will never be expanded, regardless of whether the variable\n                                        exists or not.\n                                        Defaults to \"\".\n                                      type: string\n                                    valueFrom:\n                                      description: Source for the environment variable's\n                                        value. Cannot be used if value is not empty.\n                                      properties:\n                                        configMapKeyRef:\n                                          description: Selects a key of a ConfigMap.\n                                          properties:\n                                            key:\n                                              description: The key to select.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        fieldRef:\n                                          description: |-\n                                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        secretKeyRef:\n                                          description: Selects a key of a secret in\n                                            the pod's namespace\n                                          properties:\n                                            key:\n                                              description: The key of the secret to\n                                                select from.  Must be a valid secret\n                                                key.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                              labels:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                                  Values for existing keys will be overwritten, and new keys will be added.\n                                type: object\n                              name:\n                                description: |-\n                                  Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                                  This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal\n                                  using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                                  The specified name overrides any default naming conventions or patterns.\n                                maxLength: 54\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                              ordinals:\n                                description: |-\n                                  Specifies the desired Ordinals of this InstanceTemplate.\n                                  The Ordinals used to specify the ordinal of the instance (pod) names to be generated under this InstanceTemplate.\n\n\n                                  For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},\n                                  then the instance names generated under this InstanceTemplate would be\n                                  $(cluster.name)-$(component.name)-$(template.name)-0、$(cluster.name)-$(component.name)-$(template.name)-1 and\n                                  $(cluster.name)-$(component.name)-$(template.name)-7\n                                properties:\n                                  discrete:\n                                    items:\n                                      format: int32\n                                      type: integer\n                                    type: array\n                                  ranges:\n                                    items:\n                                      description: |-\n                                        Range represents a range with a start and an end value.\n                                        It is used to define a continuous segment.\n                                      properties:\n                                        end:\n                                          format: int32\n                                          type: integer\n                                        start:\n                                          format: int32\n                                          type: integer\n                                      required:\n                                      - end\n                                      - start\n                                      type: object\n                                    type: array\n                                type: object\n                              replicas:\n                                default: 1\n                                description: |-\n                                  Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                                  This field allows setting how many replicated instances of the Component,\n                                  with the specific overrides in the InstanceTemplate, are created.\n                                  The default value is 1. A value of 0 disables instance creation.\n                                format: int32\n                                minimum: 0\n                                type: integer\n                              resources:\n                                description: |-\n                                  Specifies an override for the resource requirements of the first container in the Pod.\n                                  This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                                properties:\n                                  claims:\n                                    description: |-\n                                      Claims lists the names of resources, defined in spec.resourceClaims,\n                                      that are used by this container.\n\n\n                                      This is an alpha field and requires enabling the\n                                      DynamicResourceAllocation feature gate.\n\n\n                                      This field is immutable. It can only be set for containers.\n                                    items:\n                                      description: ResourceClaim references one entry\n                                        in PodSpec.ResourceClaims.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name must match the name of one entry in pod.spec.resourceClaims of\n                                            the Pod where this field is used. It makes that resource available\n                                            inside a container.\n                                          type: string\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - name\n                                    x-kubernetes-list-type: map\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                              schedulingPolicy:\n                                description: |-\n                                  Specifies the scheduling policy for the instance.\n                                  If defined, it will overwrite the scheduling policy defined in ClusterSpec and/or ClusterComponentSpec.\n                                properties:\n                                  affinity:\n                                    description: Specifies a group of affinity scheduling\n                                      rules of the Cluster, including NodeAffinity,\n                                      PodAffinity, and PodAntiAffinity.\n                                    properties:\n                                      nodeAffinity:\n                                        description: Describes node affinity scheduling\n                                          rules for the pod.\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: |-\n                                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                              properties:\n                                                preference:\n                                                  description: A node selector term,\n                                                    associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        labels.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchFields:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        fields.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                weight:\n                                                  description: Weight associated with\n                                                    matching the corresponding nodeSelectorTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - preference\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to an update), the system\n                                              may or may not try to eventually evict the pod from its node.\n                                            properties:\n                                              nodeSelectorTerms:\n                                                description: Required. A list of node\n                                                  selector terms. The terms are ORed.\n                                                items:\n                                                  description: |-\n                                                    A null or empty node selector term matches no objects. The requirements of\n                                                    them are ANDed.\n                                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        labels.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchFields:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        fields.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                type: array\n                                            required:\n                                            - nodeSelectorTerms\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                        type: object\n                                      podAffinity:\n                                        description: Describes pod affinity scheduling\n                                          rules (e.g. co-locate this pod in the same\n                                          node, zone, etc. as some other pod(s)).\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: The weights of all of the\n                                                matched WeightedPodAffinityTerm fields\n                                                are added per-node to find the most\n                                                preferred node(s)\n                                              properties:\n                                                podAffinityTerm:\n                                                  description: Required. A pod affinity\n                                                    term, associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    labelSelector:\n                                                      description: |-\n                                                        A label query over a set of resources, in this case pods.\n                                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    matchLabelKeys:\n                                                      description: |-\n                                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    mismatchLabelKeys:\n                                                      description: |-\n                                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    namespaceSelector:\n                                                      description: |-\n                                                        A label query over the set of namespaces that the term applies to.\n                                                        The term is applied to the union of the namespaces selected by this field\n                                                        and the ones listed in the namespaces field.\n                                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                        An empty selector ({}) matches all namespaces.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    namespaces:\n                                                      description: |-\n                                                        namespaces specifies a static list of namespace names that the term applies to.\n                                                        The term is applied to the union of the namespaces listed in this field\n                                                        and the ones selected by namespaceSelector.\n                                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                    topologyKey:\n                                                      description: |-\n                                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                                        selected pods is running.\n                                                        Empty topologyKey is not allowed.\n                                                      type: string\n                                                  required:\n                                                  - topologyKey\n                                                  type: object\n                                                weight:\n                                                  description: |-\n                                                    weight associated with matching the corresponding podAffinityTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - podAffinityTerm\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to a pod label update), the\n                                              system may or may not try to eventually evict the pod from its node.\n                                              When there are multiple elements, the lists of nodes corresponding to each\n                                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                            items:\n                                              description: |-\n                                                Defines a set of pods (namely those matching the labelSelector\n                                                relative to the given namespace(s)) that this pod should be\n                                                co-located (affinity) or not co-located (anti-affinity) with,\n                                                where co-located is defined as running on a node whose value of\n                                                the label with key <topologyKey> matches that of any node on which\n                                                a pod of the set of pods is running\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            type: array\n                                        type: object\n                                      podAntiAffinity:\n                                        description: Describes pod anti-affinity scheduling\n                                          rules (e.g. avoid putting this pod in the\n                                          same node, zone, etc. as some other pod(s)).\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the anti-affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: The weights of all of the\n                                                matched WeightedPodAffinityTerm fields\n                                                are added per-node to find the most\n                                                preferred node(s)\n                                              properties:\n                                                podAffinityTerm:\n                                                  description: Required. A pod affinity\n                                                    term, associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    labelSelector:\n                                                      description: |-\n                                                        A label query over a set of resources, in this case pods.\n                                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    matchLabelKeys:\n                                                      description: |-\n                                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    mismatchLabelKeys:\n                                                      description: |-\n                                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    namespaceSelector:\n                                                      description: |-\n                                                        A label query over the set of namespaces that the term applies to.\n                                                        The term is applied to the union of the namespaces selected by this field\n                                                        and the ones listed in the namespaces field.\n                                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                        An empty selector ({}) matches all namespaces.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    namespaces:\n                                                      description: |-\n                                                        namespaces specifies a static list of namespace names that the term applies to.\n                                                        The term is applied to the union of the namespaces listed in this field\n                                                        and the ones selected by namespaceSelector.\n                                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                    topologyKey:\n                                                      description: |-\n                                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                                        selected pods is running.\n                                                        Empty topologyKey is not allowed.\n                                                      type: string\n                                                  required:\n                                                  - topologyKey\n                                                  type: object\n                                                weight:\n                                                  description: |-\n                                                    weight associated with matching the corresponding podAffinityTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - podAffinityTerm\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the anti-affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the anti-affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to a pod label update), the\n                                              system may or may not try to eventually evict the pod from its node.\n                                              When there are multiple elements, the lists of nodes corresponding to each\n                                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                            items:\n                                              description: |-\n                                                Defines a set of pods (namely those matching the labelSelector\n                                                relative to the given namespace(s)) that this pod should be\n                                                co-located (affinity) or not co-located (anti-affinity) with,\n                                                where co-located is defined as running on a node whose value of\n                                                the label with key <topologyKey> matches that of any node on which\n                                                a pod of the set of pods is running\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            type: array\n                                        type: object\n                                    type: object\n                                  nodeName:\n                                    description: |-\n                                      NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                                      the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                                      requirements.\n                                    type: string\n                                  nodeSelector:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      NodeSelector is a selector which must be true for the Pod to fit on a node.\n                                      Selector which must match a node's labels for the Pod to be scheduled on that node.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  schedulerName:\n                                    description: |-\n                                      If specified, the Pod will be dispatched by specified scheduler.\n                                      If not specified, the Pod will be dispatched by default scheduler.\n                                    type: string\n                                  tolerations:\n                                    description: |-\n                                      Allows Pods to be scheduled onto nodes with matching taints.\n                                      Each toleration in the array allows the Pod to tolerate node taints based on\n                                      specified `key`, `value`, `effect`, and `operator`.\n\n\n                                      - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                                      - The `operator` determines how the toleration matches the taint.\n\n\n                                      Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                                    items:\n                                      description: |-\n                                        The pod this Toleration is attached to tolerates any taint that matches\n                                        the triple <key,value,effect> using the matching operator <operator>.\n                                      properties:\n                                        effect:\n                                          description: |-\n                                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                          type: string\n                                        key:\n                                          description: |-\n                                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            Operator represents a key's relationship to the value.\n                                            Valid operators are Exists and Equal. Defaults to Equal.\n                                            Exists is equivalent to wildcard for value, so that a pod can\n                                            tolerate all taints of a particular category.\n                                          type: string\n                                        tolerationSeconds:\n                                          description: |-\n                                            TolerationSeconds represents the period of time the toleration (which must be\n                                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                            negative values will be treated as 0 (evict immediately) by the system.\n                                          format: int64\n                                          type: integer\n                                        value:\n                                          description: |-\n                                            Value is the taint value the toleration matches to.\n                                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                          type: string\n                                      type: object\n                                    type: array\n                                  topologySpreadConstraints:\n                                    description: |-\n                                      TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                                      domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                                      All topologySpreadConstraints are ANDed.\n                                    items:\n                                      description: TopologySpreadConstraint specifies\n                                        how to spread matching pods among the given\n                                        topology.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            LabelSelector is used to find matching pods.\n                                            Pods that match this label selector are counted to determine the number of pods\n                                            in their corresponding topology domain.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                                            spreading will be calculated. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                                            to select the group of existing pods over which spreading will be calculated\n                                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            Keys that don't exist in the incoming pod labels will\n                                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        maxSkew:\n                                          description: |-\n                                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                            between the number of matching pods in the target topology and the global minimum.\n                                            The global minimum is the minimum number of matching pods in an eligible domain\n                                            or zero if the number of eligible domains is less than MinDomains.\n                                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                            labelSelector spread as 2/2/1:\n                                            In this case, the global minimum is 1.\n                                            | zone1 | zone2 | zone3 |\n                                            |  P P  |  P P  |   P   |\n                                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                            violate MaxSkew(1).\n                                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                            to topologies that satisfy it.\n                                            It's a required field. Default value is 1 and 0 is not allowed.\n                                          format: int32\n                                          type: integer\n                                        minDomains:\n                                          description: |-\n                                            MinDomains indicates a minimum number of eligible domains.\n                                            When the number of eligible domains with matching topology keys is less than minDomains,\n                                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                            this value has no effect on scheduling.\n                                            As a result, when the number of eligible domains is less than minDomains,\n                                            scheduler won't schedule more than maxSkew Pods to those domains.\n                                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                            Valid values are integers greater than 0.\n                                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                            labelSelector spread as 2/2/2:\n                                            | zone1 | zone2 | zone3 |\n                                            |  P P  |  P P  |  P P  |\n                                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                            it will violate MaxSkew.\n\n\n                                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                          format: int32\n                                          type: integer\n                                        nodeAffinityPolicy:\n                                          description: |-\n                                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                            when calculating pod topology spread skew. Options are:\n                                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                            If this value is nil, the behavior is equivalent to the Honor policy.\n                                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                          type: string\n                                        nodeTaintsPolicy:\n                                          description: |-\n                                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                            pod topology spread skew. Options are:\n                                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                            has a toleration, are included.\n                                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                          type: string\n                                        topologyKey:\n                                          description: |-\n                                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                                            and identical values are considered to be in the same topology.\n                                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                            of pods into each bucket.\n                                            We define a domain as a particular instance of a topology.\n                                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                            nodeAffinityPolicy and nodeTaintsPolicy.\n                                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                            It's a required field.\n                                          type: string\n                                        whenUnsatisfiable:\n                                          description: |-\n                                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                            the spread constraint.\n                                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                              but giving higher precedence to topologies that would help reduce the\n                                              skew.\n                                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                            if and only if every possible node assignment for that pod would violate\n                                            \"MaxSkew\" on some topology.\n                                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                            labelSelector spread as 3/1/1:\n                                            | zone1 | zone2 | zone3 |\n                                            | P P P |   P   |   P   |\n                                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                            won't make it *more* imbalanced.\n                                            It's a required field.\n                                          type: string\n                                      required:\n                                      - maxSkew\n                                      - topologyKey\n                                      - whenUnsatisfiable\n                                      type: object\n                                    type: array\n                                type: object\n                              volumeClaimTemplates:\n                                description: Specifies an override for the storage\n                                  requirements of the instances.\n                                items:\n                                  properties:\n                                    annotations:\n                                      additionalProperties:\n                                        type: string\n                                      description: Specifies the annotations for the\n                                        PVC of the volume.\n                                      type: object\n                                    labels:\n                                      additionalProperties:\n                                        type: string\n                                      description: Specifies the labels for the PVC\n                                        of the volume.\n                                      type: object\n                                    name:\n                                      description: |-\n                                        Refers to the name of a volumeMount defined in either:\n\n\n                                        - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                                        - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                                        The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                                      type: string\n                                    spec:\n                                      description: |-\n                                        Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                                        with the mount name specified in the `name` field.\n\n\n                                        When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                                        defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                                      properties:\n                                        accessModes:\n                                          description: |-\n                                            Contains the desired access modes the volume should have.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-preserve-unknown-fields: true\n                                        resources:\n                                          description: |-\n                                            Represents the minimum resources the volume should have.\n                                            If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                            are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                          properties:\n                                            limits:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Limits describes the maximum amount of compute resources allowed.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                            requests:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Requests describes the minimum amount of compute resources required.\n                                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                          type: object\n                                          x-kubernetes-preserve-unknown-fields: true\n                                        storageClassName:\n                                          description: |-\n                                            The name of the StorageClass required by the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                          type: string\n                                        volumeAttributesClassName:\n                                          description: |-\n                                            volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n\n\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                          type: string\n                                        volumeMode:\n                                          description: Defines what type of volume\n                                            is required by the claim, either Block\n                                            or Filesystem.\n                                          type: string\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        offlineInstancesToOnline:\n                          description: Specifies the instances in the offline list\n                            to bring back online.\n                          items:\n                            type: string\n                          type: array\n                        replicaChanges:\n                          description: Specifies the replica changes for the component.\n                          format: int32\n                          minimum: 0\n                          type: integer\n                      type: object\n                    shards:\n                      description: |-\n                        Specifies the desired number of shards for the component.\n                        This parameter is mutually exclusive with other parameters.\n                      format: int32\n                      type: integer\n                  required:\n                  - componentName\n                  type: object\n                  x-kubernetes-validations:\n                  - message: shards field cannot be used together with scaleOut or\n                      scaleIn\n                    rule: 'has(self.shards) ? (!has(self.scaleOut) && !has(self.scaleIn))\n                      : true'\n                type: array\n                x-kubernetes-list-map-keys:\n                - componentName\n                x-kubernetes-list-type: map\n                x-kubernetes-validations:\n                - message: forbidden to update spec.horizontalScaling\n                  rule: self == oldSelf\n              preConditionDeadlineSeconds:\n                default: 0\n                description: |-\n                  Specifies the maximum time in seconds that the OpsRequest will wait for its pre-conditions to be met\n                  before it aborts the operation.\n                  If set to 0 (default), pre-conditions must be satisfied immediately for the OpsRequest to proceed.\n                format: int32\n                type: integer\n              rebuildFrom:\n                description: |-\n                  Specifies the parameters to rebuild some instances.\n                  Rebuilding an instance involves restoring its data from a backup or another database replica.\n                  The instances being rebuilt usually serve as standby in the cluster.\n                  Hence, rebuilding instances is often also referred to as \"standby reconstruction\".\n                items:\n                  properties:\n                    backupName:\n                      description: |-\n                        Indicates the name of the Backup custom resource from which to recover the instance.\n                        Defaults to an empty PersistentVolume if unspecified.\n\n\n                        Note:\n                        - Only full physical backups are supported for multi-replica Components (e.g., 'xtrabackup' for MySQL).\n                        - Logical backups (e.g., 'mysqldump' for MySQL) are unsupported in the current version.\n                      type: string\n                    componentName:\n                      description: Specifies the name of the Component as defined\n                        in the cluster.spec\n                      type: string\n                    inPlace:\n                      description: |-\n                        When it is set to true, the instance will be rebuilt in-place.\n                        If false, a new pod will be created. Once the new pod is ready to serve,\n                        the instance that require rebuilding will be taken offline.\n                      type: boolean\n                    instances:\n                      description: Specifies the instances (Pods) that need to be\n                        rebuilt, typically operating as standbys.\n                      items:\n                        properties:\n                          name:\n                            description: Pod name of the instance.\n                            type: string\n                          targetNodeName:\n                            description: |-\n                              The instance will rebuild on the specified node.\n                              If not set, it will rebuild on a random node.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      minItems: 1\n                      type: array\n                    restoreEnv:\n                      description: |-\n                        Defines container environment variables for the restore process.\n                        merged with the ones specified in the Backup and ActionSet resources.\n\n\n                        Merge priority: Restore env > Backup env > ActionSet env.\n\n\n                        Purpose: Some databases require different configurations when being restored as a standby\n                        compared to being restored as a primary.\n                        For example, when restoring MySQL as a replica, you need to set `skip_slave_start=\"ON\"` for 5.7\n                        or `skip_replica_start=\"ON\"` for 8.0.\n                        Allowing environment variables to be passed in makes it more convenient to control these behavioral differences\n                        during the restore process.\n                      items:\n                        description: EnvVar represents an environment variable present\n                          in a Container.\n                        properties:\n                          name:\n                            description: Name of the environment variable. Must be\n                              a C_IDENTIFIER.\n                            type: string\n                          value:\n                            description: |-\n                              Variable references $(VAR_NAME) are expanded\n                              using the previously defined environment variables in the container and\n                              any service environment variables. If a variable cannot be resolved,\n                              the reference in the input string will be unchanged. Double $$ are reduced\n                              to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                              \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                              Escaped references will never be expanded, regardless of whether the variable\n                              exists or not.\n                              Defaults to \"\".\n                            type: string\n                          valueFrom:\n                            description: Source for the environment variable's value.\n                              Cannot be used if value is not empty.\n                            properties:\n                              configMapKeyRef:\n                                description: Selects a key of a ConfigMap.\n                                properties:\n                                  key:\n                                    description: The key to select.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap or\n                                      its key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              fieldRef:\n                                description: |-\n                                  Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                  spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              secretKeyRef:\n                                description: Selects a key of a secret in the pod's\n                                  namespace\n                                properties:\n                                  key:\n                                    description: The key of the secret to select from.  Must\n                                      be a valid secret key.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret or its\n                                      key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-preserve-unknown-fields: true\n                    sourceBackupTargetName:\n                      description: When multiple source targets exist of the backup,\n                        you must specify the source target to restore.\n                      type: string\n                  required:\n                  - componentName\n                  - inPlace\n                  - instances\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - componentName\n                x-kubernetes-list-type: map\n                x-kubernetes-validations:\n                - message: forbidden to update spec.rebuildFrom\n                  rule: self == oldSelf\n              reconfigures:\n                description: Lists Reconfigure objects, each specifying a Component\n                  and its configuration updates.\n                items:\n                  description: Reconfigure defines the parameters for updating a Component's\n                    configuration.\n                  properties:\n                    componentName:\n                      description: Specifies the name of the Component as defined\n                        in the cluster.spec\n                      type: string\n                    parameters:\n                      description: |-\n                        Specifies a list of key-value pairs representing parameters and their corresponding values\n                        within a single configuration file.\n                        This field is used to override or set the values of parameters without modifying the entire configuration file.\n                      items:\n                        properties:\n                          key:\n                            description: Represents the name of the parameter that\n                              is to be updated.\n                            type: string\n                          value:\n                            description: |-\n                              Represents the parameter values that are to be updated.\n                              If set to nil, the parameter defined by the Key field will be removed from the configuration file.\n                            type: string\n                        required:\n                        - key\n                        type: object\n                      type: array\n                  required:\n                  - componentName\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - componentName\n                x-kubernetes-list-type: map\n                x-kubernetes-validations:\n                - message: forbidden to update spec.reconfigure\n                  rule: self == oldSelf\n              restart:\n                description: Lists Components to be restarted.\n                items:\n                  description: ComponentOps specifies the Component to be operated\n                    on.\n                  properties:\n                    componentName:\n                      description: Specifies the name of the Component as defined\n                        in the cluster.spec\n                      type: string\n                  required:\n                  - componentName\n                  type: object\n                maxItems: 1024\n                type: array\n                x-kubernetes-list-map-keys:\n                - componentName\n                x-kubernetes-list-type: map\n                x-kubernetes-validations:\n                - message: forbidden to update spec.restart\n                  rule: self == oldSelf\n              restore:\n                description: |-\n                  Specifies the parameters to restore a Cluster.\n                  Note that this restore operation will roll back cluster services.\n                properties:\n                  backupName:\n                    description: Specifies the name of the Backup custom resource.\n                    type: string\n                  backupNamespace:\n                    description: Specifies the namespace of the backup custom resource.\n                      If not specified, the namespace of the opsRequest will be used.\n                    type: string\n                  deferPostReadyUntilClusterRunning:\n                    description: |-\n                      Controls the timing of PostReady actions during the recovery process.\n\n\n                      If false (default), PostReady actions execute when the Component reaches the \"Running\" state.\n                      If true, PostReady actions are delayed until the entire Cluster is \"Running,\"\n                      ensuring the cluster's overall stability before proceeding.\n\n\n                      This setting is useful for coordinating PostReady operations across the Cluster for optimal cluster conditions.\n                    type: boolean\n                  env:\n                    description: Specifies a list of environment variables to be set\n                      in the container.\n                    items:\n                      description: EnvVar represents an environment variable present\n                        in a Container.\n                      properties:\n                        name:\n                          description: Name of the environment variable. Must be a\n                            C_IDENTIFIER.\n                          type: string\n                        value:\n                          description: |-\n                            Variable references $(VAR_NAME) are expanded\n                            using the previously defined environment variables in the container and\n                            any service environment variables. If a variable cannot be resolved,\n                            the reference in the input string will be unchanged. Double $$ are reduced\n                            to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                            \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                            Escaped references will never be expanded, regardless of whether the variable\n                            exists or not.\n                            Defaults to \"\".\n                          type: string\n                        valueFrom:\n                          description: Source for the environment variable's value.\n                            Cannot be used if value is not empty.\n                          properties:\n                            configMapKeyRef:\n                              description: Selects a key of a ConfigMap.\n                              properties:\n                                key:\n                                  description: The key to select.\n                                  type: string\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                                optional:\n                                  description: Specify whether the ConfigMap or its\n                                    key must be defined\n                                  type: boolean\n                              required:\n                              - key\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            fieldRef:\n                              description: |-\n                                Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                              properties:\n                                apiVersion:\n                                  description: Version of the schema the FieldPath\n                                    is written in terms of, defaults to \"v1\".\n                                  type: string\n                                fieldPath:\n                                  description: Path of the field to select in the\n                                    specified API version.\n                                  type: string\n                              required:\n                              - fieldPath\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            resourceFieldRef:\n                              description: |-\n                                Selects a resource of the container: only resources limits and requests\n                                (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                              properties:\n                                containerName:\n                                  description: 'Container name: required for volumes,\n                                    optional for env vars'\n                                  type: string\n                                divisor:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: Specifies the output format of the\n                                    exposed resources, defaults to \"1\"\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                resource:\n                                  description: 'Required: resource to select'\n                                  type: string\n                              required:\n                              - resource\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            secretKeyRef:\n                              description: Selects a key of a secret in the pod's\n                                namespace\n                              properties:\n                                key:\n                                  description: The key of the secret to select from.  Must\n                                    be a valid secret key.\n                                  type: string\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                                optional:\n                                  description: Specify whether the Secret or its key\n                                    must be defined\n                                  type: boolean\n                              required:\n                              - key\n                              type: object\n                              x-kubernetes-map-type: atomic\n                          type: object\n                      required:\n                      - name\n                      type: object\n                    type: array\n                    x-kubernetes-preserve-unknown-fields: true\n                  parameters:\n                    description: |-\n                      Specifies a list of name-value pairs representing parameters and their corresponding values.\n                      Parameters match the schema specified in the `actionset.spec.parametersSchema`\n                    items:\n                      properties:\n                        name:\n                          description: Represents the name of the parameter.\n                          type: string\n                        value:\n                          description: Represents the parameter values.\n                          type: string\n                      required:\n                      - name\n                      - value\n                      type: object\n                    maxItems: 128\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - name\n                    x-kubernetes-list-type: map\n                    x-kubernetes-validations:\n                    - message: forbidden to update parameters\n                      rule: self == oldSelf\n                  restorePointInTime:\n                    description: |-\n                      Specifies the point in time to which the restore should be performed.\n                      Supported time formats:\n\n\n                      - RFC3339 format, e.g. \"2023-11-25T18:52:53Z\"\n                      - A human-readable date-time format, e.g. \"Jul 25,2023 18:52:53 UTC+0800\"\n                    type: string\n                  volumeRestorePolicy:\n                    default: Parallel\n                    description: |-\n                      Specifies the policy for restoring volume claims of a Component's Pods.\n                      It determines whether the volume claims should be restored sequentially (one by one) or in parallel (all at once).\n                      Support values:\n\n\n                      - \"Serial\"\n                      - \"Parallel\"\n                    enum:\n                    - Serial\n                    - Parallel\n                    type: string\n                required:\n                - backupName\n                type: object\n                x-kubernetes-validations:\n                - message: forbidden to update restore.parameters\n                  rule: has(oldSelf.parameters) == has(self.parameters)\n              start:\n                description: Lists Components to be started. If empty, all components\n                  will be started.\n                items:\n                  description: ComponentOps specifies the Component to be operated\n                    on.\n                  properties:\n                    componentName:\n                      description: Specifies the name of the Component as defined\n                        in the cluster.spec\n                      type: string\n                  required:\n                  - componentName\n                  type: object\n                maxItems: 1024\n                type: array\n                x-kubernetes-list-map-keys:\n                - componentName\n                x-kubernetes-list-type: map\n                x-kubernetes-validations:\n                - message: forbidden to update spec.start\n                  rule: self == oldSelf\n              stop:\n                description: Lists Components to be stopped. If empty, all components\n                  will be stopped.\n                items:\n                  description: ComponentOps specifies the Component to be operated\n                    on.\n                  properties:\n                    componentName:\n                      description: Specifies the name of the Component as defined\n                        in the cluster.spec\n                      type: string\n                  required:\n                  - componentName\n                  type: object\n                maxItems: 1024\n                type: array\n                x-kubernetes-list-map-keys:\n                - componentName\n                x-kubernetes-list-type: map\n                x-kubernetes-validations:\n                - message: forbidden to update spec.stop\n                  rule: self == oldSelf\n              switchover:\n                description: Lists Switchover objects, each specifying a Component\n                  to perform the switchover operation.\n                items:\n                  properties:\n                    candidateName:\n                      description: |-\n                        If CandidateName is specified, the role will be transferred to this instance.\n                        The name must match one of the pods in the component.\n                        Refer to ComponentDefinition's Swtichover lifecycle action for more details.\n                      type: string\n                    componentName:\n                      description: Specifies the name of the Component as defined\n                        in the cluster.spec.\n                      type: string\n                    componentObjectName:\n                      description: Specifies the name of the Component object.\n                      type: string\n                    instanceName:\n                      description: |-\n                        Specifies the instance whose role will be transferred. A typical usage is to transfer the leader role\n                        in a consensus system.\n                      type: string\n                  required:\n                  - instanceName\n                  type: object\n                  x-kubernetes-validations:\n                  - message: need to specified only componentName or componentObjectName\n                    rule: (has(self.componentName) && !has(self.componentObjectName))\n                      || (!has(self.componentName) && has(self.componentObjectName))\n                type: array\n                x-kubernetes-validations:\n                - message: forbidden to update spec.switchover\n                  rule: self == oldSelf\n              timeoutSeconds:\n                description: |-\n                  Specifies the maximum duration (in seconds) that an opsRequest is allowed to run.\n                  If the opsRequest runs longer than this duration, its phase will be marked as Aborted.\n                  If this value is not set or set to 0, the timeout will be ignored and the opsRequest will run indefinitely.\n                format: int32\n                type: integer\n              ttlSecondsAfterSucceed:\n                description: |-\n                  Specifies the duration in seconds that an OpsRequest will remain in the system after successfully completing\n                  (when `opsRequest.status.phase` is \"Succeed\") before automatic deletion.\n                format: int32\n                type: integer\n              ttlSecondsAfterUnsuccessfulCompletion:\n                description: |-\n                  Specifies the duration in seconds that an OpsRequest will remain in the system after completion\n                  for any phase other than \"Succeed\" (e.g., \"Failed\", \"Cancelled\", \"Aborted\") before automatic deletion.\n                format: int32\n                type: integer\n              type:\n                description: |-\n                  Specifies the type of this operation. Supported types include \"Start\", \"Stop\", \"Restart\", \"Switchover\",\n                  \"VerticalScaling\", \"HorizontalScaling\", \"VolumeExpansion\", \"Reconfiguring\", \"Upgrade\", \"Backup\", \"Restore\",\n                  \"Expose\", \"RebuildInstance\", \"Custom\".\n\n\n                  Note: This field is immutable once set.\n                enum:\n                - Upgrade\n                - VerticalScaling\n                - VolumeExpansion\n                - HorizontalScaling\n                - Restart\n                - Reconfiguring\n                - Start\n                - Stop\n                - Expose\n                - Switchover\n                - Backup\n                - Restore\n                - RebuildInstance\n                - Custom\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.type\n                  rule: self == oldSelf\n              upgrade:\n                description: |-\n                  Specifies the desired new version of the Cluster.\n\n\n                  Note: This field is immutable once set.\n                properties:\n                  components:\n                    description: |-\n                      Lists components to be upgrade based on desired ComponentDefinition and ServiceVersion.\n                      From the perspective of cluster API, the reasonable combinations should be:\n                      1. (comp-def, service-ver) - upgrade to the specified service version and component definition, the user takes the responsibility to ensure that they are compatible.\n                      2. (\"\", service-ver) - upgrade to the specified service version, let the operator choose the latest compatible component definition.\n                      3. (comp-def, \"\") - upgrade to the specified component definition, let the operator choose the latest compatible service version.\n                      4. (\"\", \"\") - upgrade to the latest service version and component definition, the operator will ensure the compatibility between the selected versions.\n                    items:\n                      properties:\n                        componentDefinitionName:\n                          description: Specifies the name of the ComponentDefinition,\n                            only exact matches are supported.\n                          maxLength: 64\n                          type: string\n                        componentName:\n                          description: Specifies the name of the Component as defined\n                            in the cluster.spec\n                          type: string\n                        serviceVersion:\n                          description: |-\n                            Specifies the version of the Service expected to be provisioned by this Component.\n                            Referring to the ServiceVersion defined by the ComponentDefinition and ComponentVersion.\n                            And ServiceVersion in ClusterComponentSpec is optional, when no version is specified,\n                            use the latest available version in ComponentVersion.\n                          maxLength: 32\n                          type: string\n                      required:\n                      - componentName\n                      type: object\n                      x-kubernetes-validations:\n                      - message: at least one componentDefinitionName or serviceVersion\n                        rule: has(self.componentDefinitionName) || has(self.serviceVersion)\n                    maxItems: 1024\n                    type: array\n                    x-kubernetes-list-map-keys:\n                    - componentName\n                    x-kubernetes-list-type: map\n                type: object\n                x-kubernetes-validations:\n                - message: forbidden to update spec.upgrade\n                  rule: self == oldSelf\n              verticalScaling:\n                description: Lists VerticalScaling objects, each specifying a component\n                  and its desired compute resources for vertical scaling.\n                items:\n                  description: |-\n                    VerticalScaling refers to the process of adjusting compute resources (e.g., CPU, memory) allocated to a Component.\n                    It defines the parameters required for the operation.\n                  properties:\n                    claims:\n                      description: |-\n                        Claims lists the names of resources, defined in spec.resourceClaims,\n                        that are used by this container.\n\n\n                        This is an alpha field and requires enabling the\n                        DynamicResourceAllocation feature gate.\n\n\n                        This field is immutable. It can only be set for containers.\n                      items:\n                        description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                        properties:\n                          name:\n                            description: |-\n                              Name must match the name of one entry in pod.spec.resourceClaims of\n                              the Pod where this field is used. It makes that resource available\n                              inside a container.\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    componentName:\n                      description: Specifies the name of the Component as defined\n                        in the cluster.spec\n                      type: string\n                    instances:\n                      description: Specifies the desired compute resources of the\n                        instance template that need to vertical scale.\n                      items:\n                        properties:\n                          claims:\n                            description: |-\n                              Claims lists the names of resources, defined in spec.resourceClaims,\n                              that are used by this container.\n\n\n                              This is an alpha field and requires enabling the\n                              DynamicResourceAllocation feature gate.\n\n\n                              This field is immutable. It can only be set for containers.\n                            items:\n                              description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                              properties:\n                                name:\n                                  description: |-\n                                    Name must match the name of one entry in pod.spec.resourceClaims of\n                                    the Pod where this field is used. It makes that resource available\n                                    inside a container.\n                                  type: string\n                              required:\n                              - name\n                              type: object\n                            type: array\n                            x-kubernetes-list-map-keys:\n                            - name\n                            x-kubernetes-list-type: map\n                          limits:\n                            additionalProperties:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                            description: |-\n                              Limits describes the maximum amount of compute resources allowed.\n                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                            type: object\n                          name:\n                            description: Refer to the instance template name of the\n                              component or sharding.\n                            type: string\n                          requests:\n                            additionalProperties:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                              x-kubernetes-int-or-string: true\n                            description: |-\n                              Requests describes the minimum amount of compute resources required.\n                              If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                              otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                            type: object\n                        required:\n                        - name\n                        type: object\n                        x-kubernetes-preserve-unknown-fields: true\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    limits:\n                      additionalProperties:\n                        anyOf:\n                        - type: integer\n                        - type: string\n                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                        x-kubernetes-int-or-string: true\n                      description: |-\n                        Limits describes the maximum amount of compute resources allowed.\n                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                      type: object\n                    requests:\n                      additionalProperties:\n                        anyOf:\n                        - type: integer\n                        - type: string\n                        pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                        x-kubernetes-int-or-string: true\n                      description: |-\n                        Requests describes the minimum amount of compute resources required.\n                        If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                        otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                        More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                      type: object\n                  required:\n                  - componentName\n                  type: object\n                  x-kubernetes-preserve-unknown-fields: true\n                maxItems: 1024\n                type: array\n                x-kubernetes-list-map-keys:\n                - componentName\n                x-kubernetes-list-type: map\n              volumeExpansion:\n                description: |-\n                  Lists VolumeExpansion objects, each specifying a component and its corresponding volumeClaimTemplates\n                  that requires storage expansion.\n                items:\n                  description: VolumeExpansion encapsulates the parameters required\n                    for a volume expansion operation.\n                  properties:\n                    componentName:\n                      description: Specifies the name of the Component as defined\n                        in the cluster.spec\n                      type: string\n                    volumeClaimTemplates:\n                      description: |-\n                        Specifies a list of OpsRequestVolumeClaimTemplate objects, defining the volumeClaimTemplates\n                        that are used to expand the storage and the desired storage size for each one.\n                      items:\n                        properties:\n                          name:\n                            description: |-\n                              Specify the name of the volumeClaimTemplate in the Component.\n                              The specified name must match one of the volumeClaimTemplates defined\n                              in the `clusterComponentSpec.volumeClaimTemplates` field.\n                            type: string\n                          storage:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            description: Specifies the desired storage size for the\n                              volume.\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                        required:\n                        - name\n                        - storage\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                  required:\n                  - componentName\n                  - volumeClaimTemplates\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - componentName\n                x-kubernetes-list-type: map\n            required:\n            - type\n            type: object\n            x-kubernetes-validations:\n            - message: forbidden to cancel the opsRequest which type not in ['VerticalScaling','HorizontalScaling']\n              rule: 'has(self.cancel) && self.cancel ? (self.type in [''VerticalScaling'',\n                ''HorizontalScaling'']) : true'\n          status:\n            description: OpsRequestStatus represents the observed state of an OpsRequest.\n            properties:\n              cancelTimestamp:\n                description: Records the time when the OpsRequest was cancelled.\n                format: date-time\n                type: string\n              clusterGeneration:\n                description: Records the cluster generation after the OpsRequest action\n                  has been handled.\n                format: int64\n                type: integer\n              completionTimestamp:\n                description: Records the time when the OpsRequest was completed.\n                format: date-time\n                type: string\n              components:\n                additionalProperties:\n                  properties:\n                    lastFailedTime:\n                      description: Records the timestamp when the Component last transitioned\n                        to a \"Failed\" phase.\n                      format: date-time\n                      type: string\n                    message:\n                      description: Provides a human-readable message indicating details\n                        about this operation.\n                      maxLength: 32768\n                      type: string\n                    phase:\n                      description: Records the current phase of the Component, mirroring\n                        `cluster.status.components[componentName].phase`.\n                      enum:\n                      - Creating\n                      - Deleting\n                      - Updating\n                      - Stopping\n                      - Starting\n                      - Running\n                      - Stopped\n                      - Failed\n                      type: string\n                    preCheck:\n                      description: Records the result of the preConditions check of\n                        the opsRequest, which determines subsequent steps.\n                      properties:\n                        message:\n                          description: Provides explanations related to the preCheck\n                            result in a human-readable format.\n                          type: string\n                        pass:\n                          description: Indicates whether the preCheck operation passed\n                            or failed.\n                          type: boolean\n                      required:\n                      - pass\n                      type: object\n                    progressDetails:\n                      description: Describes the progress details of objects or actions\n                        associated with the Component.\n                      items:\n                        properties:\n                          actionName:\n                            description: |-\n                              Indicates the name of an OpsAction, as defined in `opsDefinition.spec.actions[*].name`.\n                              Either `objectKey` or `actionName` must be provided.\n                            type: string\n                          actionTasks:\n                            description: Lists the tasks, such as Jobs or Pods, that\n                              carry out the action.\n                            items:\n                              properties:\n                                namespace:\n                                  description: Represents the namespace where the\n                                    task is deployed.\n                                  type: string\n                                objectKey:\n                                  description: Represents the name of the task.\n                                  type: string\n                                retries:\n                                  description: The count of retry attempts made for\n                                    this task.\n                                  format: int32\n                                  type: integer\n                                status:\n                                  description: Indicates the current status of the\n                                    task, including \"Processing\", \"Failed\", \"Succeed\".\n                                  enum:\n                                  - Processing\n                                  - Failed\n                                  - Succeed\n                                  type: string\n                                targetPodName:\n                                  description: The name of the Pod that the task is\n                                    associated with or operates on.\n                                  type: string\n                              required:\n                              - namespace\n                              - objectKey\n                              - status\n                              type: object\n                            type: array\n                          endTime:\n                            description: Records the completion time of object processing.\n                            format: date-time\n                            type: string\n                          group:\n                            description: Specifies the group to which the current\n                              object belongs to.\n                            type: string\n                          message:\n                            description: Provides a human-readable explanation of\n                              the object's condition.\n                            type: string\n                          objectKey:\n                            description: |-\n                              `objectKey` uniquely identifies the object, which can be any K8s object, like a Pod, Job, Component, or PVC.\n                              Either `objectKey` or `actionName` must be provided.\n                            type: string\n                          startTime:\n                            description: Records the start time of object processing.\n                            format: date-time\n                            type: string\n                          status:\n                            description: Represents the current processing state of\n                              the object, including \"Processing\", \"Pending\", \"Failed\",\n                              \"Succeed\"\n                            enum:\n                            - Processing\n                            - Pending\n                            - Failed\n                            - Succeed\n                            type: string\n                        required:\n                        - status\n                        type: object\n                        x-kubernetes-validations:\n                        - message: at least one objectKey or actionName.\n                          rule: has(self.objectKey) || has(self.actionName)\n                      type: array\n                    reason:\n                      description: Provides an explanation for the Component being\n                        in its current state.\n                      maxLength: 1024\n                      type: string\n                  type: object\n                description: Records the status information of Components changed\n                  due to the OpsRequest.\n                type: object\n              conditions:\n                description: |-\n                  Describes the detailed status of the OpsRequest.\n                  Possible condition types include \"Cancelled\", \"WaitForProgressing\", \"Validated\", \"Succeed\", \"Failed\", \"Restarting\",\n                  \"VerticalScaling\", \"HorizontalScaling\", \"VolumeExpanding\", \"Reconfigure\", \"Switchover\", \"Stopping\", \"Starting\",\n                  \"VersionUpgrading\", \"Exposing\", \"Backup\", \"InstancesRebuilding\", \"CustomOperation\".\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - type\n                x-kubernetes-list-type: map\n              extras:\n                description: A collection of additional key-value pairs that provide\n                  supplementary information for the OpsRequest.\n                items:\n                  additionalProperties:\n                    type: string\n                  type: object\n                type: array\n              lastConfiguration:\n                description: Records the configuration prior to any changes.\n                properties:\n                  components:\n                    additionalProperties:\n                      description: LastComponentConfiguration can be used to track\n                        and compare the desired state of the Component over time.\n                      properties:\n                        claims:\n                          description: |-\n                            Claims lists the names of resources, defined in spec.resourceClaims,\n                            that are used by this container.\n\n\n                            This is an alpha field and requires enabling the\n                            DynamicResourceAllocation feature gate.\n\n\n                            This field is immutable. It can only be set for containers.\n                          items:\n                            description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                            properties:\n                              name:\n                                description: |-\n                                  Name must match the name of one entry in pod.spec.resourceClaims of\n                                  the Pod where this field is used. It makes that resource available\n                                  inside a container.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        componentDefinitionName:\n                          description: Records the name of the ComponentDefinition\n                            prior to any changes.\n                          type: string\n                        instances:\n                          description: Records the InstanceTemplate list of the Component\n                            prior to any changes.\n                          items:\n                            description: InstanceTemplate allows customization of\n                              individual replica configurations in a Component.\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                                  Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                                type: object\n                              env:\n                                description: |-\n                                  Defines Env to override.\n                                  Add new or override existing envs.\n                                items:\n                                  description: EnvVar represents an environment variable\n                                    present in a Container.\n                                  properties:\n                                    name:\n                                      description: Name of the environment variable.\n                                        Must be a C_IDENTIFIER.\n                                      type: string\n                                    value:\n                                      description: |-\n                                        Variable references $(VAR_NAME) are expanded\n                                        using the previously defined environment variables in the container and\n                                        any service environment variables. If a variable cannot be resolved,\n                                        the reference in the input string will be unchanged. Double $$ are reduced\n                                        to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                        \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                        Escaped references will never be expanded, regardless of whether the variable\n                                        exists or not.\n                                        Defaults to \"\".\n                                      type: string\n                                    valueFrom:\n                                      description: Source for the environment variable's\n                                        value. Cannot be used if value is not empty.\n                                      properties:\n                                        configMapKeyRef:\n                                          description: Selects a key of a ConfigMap.\n                                          properties:\n                                            key:\n                                              description: The key to select.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the ConfigMap\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        fieldRef:\n                                          description: |-\n                                            Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                            spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                          properties:\n                                            apiVersion:\n                                              description: Version of the schema the\n                                                FieldPath is written in terms of,\n                                                defaults to \"v1\".\n                                              type: string\n                                            fieldPath:\n                                              description: Path of the field to select\n                                                in the specified API version.\n                                              type: string\n                                          required:\n                                          - fieldPath\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        resourceFieldRef:\n                                          description: |-\n                                            Selects a resource of the container: only resources limits and requests\n                                            (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                          properties:\n                                            containerName:\n                                              description: 'Container name: required\n                                                for volumes, optional for env vars'\n                                              type: string\n                                            divisor:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              description: Specifies the output format\n                                                of the exposed resources, defaults\n                                                to \"1\"\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            resource:\n                                              description: 'Required: resource to\n                                                select'\n                                              type: string\n                                          required:\n                                          - resource\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        secretKeyRef:\n                                          description: Selects a key of a secret in\n                                            the pod's namespace\n                                          properties:\n                                            key:\n                                              description: The key of the secret to\n                                                select from.  Must be a valid secret\n                                                key.\n                                              type: string\n                                            name:\n                                              description: |-\n                                                Name of the referent.\n                                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                                TODO: Add other useful fields. apiVersion, kind, uid?\n                                              type: string\n                                            optional:\n                                              description: Specify whether the Secret\n                                                or its key must be defined\n                                              type: boolean\n                                          required:\n                                          - key\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                              labels:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                                  Values for existing keys will be overwritten, and new keys will be added.\n                                type: object\n                              name:\n                                description: |-\n                                  Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                                  This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal\n                                  using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                                  The specified name overrides any default naming conventions or patterns.\n                                maxLength: 54\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                              ordinals:\n                                description: |-\n                                  Specifies the desired Ordinals of this InstanceTemplate.\n                                  The Ordinals used to specify the ordinal of the instance (pod) names to be generated under this InstanceTemplate.\n\n\n                                  For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},\n                                  then the instance names generated under this InstanceTemplate would be\n                                  $(cluster.name)-$(component.name)-$(template.name)-0、$(cluster.name)-$(component.name)-$(template.name)-1 and\n                                  $(cluster.name)-$(component.name)-$(template.name)-7\n                                properties:\n                                  discrete:\n                                    items:\n                                      format: int32\n                                      type: integer\n                                    type: array\n                                  ranges:\n                                    items:\n                                      description: |-\n                                        Range represents a range with a start and an end value.\n                                        It is used to define a continuous segment.\n                                      properties:\n                                        end:\n                                          format: int32\n                                          type: integer\n                                        start:\n                                          format: int32\n                                          type: integer\n                                      required:\n                                      - end\n                                      - start\n                                      type: object\n                                    type: array\n                                type: object\n                              replicas:\n                                default: 1\n                                description: |-\n                                  Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                                  This field allows setting how many replicated instances of the Component,\n                                  with the specific overrides in the InstanceTemplate, are created.\n                                  The default value is 1. A value of 0 disables instance creation.\n                                format: int32\n                                minimum: 0\n                                type: integer\n                              resources:\n                                description: |-\n                                  Specifies an override for the resource requirements of the first container in the Pod.\n                                  This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                                properties:\n                                  claims:\n                                    description: |-\n                                      Claims lists the names of resources, defined in spec.resourceClaims,\n                                      that are used by this container.\n\n\n                                      This is an alpha field and requires enabling the\n                                      DynamicResourceAllocation feature gate.\n\n\n                                      This field is immutable. It can only be set for containers.\n                                    items:\n                                      description: ResourceClaim references one entry\n                                        in PodSpec.ResourceClaims.\n                                      properties:\n                                        name:\n                                          description: |-\n                                            Name must match the name of one entry in pod.spec.resourceClaims of\n                                            the Pod where this field is used. It makes that resource available\n                                            inside a container.\n                                          type: string\n                                      required:\n                                      - name\n                                      type: object\n                                    type: array\n                                    x-kubernetes-list-map-keys:\n                                    - name\n                                    x-kubernetes-list-type: map\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                              schedulingPolicy:\n                                description: |-\n                                  Specifies the scheduling policy for the instance.\n                                  If defined, it will overwrite the scheduling policy defined in ClusterSpec and/or ClusterComponentSpec.\n                                properties:\n                                  affinity:\n                                    description: Specifies a group of affinity scheduling\n                                      rules of the Cluster, including NodeAffinity,\n                                      PodAffinity, and PodAntiAffinity.\n                                    properties:\n                                      nodeAffinity:\n                                        description: Describes node affinity scheduling\n                                          rules for the pod.\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: |-\n                                                An empty preferred scheduling term matches all objects with implicit weight 0\n                                                (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                              properties:\n                                                preference:\n                                                  description: A node selector term,\n                                                    associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        labels.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchFields:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        fields.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                weight:\n                                                  description: Weight associated with\n                                                    matching the corresponding nodeSelectorTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - preference\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to an update), the system\n                                              may or may not try to eventually evict the pod from its node.\n                                            properties:\n                                              nodeSelectorTerms:\n                                                description: Required. A list of node\n                                                  selector terms. The terms are ORed.\n                                                items:\n                                                  description: |-\n                                                    A null or empty node selector term matches no objects. The requirements of\n                                                    them are ANDed.\n                                                    The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        labels.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchFields:\n                                                      description: A list of node\n                                                        selector requirements by node's\n                                                        fields.\n                                                      items:\n                                                        description: |-\n                                                          A node selector requirement is a selector that contains values, a key, and an operator\n                                                          that relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: The label\n                                                              key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              Represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              An array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. If the operator is Gt or Lt, the values\n                                                              array must have a single element, which will be interpreted as an integer.\n                                                              This array is replaced during a strategic merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                type: array\n                                            required:\n                                            - nodeSelectorTerms\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                        type: object\n                                      podAffinity:\n                                        description: Describes pod affinity scheduling\n                                          rules (e.g. co-locate this pod in the same\n                                          node, zone, etc. as some other pod(s)).\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: The weights of all of the\n                                                matched WeightedPodAffinityTerm fields\n                                                are added per-node to find the most\n                                                preferred node(s)\n                                              properties:\n                                                podAffinityTerm:\n                                                  description: Required. A pod affinity\n                                                    term, associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    labelSelector:\n                                                      description: |-\n                                                        A label query over a set of resources, in this case pods.\n                                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    matchLabelKeys:\n                                                      description: |-\n                                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    mismatchLabelKeys:\n                                                      description: |-\n                                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    namespaceSelector:\n                                                      description: |-\n                                                        A label query over the set of namespaces that the term applies to.\n                                                        The term is applied to the union of the namespaces selected by this field\n                                                        and the ones listed in the namespaces field.\n                                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                        An empty selector ({}) matches all namespaces.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    namespaces:\n                                                      description: |-\n                                                        namespaces specifies a static list of namespace names that the term applies to.\n                                                        The term is applied to the union of the namespaces listed in this field\n                                                        and the ones selected by namespaceSelector.\n                                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                    topologyKey:\n                                                      description: |-\n                                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                                        selected pods is running.\n                                                        Empty topologyKey is not allowed.\n                                                      type: string\n                                                  required:\n                                                  - topologyKey\n                                                  type: object\n                                                weight:\n                                                  description: |-\n                                                    weight associated with matching the corresponding podAffinityTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - podAffinityTerm\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to a pod label update), the\n                                              system may or may not try to eventually evict the pod from its node.\n                                              When there are multiple elements, the lists of nodes corresponding to each\n                                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                            items:\n                                              description: |-\n                                                Defines a set of pods (namely those matching the labelSelector\n                                                relative to the given namespace(s)) that this pod should be\n                                                co-located (affinity) or not co-located (anti-affinity) with,\n                                                where co-located is defined as running on a node whose value of\n                                                the label with key <topologyKey> matches that of any node on which\n                                                a pod of the set of pods is running\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            type: array\n                                        type: object\n                                      podAntiAffinity:\n                                        description: Describes pod anti-affinity scheduling\n                                          rules (e.g. avoid putting this pod in the\n                                          same node, zone, etc. as some other pod(s)).\n                                        properties:\n                                          preferredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              The scheduler will prefer to schedule pods to nodes that satisfy\n                                              the anti-affinity expressions specified by this field, but it may choose\n                                              a node that violates one or more of the expressions. The node that is\n                                              most preferred is the one with the greatest sum of weights, i.e.\n                                              for each node that meets all of the scheduling requirements (resource\n                                              request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                              compute a sum by iterating through the elements of this field and adding\n                                              \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                              node(s) with the highest sum are the most preferred.\n                                            items:\n                                              description: The weights of all of the\n                                                matched WeightedPodAffinityTerm fields\n                                                are added per-node to find the most\n                                                preferred node(s)\n                                              properties:\n                                                podAffinityTerm:\n                                                  description: Required. A pod affinity\n                                                    term, associated with the corresponding\n                                                    weight.\n                                                  properties:\n                                                    labelSelector:\n                                                      description: |-\n                                                        A label query over a set of resources, in this case pods.\n                                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    matchLabelKeys:\n                                                      description: |-\n                                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    mismatchLabelKeys:\n                                                      description: |-\n                                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                        be taken into consideration. The keys are used to lookup values from the\n                                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                        to select the group of existing pods which pods will be taken into consideration\n                                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                        pod labels will be ignored. The default value is empty.\n                                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                      x-kubernetes-list-type: atomic\n                                                    namespaceSelector:\n                                                      description: |-\n                                                        A label query over the set of namespaces that the term applies to.\n                                                        The term is applied to the union of the namespaces selected by this field\n                                                        and the ones listed in the namespaces field.\n                                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                        An empty selector ({}) matches all namespaces.\n                                                      properties:\n                                                        matchExpressions:\n                                                          description: matchExpressions\n                                                            is a list of label selector\n                                                            requirements. The requirements\n                                                            are ANDed.\n                                                          items:\n                                                            description: |-\n                                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                                              relates the key and values.\n                                                            properties:\n                                                              key:\n                                                                description: key is\n                                                                  the label key that\n                                                                  the selector applies\n                                                                  to.\n                                                                type: string\n                                                              operator:\n                                                                description: |-\n                                                                  operator represents a key's relationship to a set of values.\n                                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                                type: string\n                                                              values:\n                                                                description: |-\n                                                                  values is an array of string values. If the operator is In or NotIn,\n                                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                                  the values array must be empty. This array is replaced during a strategic\n                                                                  merge patch.\n                                                                items:\n                                                                  type: string\n                                                                type: array\n                                                            required:\n                                                            - key\n                                                            - operator\n                                                            type: object\n                                                          type: array\n                                                        matchLabels:\n                                                          additionalProperties:\n                                                            type: string\n                                                          description: |-\n                                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                          type: object\n                                                      type: object\n                                                      x-kubernetes-map-type: atomic\n                                                    namespaces:\n                                                      description: |-\n                                                        namespaces specifies a static list of namespace names that the term applies to.\n                                                        The term is applied to the union of the namespaces listed in this field\n                                                        and the ones selected by namespaceSelector.\n                                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                    topologyKey:\n                                                      description: |-\n                                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                                        selected pods is running.\n                                                        Empty topologyKey is not allowed.\n                                                      type: string\n                                                  required:\n                                                  - topologyKey\n                                                  type: object\n                                                weight:\n                                                  description: |-\n                                                    weight associated with matching the corresponding podAffinityTerm,\n                                                    in the range 1-100.\n                                                  format: int32\n                                                  type: integer\n                                              required:\n                                              - podAffinityTerm\n                                              - weight\n                                              type: object\n                                            type: array\n                                          requiredDuringSchedulingIgnoredDuringExecution:\n                                            description: |-\n                                              If the anti-affinity requirements specified by this field are not met at\n                                              scheduling time, the pod will not be scheduled onto the node.\n                                              If the anti-affinity requirements specified by this field cease to be met\n                                              at some point during pod execution (e.g. due to a pod label update), the\n                                              system may or may not try to eventually evict the pod from its node.\n                                              When there are multiple elements, the lists of nodes corresponding to each\n                                              podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                            items:\n                                              description: |-\n                                                Defines a set of pods (namely those matching the labelSelector\n                                                relative to the given namespace(s)) that this pod should be\n                                                co-located (affinity) or not co-located (anti-affinity) with,\n                                                where co-located is defined as running on a node whose value of\n                                                the label with key <topologyKey> matches that of any node on which\n                                                a pod of the set of pods is running\n                                              properties:\n                                                labelSelector:\n                                                  description: |-\n                                                    A label query over a set of resources, in this case pods.\n                                                    If it's null, this PodAffinityTerm matches with no Pods.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                matchLabelKeys:\n                                                  description: |-\n                                                    MatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                                    Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                mismatchLabelKeys:\n                                                  description: |-\n                                                    MismatchLabelKeys is a set of pod label keys to select which pods will\n                                                    be taken into consideration. The keys are used to lookup values from the\n                                                    incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                                    to select the group of existing pods which pods will be taken into consideration\n                                                    for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                                    pod labels will be ignored. The default value is empty.\n                                                    The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                                    Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                                    This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                  x-kubernetes-list-type: atomic\n                                                namespaceSelector:\n                                                  description: |-\n                                                    A label query over the set of namespaces that the term applies to.\n                                                    The term is applied to the union of the namespaces selected by this field\n                                                    and the ones listed in the namespaces field.\n                                                    null selector and null or empty namespaces list means \"this pod's namespace\".\n                                                    An empty selector ({}) matches all namespaces.\n                                                  properties:\n                                                    matchExpressions:\n                                                      description: matchExpressions\n                                                        is a list of label selector\n                                                        requirements. The requirements\n                                                        are ANDed.\n                                                      items:\n                                                        description: |-\n                                                          A label selector requirement is a selector that contains values, a key, and an operator that\n                                                          relates the key and values.\n                                                        properties:\n                                                          key:\n                                                            description: key is the\n                                                              label key that the selector\n                                                              applies to.\n                                                            type: string\n                                                          operator:\n                                                            description: |-\n                                                              operator represents a key's relationship to a set of values.\n                                                              Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                            type: string\n                                                          values:\n                                                            description: |-\n                                                              values is an array of string values. If the operator is In or NotIn,\n                                                              the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                              the values array must be empty. This array is replaced during a strategic\n                                                              merge patch.\n                                                            items:\n                                                              type: string\n                                                            type: array\n                                                        required:\n                                                        - key\n                                                        - operator\n                                                        type: object\n                                                      type: array\n                                                    matchLabels:\n                                                      additionalProperties:\n                                                        type: string\n                                                      description: |-\n                                                        matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                        map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                        operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                      type: object\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                namespaces:\n                                                  description: |-\n                                                    namespaces specifies a static list of namespace names that the term applies to.\n                                                    The term is applied to the union of the namespaces listed in this field\n                                                    and the ones selected by namespaceSelector.\n                                                    null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                                topologyKey:\n                                                  description: |-\n                                                    This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                                    the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                                    whose value of the label with key topologyKey matches that of any node on which any of the\n                                                    selected pods is running.\n                                                    Empty topologyKey is not allowed.\n                                                  type: string\n                                              required:\n                                              - topologyKey\n                                              type: object\n                                            type: array\n                                        type: object\n                                    type: object\n                                  nodeName:\n                                    description: |-\n                                      NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                                      the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                                      requirements.\n                                    type: string\n                                  nodeSelector:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      NodeSelector is a selector which must be true for the Pod to fit on a node.\n                                      Selector which must match a node's labels for the Pod to be scheduled on that node.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  schedulerName:\n                                    description: |-\n                                      If specified, the Pod will be dispatched by specified scheduler.\n                                      If not specified, the Pod will be dispatched by default scheduler.\n                                    type: string\n                                  tolerations:\n                                    description: |-\n                                      Allows Pods to be scheduled onto nodes with matching taints.\n                                      Each toleration in the array allows the Pod to tolerate node taints based on\n                                      specified `key`, `value`, `effect`, and `operator`.\n\n\n                                      - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                                      - The `operator` determines how the toleration matches the taint.\n\n\n                                      Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                                    items:\n                                      description: |-\n                                        The pod this Toleration is attached to tolerates any taint that matches\n                                        the triple <key,value,effect> using the matching operator <operator>.\n                                      properties:\n                                        effect:\n                                          description: |-\n                                            Effect indicates the taint effect to match. Empty means match all taint effects.\n                                            When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                          type: string\n                                        key:\n                                          description: |-\n                                            Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                            If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            Operator represents a key's relationship to the value.\n                                            Valid operators are Exists and Equal. Defaults to Equal.\n                                            Exists is equivalent to wildcard for value, so that a pod can\n                                            tolerate all taints of a particular category.\n                                          type: string\n                                        tolerationSeconds:\n                                          description: |-\n                                            TolerationSeconds represents the period of time the toleration (which must be\n                                            of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                            it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                            negative values will be treated as 0 (evict immediately) by the system.\n                                          format: int64\n                                          type: integer\n                                        value:\n                                          description: |-\n                                            Value is the taint value the toleration matches to.\n                                            If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                          type: string\n                                      type: object\n                                    type: array\n                                  topologySpreadConstraints:\n                                    description: |-\n                                      TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                                      domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                                      All topologySpreadConstraints are ANDed.\n                                    items:\n                                      description: TopologySpreadConstraint specifies\n                                        how to spread matching pods among the given\n                                        topology.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            LabelSelector is used to find matching pods.\n                                            Pods that match this label selector are counted to determine the number of pods\n                                            in their corresponding topology domain.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select the pods over which\n                                            spreading will be calculated. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are ANDed with labelSelector\n                                            to select the group of existing pods over which spreading will be calculated\n                                            for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            Keys that don't exist in the incoming pod labels will\n                                            be ignored. A null or empty list means only match against labelSelector.\n\n\n                                            This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        maxSkew:\n                                          description: |-\n                                            MaxSkew describes the degree to which pods may be unevenly distributed.\n                                            When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                            between the number of matching pods in the target topology and the global minimum.\n                                            The global minimum is the minimum number of matching pods in an eligible domain\n                                            or zero if the number of eligible domains is less than MinDomains.\n                                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                            labelSelector spread as 2/2/1:\n                                            In this case, the global minimum is 1.\n                                            | zone1 | zone2 | zone3 |\n                                            |  P P  |  P P  |   P   |\n                                            - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                            scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                            violate MaxSkew(1).\n                                            - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                            When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                            to topologies that satisfy it.\n                                            It's a required field. Default value is 1 and 0 is not allowed.\n                                          format: int32\n                                          type: integer\n                                        minDomains:\n                                          description: |-\n                                            MinDomains indicates a minimum number of eligible domains.\n                                            When the number of eligible domains with matching topology keys is less than minDomains,\n                                            Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                            And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                            this value has no effect on scheduling.\n                                            As a result, when the number of eligible domains is less than minDomains,\n                                            scheduler won't schedule more than maxSkew Pods to those domains.\n                                            If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                            Valid values are integers greater than 0.\n                                            When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                            For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                            labelSelector spread as 2/2/2:\n                                            | zone1 | zone2 | zone3 |\n                                            |  P P  |  P P  |  P P  |\n                                            The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                            In this situation, new pod with the same labelSelector cannot be scheduled,\n                                            because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                            it will violate MaxSkew.\n\n\n                                            This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                          format: int32\n                                          type: integer\n                                        nodeAffinityPolicy:\n                                          description: |-\n                                            NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                            when calculating pod topology spread skew. Options are:\n                                            - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                            - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                            If this value is nil, the behavior is equivalent to the Honor policy.\n                                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                          type: string\n                                        nodeTaintsPolicy:\n                                          description: |-\n                                            NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                            pod topology spread skew. Options are:\n                                            - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                            has a toleration, are included.\n                                            - Ignore: node taints are ignored. All nodes are included.\n\n\n                                            If this value is nil, the behavior is equivalent to the Ignore policy.\n                                            This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                          type: string\n                                        topologyKey:\n                                          description: |-\n                                            TopologyKey is the key of node labels. Nodes that have a label with this key\n                                            and identical values are considered to be in the same topology.\n                                            We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                            of pods into each bucket.\n                                            We define a domain as a particular instance of a topology.\n                                            Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                            nodeAffinityPolicy and nodeTaintsPolicy.\n                                            e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                            And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                            It's a required field.\n                                          type: string\n                                        whenUnsatisfiable:\n                                          description: |-\n                                            WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                            the spread constraint.\n                                            - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                            - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                              but giving higher precedence to topologies that would help reduce the\n                                              skew.\n                                            A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                            if and only if every possible node assignment for that pod would violate\n                                            \"MaxSkew\" on some topology.\n                                            For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                            labelSelector spread as 3/1/1:\n                                            | zone1 | zone2 | zone3 |\n                                            | P P P |   P   |   P   |\n                                            If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                            to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                            MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                            won't make it *more* imbalanced.\n                                            It's a required field.\n                                          type: string\n                                      required:\n                                      - maxSkew\n                                      - topologyKey\n                                      - whenUnsatisfiable\n                                      type: object\n                                    type: array\n                                type: object\n                              volumeClaimTemplates:\n                                description: Specifies an override for the storage\n                                  requirements of the instances.\n                                items:\n                                  properties:\n                                    annotations:\n                                      additionalProperties:\n                                        type: string\n                                      description: Specifies the annotations for the\n                                        PVC of the volume.\n                                      type: object\n                                    labels:\n                                      additionalProperties:\n                                        type: string\n                                      description: Specifies the labels for the PVC\n                                        of the volume.\n                                      type: object\n                                    name:\n                                      description: |-\n                                        Refers to the name of a volumeMount defined in either:\n\n\n                                        - `componentDefinition.spec.runtime.containers[*].volumeMounts`\n                                        - `clusterDefinition.spec.componentDefs[*].podSpec.containers[*].volumeMounts` (deprecated)\n\n\n                                        The value of `name` must match the `name` field of a volumeMount specified in the corresponding `volumeMounts` array.\n                                      type: string\n                                    spec:\n                                      description: |-\n                                        Defines the desired characteristics of a PersistentVolumeClaim that will be created for the volume\n                                        with the mount name specified in the `name` field.\n\n\n                                        When a Pod is created for this ClusterComponent, a new PVC will be created based on the specification\n                                        defined in the `spec` field. The PVC will be associated with the volume mount specified by the `name` field.\n                                      properties:\n                                        accessModes:\n                                          description: |-\n                                            Contains the desired access modes the volume should have.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-preserve-unknown-fields: true\n                                        resources:\n                                          description: |-\n                                            Represents the minimum resources the volume should have.\n                                            If the RecoverVolumeExpansionFailure feature is enabled, users are allowed to specify resource requirements that\n                                            are lower than the previous value but must still be higher than the capacity recorded in the status field of the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.\n                                          properties:\n                                            limits:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Limits describes the maximum amount of compute resources allowed.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                            requests:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Requests describes the minimum amount of compute resources required.\n                                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                          type: object\n                                          x-kubernetes-preserve-unknown-fields: true\n                                        storageClassName:\n                                          description: |-\n                                            The name of the StorageClass required by the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.\n                                          type: string\n                                        volumeAttributesClassName:\n                                          description: |-\n                                            volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n\n\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                          type: string\n                                        volumeMode:\n                                          description: Defines what type of volume\n                                            is required by the claim, either Block\n                                            or Filesystem.\n                                          type: string\n                                      type: object\n                                  required:\n                                  - name\n                                  type: object\n                                type: array\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        limits:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Limits describes the maximum amount of compute resources allowed.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                        offlineInstances:\n                          description: Records the offline instances of the Component\n                            prior to any changes.\n                          items:\n                            type: string\n                          type: array\n                        replicas:\n                          description: Records the `replicas` of the Component prior\n                            to any changes.\n                          format: int32\n                          type: integer\n                        requests:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Requests describes the minimum amount of compute resources required.\n                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                        serviceVersion:\n                          description: Records the version of the Service expected\n                            to be provisioned by this Component prior to any changes.\n                          type: string\n                        services:\n                          description: Records the ClusterComponentService list of\n                            the Component prior to any changes.\n                          items:\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  If ServiceType is LoadBalancer, cloud provider related parameters can be put here.\n                                  More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.\n                                type: object\n                              name:\n                                description: References the ComponentService name\n                                  defined in the `componentDefinition.spec.services[*].name`.\n                                maxLength: 25\n                                type: string\n                              podService:\n                                default: false\n                                description: |-\n                                  Indicates whether to generate individual Services for each Pod.\n                                  If set to true, a separate Service will be created for each Pod in the Cluster.\n                                type: boolean\n                              serviceType:\n                                default: ClusterIP\n                                description: |-\n                                  Determines how the Service is exposed. Valid options are `ClusterIP`, `NodePort`, and `LoadBalancer`.\n\n\n                                  - `ClusterIP` allocates a Cluster-internal IP address for load-balancing to endpoints.\n                                     Endpoints are determined by the selector or if that is not specified,\n                                     they are determined by manual construction of an Endpoints object or EndpointSlice objects.\n                                  - `NodePort` builds on ClusterIP and allocates a port on every node which routes to the same endpoints as the ClusterIP.\n                                  - `LoadBalancer` builds on NodePort and creates an external load-balancer (if supported in the current cloud)\n                                     which routes to the same endpoints as the ClusterIP.\n\n\n                                  Note: although K8s Service type allows the 'ExternalName' type, it is not a valid option for ClusterComponentService.\n\n\n                                  For more info, see:\n                                  https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types.\n                                enum:\n                                - ClusterIP\n                                - NodePort\n                                - LoadBalancer\n                                type: string\n                                x-kubernetes-preserve-unknown-fields: true\n                            required:\n                            - name\n                            type: object\n                          type: array\n                        shards:\n                          description: Records the `shards` of the Component prior\n                            to any changes.\n                          format: int32\n                          type: integer\n                        volumeClaimTemplates:\n                          description: Records volumes' storage size of the Component\n                            prior to any changes.\n                          items:\n                            properties:\n                              name:\n                                description: |-\n                                  Specify the name of the volumeClaimTemplate in the Component.\n                                  The specified name must match one of the volumeClaimTemplates defined\n                                  in the `clusterComponentSpec.volumeClaimTemplates` field.\n                                type: string\n                              storage:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the desired storage size for\n                                  the volume.\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                            required:\n                            - name\n                            - storage\n                            type: object\n                          type: array\n                      type: object\n                      x-kubernetes-preserve-unknown-fields: true\n                    description: Records the configuration of each Component prior\n                      to any changes.\n                    type: object\n                type: object\n              phase:\n                description: |-\n                  Represents the phase of the OpsRequest.\n                  Possible values include \"Pending\", \"Creating\", \"Running\", \"Cancelling\", \"Cancelled\", \"Failed\", \"Succeed\".\n                enum:\n                - Pending\n                - Creating\n                - Running\n                - Cancelling\n                - Cancelled\n                - Aborted\n                - Failed\n                - Succeed\n                type: string\n              progress:\n                default: -/-\n                description: Represents the progress of the OpsRequest.\n                pattern: ^(\\d+|\\-)/(\\d+|\\-)$\n                type: string\n              startTimestamp:\n                description: Records the time when the OpsRequest started processing.\n                format: date-time\n                type: string\n            required:\n            - progress\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: componentparameters.parameters.kubeblocks.io\nspec:\n  group: parameters.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ComponentParameter\n    listKind: ComponentParameterList\n    plural: componentparameters\n    singular: componentparameter\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - description: cluster name\n      jsonPath: .spec.clusterName\n      name: CLUSTER\n      type: string\n    - description: component name\n      jsonPath: .spec.componentName\n      name: COMPONENT\n      type: string\n    - description: config status phase.\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: ComponentParameter is the Schema for the componentparameters\n          API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ComponentParameterSpec defines the desired state of ComponentConfiguration\n            properties:\n              clusterName:\n                description: Specifies the name of the Cluster that this configuration\n                  is associated with.\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.clusterRef\n                  rule: self == oldSelf\n              componentName:\n                description: Represents the name of the Component that this configuration\n                  pertains to.\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.clusterRef\n                  rule: self == oldSelf\n              configItemDetails:\n                description: |-\n                  ConfigItemDetails is an array of ConfigTemplateItemDetail objects.\n\n\n                  Each ConfigTemplateItemDetail corresponds to a configuration template,\n                  which is a ConfigMap that contains multiple configuration files.\n                  Each configuration file is stored as a key-value pair within the ConfigMap.\n\n\n                  The ConfigTemplateItemDetail includes information such as:\n\n\n                  - The configuration template (a ConfigMap)\n                  - The corresponding ConfigConstraint (constraints and validation rules for the configuration)\n                  - Volume mounts (for mounting the configuration files)\n                items:\n                  description: ConfigTemplateItemDetail corresponds to settings of\n                    a configuration template (a ConfigMap).\n                  properties:\n                    configFileParams:\n                      additionalProperties:\n                        properties:\n                          content:\n                            description: |-\n                              Holds the configuration keys and values. This field is a workaround for issues found in kubebuilder and code-generator.\n                              Refer to https://github.com/kubernetes-sigs/kubebuilder/issues/528 and https://github.com/kubernetes/code-generator/issues/50 for more details.\n\n\n                              Represents the content of the configuration file.\n                            type: string\n                          parameters:\n                            additionalProperties:\n                              type: string\n                            description: Represents the updated parameters for a single\n                              configuration file.\n                            type: object\n                        type: object\n                      description: |-\n                        Specifies the user-defined configuration parameters.\n\n\n                        When provided, the parameter values in `configFileParams` override the default configuration parameters.\n                        This allows users to override the default configuration according to their specific needs.\n                      type: object\n                    configSpec:\n                      description: |-\n                        Specifies the name of the configuration template (a ConfigMap), ConfigConstraint, and other miscellaneous options.\n\n\n                        The configuration template is a ConfigMap that contains multiple configuration files.\n                        Each configuration file is stored as a key-value pair within the ConfigMap.\n\n\n                        ConfigConstraint allows defining constraints and validation rules for configuration parameters.\n                        It ensures that the configuration adheres to certain requirements and limitations.\n                      properties:\n                        defaultMode:\n                          description: |-\n                            The operator attempts to set default file permissions (0444).\n\n\n                            Must be specified as an octal value between 0000 and 0777 (inclusive),\n                            or as a decimal value between 0 and 511 (inclusive).\n                            YAML supports both octal and decimal values for file permissions.\n\n\n                            Please note that this setting only affects the permissions of the files themselves.\n                            Directories within the specified path are not impacted by this setting.\n                            It's important to be aware that this setting might conflict with other options\n                            that influence the file mode, such as fsGroup.\n                            In such cases, the resulting file mode may have additional bits set.\n                            Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.\n                          format: int32\n                          type: integer\n                        externalManaged:\n                          description: |-\n                            ExternalManaged indicates whether the configuration is managed by an external system.\n                            When set to true, the controller will ignore the management of this configuration.\n                          type: boolean\n                        name:\n                          description: Specifies the name of the template.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                        namespace:\n                          default: default\n                          description: Specifies the namespace of the referenced template\n                            ConfigMap object.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        restartOnFileChange:\n                          description: Specifies whether to restart the pod when the\n                            file changes.\n                          type: boolean\n                        template:\n                          description: Specifies the name of the referenced template\n                            ConfigMap object.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                        volumeName:\n                          description: |-\n                            Refers to the volume name of PodTemplate. The file produced through the template will be mounted to\n                            the corresponding volume. Must be a DNS_LABEL name.\n                            The volume name must be defined in podSpec.containers[*].volumeMounts.\n                          maxLength: 63\n                          pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                      required:\n                      - name\n                      type: object\n                    name:\n                      description: |-\n                        Defines the unique identifier of the configuration template.\n\n\n                        It must be a string of maximum 63 characters, and can only include lowercase alphanumeric characters,\n                        hyphens, and periods.\n                        The name must start and end with an alphanumeric character.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    payload:\n                      description: |-\n                        External controllers can trigger a configuration rerender by modifying this field.\n\n\n                        Note: Currently, the `payload` field is opaque and its content is not interpreted by the system.\n                        Modifying this field will cause a rerender, regardless of the specific content of this field.\n                      type: object\n                      x-kubernetes-preserve-unknown-fields: true\n                    userConfigTemplates:\n                      description: |-\n                        Specifies the user-defined configuration template.\n\n\n                        When provided, the `importTemplateRef` overrides the default configuration template\n                        specified in `configSpec.templateRef`.\n                        This allows users to customize the configuration template according to their specific requirements.\n                      properties:\n                        namespace:\n                          default: default\n                          description: |-\n                            Specifies the namespace of the referenced configuration template ConfigMap object.\n                            An empty namespace is equivalent to the \"default\" namespace.\n                          pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        policy:\n                          default: none\n                          description: Defines the strategy for merging externally\n                            imported templates into component templates.\n                          enum:\n                          - patch\n                          - replace\n                          - none\n                          type: string\n                        templateRef:\n                          description: Specifies the name of the referenced configuration\n                            template ConfigMap object.\n                          pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                          type: string\n                      required:\n                      - templateRef\n                      type: object\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n            required:\n            - componentName\n            type: object\n          status:\n            description: ComponentParameterStatus defines the observed state of ComponentConfiguration\n            properties:\n              conditions:\n                description: Provides detailed status information for opsRequest.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - type\n                x-kubernetes-list-type: map\n              configurationStatus:\n                description: Provides the status of each component undergoing reconfiguration.\n                items:\n                  properties:\n                    lastDoneRevision:\n                      description: Represents the last completed revision of the configuration\n                        item. This field is optional.\n                      type: string\n                    message:\n                      description: Provides a description of any abnormal status.\n                        This field is optional.\n                      type: string\n                    name:\n                      description: |-\n                        Specifies the name of the configuration template. It is a required field and must be a string of maximum 63 characters.\n                        The name should only contain lowercase alphanumeric characters, hyphens, or periods. It should start and end with an alphanumeric character.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    phase:\n                      description: |-\n                        Indicates the current status of the configuration item.\n\n\n                        Possible values include \"Creating\", \"Init\", \"Running\", \"Pending\", \"Merged\", \"MergeFailed\", \"FailedAndPause\",\n                        \"Upgrading\", \"Deleting\", \"FailedAndRetry\", \"Finished\".\n                      enum:\n                      - Creating\n                      - Init\n                      - Running\n                      - Pending\n                      - Merged\n                      - MergeFailed\n                      - FailedAndPause\n                      - Upgrading\n                      - Deleting\n                      - FailedAndRetry\n                      - Finished\n                      type: string\n                    reconcileDetail:\n                      description: Provides detailed information about the execution\n                        of the configuration change. This field is optional.\n                      properties:\n                        currentRevision:\n                          description: Represents the current revision of the configuration\n                            item.\n                          type: string\n                        errMessage:\n                          description: Represents the error message generated when\n                            the execution of configuration changes fails.\n                          type: string\n                        execResult:\n                          description: Represents the outcome of the most recent execution.\n                          type: string\n                        expectedCount:\n                          default: -1\n                          description: Represents the total number of pods that require\n                            execution of configuration changes.\n                          format: int32\n                          type: integer\n                        policy:\n                          description: Represents the policy applied during the most\n                            recent execution.\n                          type: string\n                        succeedCount:\n                          default: -1\n                          description: Represents the number of pods where configuration\n                            changes were successfully applied.\n                          format: int32\n                          type: integer\n                      type: object\n                    updateRevision:\n                      description: Represents the updated revision of the configuration\n                        item. This field is optional.\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              message:\n                description: Provides a description of any abnormal status.\n                type: string\n              observedGeneration:\n                description: |-\n                  Represents the latest generation observed for this\n                  ClusterDefinition. It corresponds to the ConfigConstraint's generation, which is\n                  updated by the API Server.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Indicates the current status of the configuration item.\n\n\n                  Possible values include \"Creating\", \"Init\", \"Running\", \"Pending\", \"Merged\", \"MergeFailed\", \"FailedAndPause\",\n                  \"Upgrading\", \"Deleting\", \"FailedAndRetry\", \"Finished\".\n                enum:\n                - Creating\n                - Init\n                - Running\n                - Pending\n                - Merged\n                - MergeFailed\n                - FailedAndPause\n                - Upgrading\n                - Deleting\n                - FailedAndRetry\n                - Finished\n                type: string\n            required:\n            - configurationStatus\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: paramconfigrenderers.parameters.kubeblocks.io\nspec:\n  group: parameters.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ParamConfigRenderer\n    listKind: ParamConfigRendererList\n    plural: paramconfigrenderers\n    shortNames:\n    - pcr\n    singular: paramconfigrenderer\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: componentdefinition name\n      jsonPath: .spec.componentDef\n      name: COMPD\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: PHASE\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: ParamConfigRenderer is the Schema for the paramconfigrenderers\n          API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ParamConfigRendererSpec defines the desired state of ParamConfigRenderer\n            properties:\n              componentDef:\n                description: Specifies the ComponentDefinition custom resource (CR)\n                  that defines the Component's characteristics and behavior.\n                type: string\n              configs:\n                description: Specifies the configuration files.\n                items:\n                  properties:\n                    fileFormatConfig:\n                      description: |-\n                        Specifies the format of the configuration file and any associated parameters that are specific to the chosen format.\n                        Supported formats include `ini`, `xml`, `yaml`, `json`, `hcl`, `dotenv`, `properties`, and `toml`.\n\n\n                        Each format may have its own set of parameters that can be configured.\n                        For instance, when using the `ini` format, you can specify the section name.\n\n\n                        Example:\n                        ```\n                        fileFormatConfig:\n                         format: ini\n                         iniConfig:\n                           sectionName: mysqld\n                        ```\n                      properties:\n                        format:\n                          description: |-\n                            The config file format. Valid values are `ini`, `xml`, `yaml`, `json`,\n                            `hcl`, `dotenv`, `properties` and `toml`. Each format has its own characteristics and use cases.\n\n\n                            - ini: is a text-based content with a structure and syntax comprising key–value pairs for properties, reference wiki: https://en.wikipedia.org/wiki/INI_file\n                            - xml: refers to wiki: https://en.wikipedia.org/wiki/XML\n                            - yaml: supports for complex data types and structures.\n                            - json: refers to wiki: https://en.wikipedia.org/wiki/JSON\n                            - hcl: The HashiCorp Configuration Language (HCL) is a configuration language authored by HashiCorp, reference url: https://www.linode.com/docs/guides/introduction-to-hcl/\n                            - dotenv: is a plain text file with simple key–value pairs, reference wiki: https://en.wikipedia.org/wiki/Configuration_file#MS-DOS\n                            - properties: a file extension mainly used in Java, reference wiki: https://en.wikipedia.org/wiki/.properties\n                            - toml: refers to wiki: https://en.wikipedia.org/wiki/TOML\n                            - props-plus: a file extension mainly used in Java, supports CamelCase(e.g: brokerMaxConnectionsPerIp)\n                          enum:\n                          - xml\n                          - ini\n                          - yaml\n                          - json\n                          - hcl\n                          - dotenv\n                          - toml\n                          - properties\n                          - redis\n                          - props-plus\n                          - props-ultra\n                          type: string\n                        iniConfig:\n                          description: Holds options specific to the 'ini' file format.\n                          properties:\n                            sectionName:\n                              description: A string that describes the name of the\n                                ini section.\n                              type: string\n                          type: object\n                      required:\n                      - format\n                      type: object\n                    name:\n                      description: Specifies the config file name in the config template.\n                      type: string\n                    reRenderResourceTypes:\n                      description: |-\n                        Specifies whether the configuration needs to be re-rendered after v-scale or h-scale operations to reflect changes.\n\n\n                        In some scenarios, the configuration may need to be updated to reflect the changes in resource allocation\n                        or cluster topology. Examples:\n\n\n                        - Redis: adjust maxmemory after v-scale operation.\n                        - MySQL: increase max connections after v-scale operation.\n                        - Zookeeper: update zoo.cfg with new node addresses after h-scale operation.\n                      items:\n                        description: RerenderResourceType defines the resource requirements\n                          for a component.\n                        enum:\n                        - vscale\n                        - hscale\n                        - tls\n                        - shardingHScale\n                        type: string\n                      type: array\n                      x-kubernetes-list-type: set\n                    templateName:\n                      description: Specifies the name of the referenced componentTemplateSpec.\n                      type: string\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              parametersDefs:\n                description: Specifies the ParametersDefinition custom resource (CR)\n                  that defines the Component parameter's schema and behavior.\n                items:\n                  type: string\n                type: array\n              serviceVersion:\n                description: |-\n                  ServiceVersion specifies the version of the Service expected to be provisioned by this Component.\n                  The version should follow the syntax and semantics of the \"Semantic Versioning\" specification (http://semver.org/).\n                  If no version is specified, the latest available version will be used.\n                type: string\n            required:\n            - componentDef\n            type: object\n          status:\n            description: ParamConfigRendererStatus defines the observed state of ParamConfigRenderer\n            properties:\n              message:\n                description: Provides additional information about the current phase.\n                type: string\n              observedGeneration:\n                description: The most recent generation number of the ParamsDesc object\n                  that has been observed by the controller.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Specifies the status of the configuration template.\n                  When set to PDAvailablePhase, the ParamsDesc can be referenced by ComponentDefinition.\n                enum:\n                - Available\n                - Unavailable\n                - Deleting\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: parameters.parameters.kubeblocks.io\nspec:\n  group: parameters.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: Parameter\n    listKind: ParameterList\n    plural: parameters\n    singular: parameter\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - description: cluster name\n      jsonPath: .spec.clusterName\n      name: CLUSTER\n      type: string\n    - description: config status phase.\n      jsonPath: .status.phase\n      name: STATUS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: Parameter is the Schema for the parameters API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ParameterSpec defines the desired state of Parameter\n            properties:\n              clusterName:\n                description: Specifies the name of the Cluster resource that this\n                  operation is targeting.\n                type: string\n                x-kubernetes-validations:\n                - message: forbidden to update spec.clusterName\n                  rule: self == oldSelf\n              componentParameters:\n                description: Lists ComponentParametersSpec objects, each specifying\n                  a Component and its parameters and template updates.\n                items:\n                  properties:\n                    componentName:\n                      description: Specifies the name of the Component.\n                      type: string\n                    parameters:\n                      additionalProperties:\n                        type: string\n                      description: Specifies the user-defined configuration template\n                        or parameters.\n                      type: object\n                    userConfigTemplates:\n                      additionalProperties:\n                        properties:\n                          namespace:\n                            default: default\n                            description: |-\n                              Specifies the namespace of the referenced configuration template ConfigMap object.\n                              An empty namespace is equivalent to the \"default\" namespace.\n                            pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                          policy:\n                            default: none\n                            description: Defines the strategy for merging externally\n                              imported templates into component templates.\n                            enum:\n                            - patch\n                            - replace\n                            - none\n                            type: string\n                          templateRef:\n                            description: Specifies the name of the referenced configuration\n                              template ConfigMap object.\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                        required:\n                        - templateRef\n                        type: object\n                      description: |-\n                        Specifies the user-defined configuration template.\n\n\n                        When provided, the `importTemplateRef` overrides the default configuration template\n                        specified in `configSpec.templateRef`.\n                        This allows users to customize the configuration template according to their specific requirements.\n                      type: object\n                  required:\n                  - componentName\n                  type: object\n                type: array\n            required:\n            - componentParameters\n            type: object\n          status:\n            description: ParameterStatus defines the observed state of Parameter\n            properties:\n              componentReconfiguringStatus:\n                description: Records the status of a reconfiguring operation if `opsRequest.spec.type`\n                  equals to \"Reconfiguring\".\n                items:\n                  properties:\n                    componentName:\n                      description: Specifies the name of the Component.\n                      type: string\n                    parameterStatus:\n                      description: Describes the status of the component reconfiguring.\n                      items:\n                        properties:\n                          lastDoneRevision:\n                            description: Represents the last completed revision of\n                              the configuration item. This field is optional.\n                            type: string\n                          message:\n                            description: Provides a description of any abnormal status.\n                              This field is optional.\n                            type: string\n                          name:\n                            description: |-\n                              Specifies the name of the configuration template. It is a required field and must be a string of maximum 63 characters.\n                              The name should only contain lowercase alphanumeric characters, hyphens, or periods. It should start and end with an alphanumeric character.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                            type: string\n                          phase:\n                            description: |-\n                              Indicates the current status of the configuration item.\n\n\n                              Possible values include \"Creating\", \"Init\", \"Running\", \"Pending\", \"Merged\", \"MergeFailed\", \"FailedAndPause\",\n                              \"Upgrading\", \"Deleting\", \"FailedAndRetry\", \"Finished\".\n                            enum:\n                            - Creating\n                            - Init\n                            - Running\n                            - Pending\n                            - Merged\n                            - MergeFailed\n                            - FailedAndPause\n                            - Upgrading\n                            - Deleting\n                            - FailedAndRetry\n                            - Finished\n                            type: string\n                          reconcileDetail:\n                            description: Provides detailed information about the execution\n                              of the configuration change. This field is optional.\n                            properties:\n                              currentRevision:\n                                description: Represents the current revision of the\n                                  configuration item.\n                                type: string\n                              errMessage:\n                                description: Represents the error message generated\n                                  when the execution of configuration changes fails.\n                                type: string\n                              execResult:\n                                description: Represents the outcome of the most recent\n                                  execution.\n                                type: string\n                              expectedCount:\n                                default: -1\n                                description: Represents the total number of pods that\n                                  require execution of configuration changes.\n                                format: int32\n                                type: integer\n                              policy:\n                                description: Represents the policy applied during\n                                  the most recent execution.\n                                type: string\n                              succeedCount:\n                                default: -1\n                                description: Represents the number of pods where configuration\n                                  changes were successfully applied.\n                                format: int32\n                                type: integer\n                            type: object\n                          updateRevision:\n                            description: Represents the updated revision of the configuration\n                              item. This field is optional.\n                            type: string\n                          updatedParameters:\n                            additionalProperties:\n                              properties:\n                                content:\n                                  description: |-\n                                    Holds the configuration keys and values. This field is a workaround for issues found in kubebuilder and code-generator.\n                                    Refer to https://github.com/kubernetes-sigs/kubebuilder/issues/528 and https://github.com/kubernetes/code-generator/issues/50 for more details.\n\n\n                                    Represents the content of the configuration file.\n                                  type: string\n                                parameters:\n                                  additionalProperties:\n                                    type: string\n                                  description: Represents the updated parameters for\n                                    a single configuration file.\n                                  type: object\n                              type: object\n                            description: Contains the updated parameters.\n                            type: object\n                          userConfigTemplates:\n                            description: |-\n                              Specifies the user-defined configuration template.\n\n\n                              When provided, the `importTemplateRef` overrides the default configuration template\n                              specified in `configSpec.templateRef`.\n                              This allows users to customize the configuration template according to their specific requirements.\n                            properties:\n                              namespace:\n                                default: default\n                                description: |-\n                                  Specifies the namespace of the referenced configuration template ConfigMap object.\n                                  An empty namespace is equivalent to the \"default\" namespace.\n                                pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                                type: string\n                              policy:\n                                default: none\n                                description: Defines the strategy for merging externally\n                                  imported templates into component templates.\n                                enum:\n                                - patch\n                                - replace\n                                - none\n                                type: string\n                              templateRef:\n                                description: Specifies the name of the referenced\n                                  configuration template ConfigMap object.\n                                pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                                type: string\n                            required:\n                            - templateRef\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                      x-kubernetes-list-map-keys:\n                      - name\n                      x-kubernetes-list-type: map\n                    phase:\n                      description: |-\n                        Indicates the current status of the configuration item.\n\n\n                        Possible values include \"Creating\", \"Init\", \"Running\", \"Pending\", \"Merged\", \"MergeFailed\", \"FailedAndPause\",\n                        \"Upgrading\", \"Deleting\", \"FailedAndRetry\", \"Finished\".\n                      enum:\n                      - Creating\n                      - Init\n                      - Running\n                      - Pending\n                      - Merged\n                      - MergeFailed\n                      - FailedAndPause\n                      - Upgrading\n                      - Deleting\n                      - FailedAndRetry\n                      - Finished\n                      type: string\n                  required:\n                  - componentName\n                  type: object\n                type: array\n              message:\n                description: Provides a description of any abnormal status.\n                type: string\n              observedGeneration:\n                description: |-\n                  Represents the latest generation observed for this\n                  ClusterDefinition. It corresponds to the ConfigConstraint's generation, which is\n                  updated by the API Server.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Indicates the current status of the configuration item.\n\n\n                  Possible values include \"Creating\", \"Init\", \"Running\", \"Pending\", \"Merged\", \"MergeFailed\", \"FailedAndPause\",\n                  \"Upgrading\", \"Deleting\", \"FailedAndRetry\", \"Finished\".\n                enum:\n                - Creating\n                - Init\n                - Running\n                - Pending\n                - Merged\n                - MergeFailed\n                - FailedAndPause\n                - Upgrading\n                - Deleting\n                - FailedAndRetry\n                - Finished\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: parametersdefinitions.parameters.kubeblocks.io\nspec:\n  group: parameters.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: ParametersDefinition\n    listKind: ParametersDefinitionList\n    plural: parametersdefinitions\n    shortNames:\n    - paramsdef\n    - pd\n    singular: parametersdefinition\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: config file name\n      jsonPath: .spec.fileName\n      name: FILE\n      type: string\n    - description: status phase\n      jsonPath: .status.phase\n      name: PHASE\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: ParametersDefinition is the Schema for the parametersdefinitions\n          API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ParametersDefinitionSpec defines the desired state of ParametersDefinition\n            properties:\n              deletedPolicy:\n                description: Specifies the policy when parameter be removed.\n                properties:\n                  defaultValue:\n                    description: |-\n                      Specifies the value to use if DeletedMethod is RestoreToDefault.\n                      Example: pg\n                      SET configuration_parameter TO DEFAULT;\n                    type: string\n                  deletedMethod:\n                    description: |-\n                      Specifies the method to handle the deletion of a parameter.\n                      If set to \"RestoreToDefault\", the parameter will be restored to its default value,\n                      which requires engine support, such as pg.\n                      If set to \"Reset\", the parameter will be re-rendered through the configuration template.\n                    enum:\n                    - RestoreToDefault\n                    - Reset\n                    type: string\n                required:\n                - deletedMethod\n                type: object\n              downwardAPIChangeTriggeredActions:\n                description: |-\n                  TODO: migrate DownwardAPITriggeredActions to ComponentDefinition.spec.lifecycleActions\n                  Specifies a list of actions to execute specified commands based on Pod labels.\n\n\n                  It utilizes the K8s Downward API to mount label information as a volume into the pod.\n                  The 'config-manager' sidecar container watches for changes in the role label and dynamically invoke\n                  registered commands (usually execute some SQL statements) when a change is detected.\n\n\n                  It is designed for scenarios where:\n\n\n                  - Replicas with different roles have different configurations, such as Redis primary & secondary replicas.\n                  - After a role switch (e.g., from secondary to primary), some changes in configuration are needed\n                    to reflect the new role.\n                items:\n                  description: |-\n                    DownwardAPIChangeTriggeredAction defines an action that triggers specific commands in response to changes in Pod labels.\n                    For example, a command might be executed when the 'role' label of the Pod is updated.\n                  properties:\n                    command:\n                      description: |-\n                        Specifies the command to be triggered when changes are detected in Downward API volume files.\n                        It relies on the inotify mechanism in the config-manager sidecar to monitor file changes.\n                      items:\n                        type: string\n                      type: array\n                    items:\n                      description: Represents a list of files under the Downward API\n                        volume.\n                      items:\n                        description: DownwardAPIVolumeFile represents information\n                          to create the file containing the pod field\n                        properties:\n                          fieldRef:\n                            description: 'Required: Selects a field of the pod: only\n                              annotations, labels, name and namespace are supported.'\n                            properties:\n                              apiVersion:\n                                description: Version of the schema the FieldPath is\n                                  written in terms of, defaults to \"v1\".\n                                type: string\n                              fieldPath:\n                                description: Path of the field to select in the specified\n                                  API version.\n                                type: string\n                            required:\n                            - fieldPath\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          mode:\n                            description: |-\n                              Optional: mode bits used to set permissions on this file, must be an octal value\n                              between 0000 and 0777 or a decimal value between 0 and 511.\n                              YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                              If not specified, the volume defaultMode will be used.\n                              This might be in conflict with other options that affect the file\n                              mode, like fsGroup, and the result can be other mode bits set.\n                            format: int32\n                            type: integer\n                          path:\n                            description: 'Required: Path is  the relative path name\n                              of the file to be created. Must not be absolute or contain\n                              the ''..'' path. Must be utf-8 encoded. The first item\n                              of the relative path must not start with ''..'''\n                            type: string\n                          resourceFieldRef:\n                            description: |-\n                              Selects a resource of the container: only resources limits and requests\n                              (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                            properties:\n                              containerName:\n                                description: 'Container name: required for volumes,\n                                  optional for env vars'\n                                type: string\n                              divisor:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the output format of the exposed\n                                  resources, defaults to \"1\"\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              resource:\n                                description: 'Required: resource to select'\n                                type: string\n                            required:\n                            - resource\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        required:\n                        - path\n                        type: object\n                      type: array\n                    mountPoint:\n                      description: Specifies the mount point of the Downward API volume.\n                      maxLength: 128\n                      type: string\n                    name:\n                      description: |-\n                        Specifies the name of the field. It must be a string of maximum length 63.\n                        The name should match the regex pattern `^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$`.\n                      maxLength: 63\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    scriptConfig:\n                      description: |-\n                        ScriptConfig object specifies a ConfigMap that contains script files that should be mounted inside the pod.\n                        The scripts are mounted as volumes and can be referenced and executed by the DownwardAction to perform specific tasks or configurations.\n                      properties:\n                        namespace:\n                          default: default\n                          description: |-\n                            Specifies the namespace for the ConfigMap.\n                            If not specified, it defaults to the \"default\" namespace.\n                          maxLength: 63\n                          pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                          type: string\n                        scriptConfigMapRef:\n                          description: Specifies the reference to the ConfigMap containing\n                            the scripts.\n                          type: string\n                      required:\n                      - scriptConfigMapRef\n                      type: object\n                  required:\n                  - items\n                  - mountPoint\n                  - name\n                  type: object\n                type: array\n              dynamicParameters:\n                description: |-\n                  List dynamic parameters.\n                  Modifications to these parameters trigger a configuration reload without requiring a process restart.\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n              fileName:\n                description: Specifies the config file name in the config template.\n                type: string\n              immutableParameters:\n                description: |-\n                  Lists the parameters that cannot be modified once set.\n                  Attempting to change any of these parameters will be ignored.\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n              mergeReloadAndRestart:\n                description: |-\n                  Indicates whether to consolidate dynamic reload and restart actions into a single restart.\n\n\n                  - If true, updates requiring both actions will result in only a restart, merging the actions.\n                  - If false, updates will trigger both actions executed sequentially: first dynamic reload, then restart.\n\n\n                  This flag allows for more efficient handling of configuration changes by potentially eliminating\n                  an unnecessary reload step.\n                type: boolean\n              parametersSchema:\n                description: |-\n                  Defines a list of parameters including their names, default values, descriptions,\n                  types, and constraints (permissible values or the range of valid values).\n                properties:\n                  cue:\n                    description: |-\n                      Hold a string that contains a script written in CUE language that defines a list of configuration items.\n                      Each item is detailed with its name, default value, description, type (e.g. string, integer, float),\n                      and constraints (permissible values or the valid range of values).\n\n\n                      CUE (Configure, Unify, Execute) is a declarative language designed for defining and validating\n                      complex data configurations.\n                      It is particularly useful in environments like K8s where complex configurations and validation rules are common.\n\n\n                      This script functions as a validator for user-provided configurations, ensuring compliance with\n                      the established specifications and constraints.\n                    type: string\n                  schemaInJSON:\n                    description: Generated from the 'cue' field and transformed into\n                      a JSON format.\n                    x-kubernetes-preserve-unknown-fields: true\n                  topLevelKey:\n                    description: |-\n                      Specifies the top-level key in the 'configSchema.cue' that organizes the validation rules for parameters.\n                      This key must exist within the CUE script defined in 'configSchema.cue'.\n                    type: string\n                type: object\n              reloadAction:\n                description: |-\n                  Specifies the dynamic reload (dynamic reconfiguration) actions supported by the engine.\n                  When set, the controller executes the scripts defined in these actions to handle dynamic parameter updates.\n\n\n                  Dynamic reloading is triggered only if both of the following conditions are met:\n\n\n                  1. The modified parameters are listed in the `dynamicParameters` field.\n                     If `dynamicParameterSelectedPolicy` is set to \"all\", modifications to `staticParameters`\n                     can also trigger a reload.\n                  2. `reloadAction` is set.\n\n\n                  If `reloadAction` is not set or the modified parameters are not listed in `dynamicParameters`,\n                  dynamic reloading will not be triggered.\n\n\n                  Example:\n                  ```yaml\n                  dynamicReloadAction:\n                   tplScriptTrigger:\n                     namespace: kb-system\n                     scriptConfigMapRef: mysql-reload-script\n                     sync: true\n                  ```\n                properties:\n                  autoTrigger:\n                    description: Automatically perform the reload when specified conditions\n                      are met.\n                    properties:\n                      processName:\n                        description: The name of the process.\n                        type: string\n                    type: object\n                  shellTrigger:\n                    description: Allows to execute a custom shell script to reload\n                      the process.\n                    properties:\n                      batchParamsFormatterTemplate:\n                        description: |-\n                          Specifies a Go template string for formatting batch input data.\n                          It's used when `batchReload` is 'True' to format data passed into STDIN of the script.\n                          The template accesses key-value pairs of updated parameters via the '$' variable.\n                          This allows for custom formatting of the input data.\n\n\n                          Example template:\n\n\n                          ```yaml\n                          batchParamsFormatterTemplate: |-\n                          {{- range $pKey, $pValue := $ }}\n                          {{ printf \"%s:%s\" $pKey $pValue }}\n                          {{- end }}\n                          ```\n\n\n                          This example generates batch input data in a key:value format, sorted by keys.\n                          ```\n                          key1:value1\n                          key2:value2\n                          key3:value3\n                          ```\n\n\n                          If not specified, the default format is key=value, sorted by keys, for each updated parameter.\n                          ```\n                          key1=value1\n                          key2=value2\n                          key3=value3\n                          ```\n                        type: string\n                      batchReload:\n                        description: |-\n                          Controls whether parameter updates are processed individually or collectively in a batch:\n\n\n                          - 'True': Processes all changes in one batch reload.\n                          - 'False': Processes each change individually.\n\n\n                          Defaults to 'False' if unspecified.\n                        type: boolean\n                      command:\n                        description: Specifies the command to execute in order to\n                          reload the process. It should be a valid shell command.\n                        items:\n                          type: string\n                        type: array\n                      scriptConfig:\n                        description: |-\n                          ScriptConfig object specifies a ConfigMap that contains script files that should be mounted inside the pod.\n                          The scripts are mounted as volumes and can be referenced and executed by the dynamic reload.\n                        properties:\n                          namespace:\n                            default: default\n                            description: |-\n                              Specifies the namespace for the ConfigMap.\n                              If not specified, it defaults to the \"default\" namespace.\n                            maxLength: 63\n                            pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                            type: string\n                          scriptConfigMapRef:\n                            description: Specifies the reference to the ConfigMap\n                              containing the scripts.\n                            type: string\n                        required:\n                        - scriptConfigMapRef\n                        type: object\n                      sync:\n                        description: |-\n                          Determines the synchronization mode of parameter updates with \"config-manager\".\n\n\n                          - 'True': Executes reload actions synchronously, pausing until completion.\n                          - 'False': Executes reload actions asynchronously, without waiting for completion.\n                        type: boolean\n                      toolsSetup:\n                        description: |-\n                          Specifies the tools container image used by ShellTrigger for dynamic reload.\n                          If the dynamic reload action is triggered by a ShellTrigger, this field is required.\n                          This image must contain all necessary tools for executing the ShellTrigger scripts.\n\n\n                          Usually the specified image is referenced by the init container,\n                          which is then responsible for copy the tools from the image to a bin volume.\n                          This ensures that the tools are available to the 'config-manager' sidecar.\n                        properties:\n                          mountPoint:\n                            description: |-\n                              Specifies the directory path in the container where the tools-related files are to be copied.\n                              This field is typically used with an emptyDir volume to ensure a temporary, empty directory is provided at pod creation.\n                            maxLength: 128\n                            type: string\n                          toolConfigs:\n                            description: Specifies a list of settings of init containers\n                              that prepare tools for dynamic reload.\n                            items:\n                              description: ToolConfig specifies the settings of an\n                                init container that prepare tools for dynamic reload.\n                              properties:\n                                asContainerImage:\n                                  description: \"Indicates whether the tool image should\n                                    be used as the container image for a sidecar.\\nThis\n                                    is useful for large tool images, such as those\n                                    for C++ tools, which may depend on\\nnumerous libraries\n                                    (e.g., *.so files).\\n\\n\\nIf enabled, the tool\n                                    image is deployed as a sidecar container image.\\n\\n\\nExamples:\\n```yaml\\n\n                                    toolsSetup::\\n   mountPoint: /kb_tools\\n   toolConfigs:\\n\n                                    \\    - name: kb-tools\\n       asContainerImage:\n                                    true\\n       image:  apecloud/oceanbase:4.2.0.0-100010032023083021\\n```\\n\\n\\ngenerated\n                                    containers:\\n```yaml\\ninitContainers:\\n - name:\n                                    install-config-manager-tool\\n   image: apecloud/kubeblocks-tools:${version}\\n\n                                    \\  command:\\n   - cp\\n   - /bin/config_render\\n\n                                    \\  - /opt/tools\\n   volumemounts:\\n   - name:\n                                    kb-tools\\n     mountpath: /opt/tools\\n\\n\\ncontainers:\\n\n                                    - name: config-manager\\n   image: apecloud/oceanbase:4.2.0.0-100010032023083021\\n\n                                    \\  imagePullPolicy: IfNotPresent\\n\\t  command:\\n\n                                    \\  - /opt/tools/reloader\\n   - --log-level\\n   -\n                                    info\\n   - --operator-update-enable\\n   - --tcp\\n\n                                    \\  - \\\"9901\\\"\\n   - --config\\n   - /opt/config-manager/config-manager.yaml\\n\n                                    \\  volumemounts:\\n   - name: kb-tools\\n     mountpath:\n                                    /opt/tools\\n```\"\n                                  type: boolean\n                                command:\n                                  description: Specifies the command to be executed\n                                    by the init container.\n                                  items:\n                                    type: string\n                                  type: array\n                                image:\n                                  description: Specifies the tool container image.\n                                  type: string\n                                name:\n                                  description: Specifies the name of the init container.\n                                  maxLength: 63\n                                  pattern: ^[a-z]([a-z0-9\\-]*[a-z0-9])?$\n                                  type: string\n                              type: object\n                            type: array\n                        required:\n                        - mountPoint\n                        type: object\n                    required:\n                    - command\n                    type: object\n                  targetPodSelector:\n                    description: |-\n                      Used to match labels on the pod to determine whether a dynamic reload should be performed.\n\n\n                      In some scenarios, only specific pods (e.g., primary replicas) need to undergo a dynamic reload.\n                      The `reloadedPodSelector` allows you to specify label selectors to target the desired pods for the reload process.\n\n\n                      If the `reloadedPodSelector` is not specified or is nil, all pods managed by the workload will be considered for the dynamic\n                      reload.\n                    properties:\n                      matchExpressions:\n                        description: matchExpressions is a list of label selector\n                          requirements. The requirements are ANDed.\n                        items:\n                          description: |-\n                            A label selector requirement is a selector that contains values, a key, and an operator that\n                            relates the key and values.\n                          properties:\n                            key:\n                              description: key is the label key that the selector\n                                applies to.\n                              type: string\n                            operator:\n                              description: |-\n                                operator represents a key's relationship to a set of values.\n                                Valid operators are In, NotIn, Exists and DoesNotExist.\n                              type: string\n                            values:\n                              description: |-\n                                values is an array of string values. If the operator is In or NotIn,\n                                the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                the values array must be empty. This array is replaced during a strategic\n                                merge patch.\n                              items:\n                                type: string\n                              type: array\n                          required:\n                          - key\n                          - operator\n                          type: object\n                        type: array\n                      matchLabels:\n                        additionalProperties:\n                          type: string\n                        description: |-\n                          matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                          map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                          operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                        type: object\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  tplScriptTrigger:\n                    description: Enables reloading process using a Go template script.\n                    properties:\n                      namespace:\n                        default: default\n                        description: |-\n                          Specifies the namespace for the ConfigMap.\n                          If not specified, it defaults to the \"default\" namespace.\n                        maxLength: 63\n                        pattern: ^[a-z0-9]([a-z0-9\\-]*[a-z0-9])?$\n                        type: string\n                      scriptConfigMapRef:\n                        description: Specifies the reference to the ConfigMap containing\n                          the scripts.\n                        type: string\n                      sync:\n                        description: |-\n                          Determines whether parameter updates should be synchronized with the \"config-manager\".\n                          Specifies the controller's reload strategy:\n\n\n                          - If set to 'True', the controller executes the reload action in synchronous mode,\n                            pausing execution until the reload completes.\n                          - If set to 'False', the controller executes the reload action in asynchronous mode,\n                            updating the ConfigMap without waiting for the reload process to finish.\n                        type: boolean\n                    required:\n                    - scriptConfigMapRef\n                    type: object\n                  unixSignalTrigger:\n                    description: Used to trigger a reload by sending a specific Unix\n                      signal to the process.\n                    properties:\n                      processName:\n                        description: Identifies the name of the process to which the\n                          Unix signal will be sent.\n                        type: string\n                      signal:\n                        description: |-\n                          Specifies a valid Unix signal to be sent.\n                          For a comprehensive list of all Unix signals, see: ../../pkg/configuration/configmap/handler.go:allUnixSignals\n                        enum:\n                        - SIGHUP\n                        - SIGINT\n                        - SIGQUIT\n                        - SIGILL\n                        - SIGTRAP\n                        - SIGABRT\n                        - SIGBUS\n                        - SIGFPE\n                        - SIGKILL\n                        - SIGUSR1\n                        - SIGSEGV\n                        - SIGUSR2\n                        - SIGPIPE\n                        - SIGALRM\n                        - SIGTERM\n                        - SIGSTKFLT\n                        - SIGCHLD\n                        - SIGCONT\n                        - SIGSTOP\n                        - SIGTSTP\n                        - SIGTTIN\n                        - SIGTTOU\n                        - SIGURG\n                        - SIGXCPU\n                        - SIGXFSZ\n                        - SIGVTALRM\n                        - SIGPROF\n                        - SIGWINCH\n                        - SIGIO\n                        - SIGPWR\n                        - SIGSYS\n                        type: string\n                    required:\n                    - processName\n                    - signal\n                    type: object\n                type: object\n              reloadStaticParamsBeforeRestart:\n                description: |-\n                  Configures whether the dynamic reload specified in `reloadAction` applies only to dynamic parameters or\n                  to all parameters (including static parameters).\n\n\n                  - false (default): Only modifications to the dynamic parameters listed in `dynamicParameters`\n                    will trigger a dynamic reload.\n                  - true: Modifications to both dynamic parameters listed in `dynamicParameters` and static parameters\n                    listed in `staticParameters` will trigger a dynamic reload.\n                    The \"all\" option is for certain engines that require static parameters to be set\n                    via SQL statements before they can take effect on restart.\n                type: boolean\n              staticParameters:\n                description: |-\n                  List static parameters.\n                  Modifications to any of these parameters require a restart of the process to take effect.\n                items:\n                  type: string\n                type: array\n                x-kubernetes-list-type: set\n            type: object\n          status:\n            description: ParametersDefinitionStatus defines the observed state of\n              ParametersDefinition\n            properties:\n              conditions:\n                description: |-\n                  Represents a list of detailed status of the ParametersDescription object.\n\n\n                  This field is crucial for administrators and developers to monitor and respond to changes within the ParametersDescription.\n                  It provides a history of state transitions and a snapshot of the current state that can be used for\n                  automated logic or direct inspection.\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n              observedGeneration:\n                description: The most recent generation number of the ParamsDesc object\n                  that has been observed by the controller.\n                format: int64\n                type: integer\n              phase:\n                description: |-\n                  Specifies the status of the configuration template.\n                  When set to PDAvailablePhase, the ParamsDesc can be referenced by ComponentDefinition.\n                enum:\n                - Available\n                - Unavailable\n                - Deleting\n                type: string\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: reconciliationtraces.trace.kubeblocks.io\nspec:\n  group: trace.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    - all\n    kind: ReconciliationTrace\n    listKind: ReconciliationTraceList\n    plural: reconciliationtraces\n    shortNames:\n    - trace\n    singular: reconciliationtrace\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    - description: Target Object Namespace\n      jsonPath: .spec.targetObject.namespace\n      name: TARGET_NS\n      type: string\n    - description: Target Object Name\n      jsonPath: .spec.targetObject.name\n      name: TARGET_NAME\n      type: string\n    - description: Latest Changed Object API Version\n      jsonPath: .status.currentState.changes[-1].objectReference.apiVersion\n      name: API_VERSION\n      type: string\n    - description: Latest Changed Object Kind\n      jsonPath: .status.currentState.changes[-1].objectReference.kind\n      name: KIND\n      type: string\n    - description: Latest Changed Object Namespace\n      jsonPath: .status.currentState.changes[-1].objectReference.namespace\n      name: NAMESPACE\n      type: string\n    - description: Latest Changed Object Name\n      jsonPath: .status.currentState.changes[-1].objectReference.name\n      name: NAME\n      type: string\n    - description: Latest Change Description\n      jsonPath: .status.currentState.changes[-1].description\n      name: CHANGE\n      type: string\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: ReconciliationTrace is the Schema for the reconciliationtraces\n          API\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: ReconciliationTraceSpec defines the desired state of ReconciliationTrace\n            properties:\n              dryRun:\n                description: |-\n                  DryRun tells the Controller to simulate the reconciliation process with a new desired spec of the TargetObject.\n                  And a reconciliation plan will be generated and described in the ReconciliationTraceStatus.\n                  The plan generation process will not impact the state of the TargetObject.\n                properties:\n                  desiredSpec:\n                    description: |-\n                      DesiredSpec specifies the desired spec of the TargetObject.\n                      The desired spec will be merged into the current spec by a strategic merge patch way to build the final spec,\n                      and the reconciliation plan will be calculated by comparing the current spec to the final spec.\n                      DesiredSpec should be a valid YAML string.\n                    type: string\n                required:\n                - desiredSpec\n                type: object\n              locale:\n                description: Locale specifies the locale to use when localizing the\n                  reconciliation trace.\n                type: string\n              stateEvaluationExpression:\n                description: |-\n                  StateEvaluationExpression specifies the state evaluation expression used during reconciliation progress observation.\n                  The whole reconciliation process from the creation of the TargetObject to the deletion of it\n                  is separated into several reconciliation cycles.\n                  The StateEvaluationExpression is applied to the TargetObject,\n                  and an evaluation result of true indicates the end of a reconciliation cycle.\n                  StateEvaluationExpression overrides the builtin default value.\n                properties:\n                  celExpression:\n                    description: |-\n                      CELExpression specifies to use CEL to evaluation the object state.\n                      The root object used in the expression is the primary object.\n                    properties:\n                      expression:\n                        description: Expression specifies the CEL expression.\n                        type: string\n                    required:\n                    - expression\n                    type: object\n                type: object\n              targetObject:\n                description: |-\n                  TargetObject specifies the target Cluster object.\n                  Default is the Cluster object with same namespace and name as this ReconciliationTrace object.\n                properties:\n                  name:\n                    description: |-\n                      Name of the referent.\n                      Default is same as the ReconciliationTrace object.\n                    type: string\n                  namespace:\n                    description: |-\n                      Namespace of the referent.\n                      Default is same as the ReconciliationTrace object.\n                    type: string\n                type: object\n            type: object\n          status:\n            description: ReconciliationTraceStatus defines the observed state of ReconciliationTrace\n            properties:\n              currentState:\n                description: |-\n                  CurrentState is the current state of the latest reconciliation cycle,\n                  that is the reconciliation process from the end of last reconciliation cycle until now.\n                properties:\n                  changes:\n                    description: Changes describes the detail reconciliation process.\n                    items:\n                      description: ObjectChange defines a detailed change of an object.\n                      properties:\n                        changeType:\n                          description: |-\n                            ChangeType specifies the change type.\n                            Event - specifies that this is a Kubernetes Event.\n                            Creation - specifies that this is an object creation.\n                            Update - specifies that this is an object update.\n                            Deletion - specifies that this is an object deletion.\n                          enum:\n                          - Event\n                          - Creation\n                          - Update\n                          - Deletion\n                          type: string\n                        description:\n                          description: Description describes the change in a user-friendly\n                            way.\n                          type: string\n                        eventAttributes:\n                          description: EventAttributes specifies the attributes of\n                            the event when ChangeType is Event.\n                          properties:\n                            name:\n                              description: Name of the Event.\n                              type: string\n                            reason:\n                              description: Reason of the Event.\n                              type: string\n                            type:\n                              description: Type of the Event.\n                              type: string\n                          required:\n                          - name\n                          - reason\n                          - type\n                          type: object\n                        localDescription:\n                          description: |-\n                            LocalDescription is the localized version of Description by using the Locale specified in `spec.locale`.\n                            Empty if the `spec.locale` is not specified.\n                          type: string\n                        objectReference:\n                          description: ObjectReference specifies the Object this change\n                            described.\n                          properties:\n                            apiVersion:\n                              description: API version of the referent.\n                              type: string\n                            fieldPath:\n                              description: |-\n                                If referring to a piece of an object instead of an entire object, this string\n                                should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].\n                                For example, if the object reference is to a container within a pod, this would take on a value like:\n                                \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered\n                                the event) or if no container name is specified \"spec.containers[2]\" (container with\n                                index 2 in this pod). This syntax is chosen only to have some well-defined way of\n                                referencing a part of an object.\n                                TODO: this design is not final and this field is subject to change in the future.\n                              type: string\n                            kind:\n                              description: |-\n                                Kind of the referent.\n                                More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              type: string\n                            namespace:\n                              description: |-\n                                Namespace of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n                              type: string\n                            resourceVersion:\n                              description: |-\n                                Specific resourceVersion to which this reference is made, if any.\n                                More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency\n                              type: string\n                            uid:\n                              description: |-\n                                UID of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        revision:\n                          description: |-\n                            Revision specifies the revision of the object after this change.\n                            Revision can be compared globally between all ObjectChanges of all Objects, to build a total order object change sequence.\n                          format: int64\n                          type: integer\n                        timestamp:\n                          description: |-\n                            Timestamp is a timestamp representing the ReconciliationTrace Controller time when this change occurred.\n                            It is not guaranteed to be set in happens-before order across separate changes.\n                            It is represented in RFC3339 form and is in UTC.\n                          format: date-time\n                          type: string\n                      required:\n                      - changeType\n                      - description\n                      - objectReference\n                      - revision\n                      type: object\n                    type: array\n                  objectTree:\n                    description: |-\n                      ObjectTree specifies the current object tree of the reconciliation cycle.\n                      Ideally, ObjectTree should be same as applying Changes to InitialObjectTree.\n                    properties:\n                      primary:\n                        description: Primary specifies reference of the primary object.\n                        properties:\n                          apiVersion:\n                            description: API version of the referent.\n                            type: string\n                          fieldPath:\n                            description: |-\n                              If referring to a piece of an object instead of an entire object, this string\n                              should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].\n                              For example, if the object reference is to a container within a pod, this would take on a value like:\n                              \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered\n                              the event) or if no container name is specified \"spec.containers[2]\" (container with\n                              index 2 in this pod). This syntax is chosen only to have some well-defined way of\n                              referencing a part of an object.\n                              TODO: this design is not final and this field is subject to change in the future.\n                            type: string\n                          kind:\n                            description: |-\n                              Kind of the referent.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            type: string\n                          namespace:\n                            description: |-\n                              Namespace of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n                            type: string\n                          resourceVersion:\n                            description: |-\n                              Specific resourceVersion to which this reference is made, if any.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency\n                            type: string\n                          uid:\n                            description: |-\n                              UID of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids\n                            type: string\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      secondaries:\n                        description: Secondaries describes all the secondary objects\n                          of this object, if any.\n                        x-kubernetes-preserve-unknown-fields: true\n                    required:\n                    - primary\n                    type: object\n                  summary:\n                    description: Summary summarizes the ObjectTree and Changes.\n                    properties:\n                      objectSummaries:\n                        description: ObjectSummaries summarizes each object type.\n                        items:\n                          description: ObjectSummary defines the total and change\n                            of an object.\n                          properties:\n                            changeSummary:\n                              description: |-\n                                ChangeSummary summarizes the change by comparing the final state to the current state of this type.\n                                Nil means no change.\n                              properties:\n                                added:\n                                  description: Added specifies the number of object\n                                    will be added.\n                                  format: int32\n                                  type: integer\n                                deleted:\n                                  description: Deleted specifies the number of object\n                                    will be deleted.\n                                  format: int32\n                                  type: integer\n                                updated:\n                                  description: Updated specifies the number of object\n                                    will be updated.\n                                  format: int32\n                                  type: integer\n                              type: object\n                            objectType:\n                              description: ObjectType of the object.\n                              properties:\n                                apiVersion:\n                                  description: APIVersion of the type.\n                                  type: string\n                                kind:\n                                  description: Kind of the type.\n                                  type: string\n                              required:\n                              - apiVersion\n                              - kind\n                              type: object\n                            total:\n                              description: Total number of the object of type defined\n                                by ObjectType.\n                              format: int32\n                              type: integer\n                          required:\n                          - objectType\n                          - total\n                          type: object\n                        type: array\n                    required:\n                    - objectSummaries\n                    type: object\n                required:\n                - changes\n                - objectTree\n                - summary\n                type: object\n              desiredState:\n                description: DesiredState is the desired state of the latest reconciliation\n                  cycle.\n                properties:\n                  changes:\n                    description: Changes describes the detail reconciliation process.\n                    items:\n                      description: ObjectChange defines a detailed change of an object.\n                      properties:\n                        changeType:\n                          description: |-\n                            ChangeType specifies the change type.\n                            Event - specifies that this is a Kubernetes Event.\n                            Creation - specifies that this is an object creation.\n                            Update - specifies that this is an object update.\n                            Deletion - specifies that this is an object deletion.\n                          enum:\n                          - Event\n                          - Creation\n                          - Update\n                          - Deletion\n                          type: string\n                        description:\n                          description: Description describes the change in a user-friendly\n                            way.\n                          type: string\n                        eventAttributes:\n                          description: EventAttributes specifies the attributes of\n                            the event when ChangeType is Event.\n                          properties:\n                            name:\n                              description: Name of the Event.\n                              type: string\n                            reason:\n                              description: Reason of the Event.\n                              type: string\n                            type:\n                              description: Type of the Event.\n                              type: string\n                          required:\n                          - name\n                          - reason\n                          - type\n                          type: object\n                        localDescription:\n                          description: |-\n                            LocalDescription is the localized version of Description by using the Locale specified in `spec.locale`.\n                            Empty if the `spec.locale` is not specified.\n                          type: string\n                        objectReference:\n                          description: ObjectReference specifies the Object this change\n                            described.\n                          properties:\n                            apiVersion:\n                              description: API version of the referent.\n                              type: string\n                            fieldPath:\n                              description: |-\n                                If referring to a piece of an object instead of an entire object, this string\n                                should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].\n                                For example, if the object reference is to a container within a pod, this would take on a value like:\n                                \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered\n                                the event) or if no container name is specified \"spec.containers[2]\" (container with\n                                index 2 in this pod). This syntax is chosen only to have some well-defined way of\n                                referencing a part of an object.\n                                TODO: this design is not final and this field is subject to change in the future.\n                              type: string\n                            kind:\n                              description: |-\n                                Kind of the referent.\n                                More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                              type: string\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              type: string\n                            namespace:\n                              description: |-\n                                Namespace of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n                              type: string\n                            resourceVersion:\n                              description: |-\n                                Specific resourceVersion to which this reference is made, if any.\n                                More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency\n                              type: string\n                            uid:\n                              description: |-\n                                UID of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        revision:\n                          description: |-\n                            Revision specifies the revision of the object after this change.\n                            Revision can be compared globally between all ObjectChanges of all Objects, to build a total order object change sequence.\n                          format: int64\n                          type: integer\n                        timestamp:\n                          description: |-\n                            Timestamp is a timestamp representing the ReconciliationTrace Controller time when this change occurred.\n                            It is not guaranteed to be set in happens-before order across separate changes.\n                            It is represented in RFC3339 form and is in UTC.\n                          format: date-time\n                          type: string\n                      required:\n                      - changeType\n                      - description\n                      - objectReference\n                      - revision\n                      type: object\n                    type: array\n                  objectTree:\n                    description: |-\n                      ObjectTree specifies the current object tree of the reconciliation cycle.\n                      Ideally, ObjectTree should be same as applying Changes to InitialObjectTree.\n                    properties:\n                      primary:\n                        description: Primary specifies reference of the primary object.\n                        properties:\n                          apiVersion:\n                            description: API version of the referent.\n                            type: string\n                          fieldPath:\n                            description: |-\n                              If referring to a piece of an object instead of an entire object, this string\n                              should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].\n                              For example, if the object reference is to a container within a pod, this would take on a value like:\n                              \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered\n                              the event) or if no container name is specified \"spec.containers[2]\" (container with\n                              index 2 in this pod). This syntax is chosen only to have some well-defined way of\n                              referencing a part of an object.\n                              TODO: this design is not final and this field is subject to change in the future.\n                            type: string\n                          kind:\n                            description: |-\n                              Kind of the referent.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                            type: string\n                          name:\n                            description: |-\n                              Name of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            type: string\n                          namespace:\n                            description: |-\n                              Namespace of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n                            type: string\n                          resourceVersion:\n                            description: |-\n                              Specific resourceVersion to which this reference is made, if any.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency\n                            type: string\n                          uid:\n                            description: |-\n                              UID of the referent.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids\n                            type: string\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      secondaries:\n                        description: Secondaries describes all the secondary objects\n                          of this object, if any.\n                        x-kubernetes-preserve-unknown-fields: true\n                    required:\n                    - primary\n                    type: object\n                  summary:\n                    description: Summary summarizes the ObjectTree and Changes.\n                    properties:\n                      objectSummaries:\n                        description: ObjectSummaries summarizes each object type.\n                        items:\n                          description: ObjectSummary defines the total and change\n                            of an object.\n                          properties:\n                            changeSummary:\n                              description: |-\n                                ChangeSummary summarizes the change by comparing the final state to the current state of this type.\n                                Nil means no change.\n                              properties:\n                                added:\n                                  description: Added specifies the number of object\n                                    will be added.\n                                  format: int32\n                                  type: integer\n                                deleted:\n                                  description: Deleted specifies the number of object\n                                    will be deleted.\n                                  format: int32\n                                  type: integer\n                                updated:\n                                  description: Updated specifies the number of object\n                                    will be updated.\n                                  format: int32\n                                  type: integer\n                              type: object\n                            objectType:\n                              description: ObjectType of the object.\n                              properties:\n                                apiVersion:\n                                  description: APIVersion of the type.\n                                  type: string\n                                kind:\n                                  description: Kind of the type.\n                                  type: string\n                              required:\n                              - apiVersion\n                              - kind\n                              type: object\n                            total:\n                              description: Total number of the object of type defined\n                                by ObjectType.\n                              format: int32\n                              type: integer\n                          required:\n                          - objectType\n                          - total\n                          type: object\n                        type: array\n                    required:\n                    - objectSummaries\n                    type: object\n                required:\n                - changes\n                - objectTree\n                - summary\n                type: object\n              dryRunResult:\n                description: DryRunResult specifies the dry-run result.\n                properties:\n                  desiredSpecRevision:\n                    description: DesiredSpecRevision specifies the revision of the\n                      DesiredSpec.\n                    type: string\n                  message:\n                    description: Message specifies a description of the failure reason.\n                    type: string\n                  observedTargetGeneration:\n                    description: ObservedTargetGeneration specifies the observed generation\n                      of the TargetObject.\n                    format: int64\n                    type: integer\n                  phase:\n                    description: |-\n                      Phase specifies the current phase of the plan generation process.\n                      Succeed - the plan is calculated successfully.\n                      Failed - the plan can't be generated for some reason described in Reason.\n                    enum:\n                    - Succeed\n                    - Failed\n                    type: string\n                  plan:\n                    description: Plan describes the detail reconciliation process\n                      if the DesiredSpec is applied.\n                    properties:\n                      changes:\n                        description: Changes describes the detail reconciliation process.\n                        items:\n                          description: ObjectChange defines a detailed change of an\n                            object.\n                          properties:\n                            changeType:\n                              description: |-\n                                ChangeType specifies the change type.\n                                Event - specifies that this is a Kubernetes Event.\n                                Creation - specifies that this is an object creation.\n                                Update - specifies that this is an object update.\n                                Deletion - specifies that this is an object deletion.\n                              enum:\n                              - Event\n                              - Creation\n                              - Update\n                              - Deletion\n                              type: string\n                            description:\n                              description: Description describes the change in a user-friendly\n                                way.\n                              type: string\n                            eventAttributes:\n                              description: EventAttributes specifies the attributes\n                                of the event when ChangeType is Event.\n                              properties:\n                                name:\n                                  description: Name of the Event.\n                                  type: string\n                                reason:\n                                  description: Reason of the Event.\n                                  type: string\n                                type:\n                                  description: Type of the Event.\n                                  type: string\n                              required:\n                              - name\n                              - reason\n                              - type\n                              type: object\n                            localDescription:\n                              description: |-\n                                LocalDescription is the localized version of Description by using the Locale specified in `spec.locale`.\n                                Empty if the `spec.locale` is not specified.\n                              type: string\n                            objectReference:\n                              description: ObjectReference specifies the Object this\n                                change described.\n                              properties:\n                                apiVersion:\n                                  description: API version of the referent.\n                                  type: string\n                                fieldPath:\n                                  description: |-\n                                    If referring to a piece of an object instead of an entire object, this string\n                                    should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].\n                                    For example, if the object reference is to a container within a pod, this would take on a value like:\n                                    \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered\n                                    the event) or if no container name is specified \"spec.containers[2]\" (container with\n                                    index 2 in this pod). This syntax is chosen only to have some well-defined way of\n                                    referencing a part of an object.\n                                    TODO: this design is not final and this field is subject to change in the future.\n                                  type: string\n                                kind:\n                                  description: |-\n                                    Kind of the referent.\n                                    More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                                  type: string\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  type: string\n                                namespace:\n                                  description: |-\n                                    Namespace of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n                                  type: string\n                                resourceVersion:\n                                  description: |-\n                                    Specific resourceVersion to which this reference is made, if any.\n                                    More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency\n                                  type: string\n                                uid:\n                                  description: |-\n                                    UID of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids\n                                  type: string\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            revision:\n                              description: |-\n                                Revision specifies the revision of the object after this change.\n                                Revision can be compared globally between all ObjectChanges of all Objects, to build a total order object change sequence.\n                              format: int64\n                              type: integer\n                            timestamp:\n                              description: |-\n                                Timestamp is a timestamp representing the ReconciliationTrace Controller time when this change occurred.\n                                It is not guaranteed to be set in happens-before order across separate changes.\n                                It is represented in RFC3339 form and is in UTC.\n                              format: date-time\n                              type: string\n                          required:\n                          - changeType\n                          - description\n                          - objectReference\n                          - revision\n                          type: object\n                        type: array\n                      objectTree:\n                        description: |-\n                          ObjectTree specifies the current object tree of the reconciliation cycle.\n                          Ideally, ObjectTree should be same as applying Changes to InitialObjectTree.\n                        properties:\n                          primary:\n                            description: Primary specifies reference of the primary\n                              object.\n                            properties:\n                              apiVersion:\n                                description: API version of the referent.\n                                type: string\n                              fieldPath:\n                                description: |-\n                                  If referring to a piece of an object instead of an entire object, this string\n                                  should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].\n                                  For example, if the object reference is to a container within a pod, this would take on a value like:\n                                  \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered\n                                  the event) or if no container name is specified \"spec.containers[2]\" (container with\n                                  index 2 in this pod). This syntax is chosen only to have some well-defined way of\n                                  referencing a part of an object.\n                                  TODO: this design is not final and this field is subject to change in the future.\n                                type: string\n                              kind:\n                                description: |-\n                                  Kind of the referent.\n                                  More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                type: string\n                              namespace:\n                                description: |-\n                                  Namespace of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n                                type: string\n                              resourceVersion:\n                                description: |-\n                                  Specific resourceVersion to which this reference is made, if any.\n                                  More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency\n                                type: string\n                              uid:\n                                description: |-\n                                  UID of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids\n                                type: string\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          secondaries:\n                            description: Secondaries describes all the secondary objects\n                              of this object, if any.\n                            x-kubernetes-preserve-unknown-fields: true\n                        required:\n                        - primary\n                        type: object\n                      summary:\n                        description: Summary summarizes the ObjectTree and Changes.\n                        properties:\n                          objectSummaries:\n                            description: ObjectSummaries summarizes each object type.\n                            items:\n                              description: ObjectSummary defines the total and change\n                                of an object.\n                              properties:\n                                changeSummary:\n                                  description: |-\n                                    ChangeSummary summarizes the change by comparing the final state to the current state of this type.\n                                    Nil means no change.\n                                  properties:\n                                    added:\n                                      description: Added specifies the number of object\n                                        will be added.\n                                      format: int32\n                                      type: integer\n                                    deleted:\n                                      description: Deleted specifies the number of\n                                        object will be deleted.\n                                      format: int32\n                                      type: integer\n                                    updated:\n                                      description: Updated specifies the number of\n                                        object will be updated.\n                                      format: int32\n                                      type: integer\n                                  type: object\n                                objectType:\n                                  description: ObjectType of the object.\n                                  properties:\n                                    apiVersion:\n                                      description: APIVersion of the type.\n                                      type: string\n                                    kind:\n                                      description: Kind of the type.\n                                      type: string\n                                  required:\n                                  - apiVersion\n                                  - kind\n                                  type: object\n                                total:\n                                  description: Total number of the object of type\n                                    defined by ObjectType.\n                                  format: int32\n                                  type: integer\n                              required:\n                              - objectType\n                              - total\n                              type: object\n                            type: array\n                        required:\n                        - objectSummaries\n                        type: object\n                    required:\n                    - changes\n                    - objectTree\n                    - summary\n                    type: object\n                  reason:\n                    description: Reason specifies the reason when the Phase is Failed.\n                    type: string\n                  specDiff:\n                    description: \"SpecDiff describes the diff between the current\n                      spec and the final spec.\\nThe whole spec struct will be compared\n                      and an example SpecDiff looks like:\\n{\\n \\tAffinity: {\\n \\t\\tPodAntiAffinity:\n                      \\\"Preferred\\\",\\n \\t\\tTenancy: \\\"SharedNode\\\",\\n \\t},\\n \\tComponentSpecs:\n                      {\\n \\t\\t{\\n \\t\\t\\tComponentDef: \\\"postgresql\\\",\\n \\t\\t\\tName:\n                      \\\"postgresql\\\",\\n-\\t\\t\\tReplicas: 2,\\n \\t\\t\\tResources:\\n \\t\\t\\t{\\n\n                      \\t\\t\\t\\tLimits:\\n \\t\\t\\t\\t{\\n-\\t\\t\\t\\t\\tCPU: 500m,\\n-\\t\\t\\t\\t\\tMemory:\n                      512Mi,\\n \\t\\t\\t\\t},\\n \\t\\t\\t\\tRequests:\\n \\t\\t\\t\\t{\\n-\\t\\t\\t\\t\\tCPU:\n                      500m,\\n-\\t\\t\\t\\t\\tMemory: 512Mi,\\n \\t\\t\\t\\t},\\n \\t\\t\\t},\\n \\t\\t},\\n\n                      \\t},\\n}\"\n                    type: string\n                required:\n                - desiredSpecRevision\n                - observedTargetGeneration\n                - plan\n                - specDiff\n                type: object\n              initialObjectTree:\n                description: InitialObjectTree specifies the initial object tree when\n                  the latest reconciliation cycle started.\n                properties:\n                  primary:\n                    description: Primary specifies reference of the primary object.\n                    properties:\n                      apiVersion:\n                        description: API version of the referent.\n                        type: string\n                      fieldPath:\n                        description: |-\n                          If referring to a piece of an object instead of an entire object, this string\n                          should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].\n                          For example, if the object reference is to a container within a pod, this would take on a value like:\n                          \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered\n                          the event) or if no container name is specified \"spec.containers[2]\" (container with\n                          index 2 in this pod). This syntax is chosen only to have some well-defined way of\n                          referencing a part of an object.\n                          TODO: this design is not final and this field is subject to change in the future.\n                        type: string\n                      kind:\n                        description: |-\n                          Kind of the referent.\n                          More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                        type: string\n                      name:\n                        description: |-\n                          Name of the referent.\n                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                        type: string\n                      namespace:\n                        description: |-\n                          Namespace of the referent.\n                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n                        type: string\n                      resourceVersion:\n                        description: |-\n                          Specific resourceVersion to which this reference is made, if any.\n                          More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency\n                        type: string\n                      uid:\n                        description: |-\n                          UID of the referent.\n                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids\n                        type: string\n                    type: object\n                    x-kubernetes-map-type: atomic\n                  secondaries:\n                    description: Secondaries describes all the secondary objects of\n                      this object, if any.\n                    x-kubernetes-preserve-unknown-fields: true\n                required:\n                - primary\n                type: object\n            required:\n            - currentState\n            - initialObjectTree\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.14.0\n  labels:\n    app.kubernetes.io/name: kubeblocks\n  name: instancesets.workloads.kubeblocks.io\nspec:\n  group: workloads.kubeblocks.io\n  names:\n    categories:\n    - kubeblocks\n    kind: InstanceSet\n    listKind: InstanceSetList\n    plural: instancesets\n    shortNames:\n    - its\n    singular: instanceset\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - description: ready replicas.\n      jsonPath: .status.readyReplicas\n      name: READY\n      type: string\n    - description: desired replicas.\n      jsonPath: .spec.replicas\n      name: DESIRED\n      type: string\n    - description: updated replicas.\n      jsonPath: .status.updatedReplicas\n      name: UP-TO-DATE\n      type: string\n    - description: available replicas, which are ready for at least minReadySeconds.\n      jsonPath: .status.availableReplicas\n      name: AVAILABLE\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: InstanceSet is the Schema for the instancesets API.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Defines the desired state of the state machine. It includes\n              the configuration details for the state machine.\n            properties:\n              configs:\n                description: Describe the configs to be reconfigured.\n                items:\n                  properties:\n                    generation:\n                      description: The generation of the config.\n                      format: int64\n                      type: integer\n                    name:\n                      description: The name of the config.\n                      type: string\n                    parameters:\n                      additionalProperties:\n                        type: string\n                      description: The parameters to call the reconfigure action.\n                      type: object\n                    reconfigure:\n                      description: The custom reconfigure action.\n                      properties:\n                        exec:\n                          description: |-\n                            Defines the command to run.\n\n\n                            This field cannot be updated.\n                          properties:\n                            args:\n                              description: Args represents the arguments that are\n                                passed to the `command` for execution.\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: |-\n                                Specifies the command to be executed inside the container.\n                                The working directory for this command is the container's root directory('/').\n                                Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                                If the shell is required, it must be explicitly invoked in the command.\n\n\n                                A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                              items:\n                                type: string\n                              type: array\n                            container:\n                              description: |-\n                                Specifies the name of the container within the same pod whose resources will be shared with the action.\n                                This allows the action to utilize the specified container's resources without executing within it.\n\n\n                                The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                                The resources that can be shared are included:\n\n\n                                - volume mounts\n\n\n                                This field cannot be updated.\n                              type: string\n                            env:\n                              description: |-\n                                Represents a list of environment variables that will be injected into the container.\n                                These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                                This field cannot be updated.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            image:\n                              description: |-\n                                Specifies the container image to be used for running the Action.\n\n\n                                When specified, a dedicated container will be created using this image to execute the Action.\n                                All actions with same image will share the same container.\n\n\n                                This field cannot be updated.\n                              type: string\n                            matchingKey:\n                              description: |-\n                                Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                                The impact of this field depends on the `targetPodSelector` value:\n\n\n                                - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                                - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                  will be selected for the Action.\n\n\n                                This field cannot be updated.\n                              type: string\n                            targetPodSelector:\n                              description: |-\n                                Defines the criteria used to select the target Pod(s) for executing the Action.\n                                This is useful when there is no default target replica identified.\n                                It allows for precise control over which Pod(s) the Action should run in.\n\n\n                                If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                                to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                                post-provision or pre-terminate of the component.\n\n\n                                This field cannot be updated.\n                              enum:\n                              - Any\n                              - All\n                              - Role\n                              - Ordinal\n                              type: string\n                          type: object\n                        grpc:\n                          description: |-\n                            Defines the gRPC call to issue.\n\n\n                            This field cannot be updated.\n                          properties:\n                            host:\n                              description: |-\n                                The target host to connect to.\n                                Defaults to \"127.0.0.1\" if not specified.\n                              type: string\n                            method:\n                              description: Name of the method to invoke on the gRPC\n                                service.\n                              type: string\n                            port:\n                              description: |-\n                                The port to access on the host.\n                                It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                              type: string\n                            request:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                Request payload for the gRPC method.\n\n\n                                Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                                Templates are rendered with predefined action variables before the request is sent.\n                              type: object\n                            response:\n                              description: Required response schema for the gRPC method.\n                              properties:\n                                message:\n                                  description: |-\n                                    Name of the field in the response whose value should be output.\n                                    Printed to stdout on success, or stderr on failure.\n                                  type: string\n                                status:\n                                  description: |-\n                                    Name of the string field in the response that carries status information.\n                                    If non-empty, the action fails.\n                                  type: string\n                              type: object\n                            service:\n                              description: Fully-qualified name of the gRPC service\n                                to call.\n                              type: string\n                          required:\n                          - method\n                          - port\n                          - service\n                          type: object\n                        http:\n                          description: |-\n                            Defines the HTTP request to perform.\n\n\n                            This field cannot be updated.\n                          properties:\n                            body:\n                              description: |-\n                                Optional HTTP request body.\n\n\n                                Supports Go text/template syntax; rendered with predefined variables before sending.\n                              type: string\n                            headers:\n                              description: |-\n                                Custom headers to set in the request.\n                                Header values may use Go text/template syntax, rendered with predefined variables.\n                              items:\n                                description: HTTPHeader represents a single HTTP header\n                                  key/value pair.\n                                properties:\n                                  name:\n                                    description: Name of the header field.\n                                    type: string\n                                  value:\n                                    description: Value of the header field.\n                                    type: string\n                                required:\n                                - name\n                                - value\n                                type: object\n                              type: array\n                            host:\n                              description: |-\n                                The target host to connect to.\n                                Defaults to \"127.0.0.1\" if not specified.\n                              type: string\n                            method:\n                              default: GET\n                              description: |-\n                                The HTTP method to use.\n                                Defaults to \"GET\".\n                              enum:\n                              - GET\n                              - POST\n                              - PUT\n                              - DELETE\n                              - HEAD\n                              - PATCH\n                              type: string\n                            path:\n                              default: /\n                              description: |-\n                                The path to request on the HTTP server.\n                                Defaults to \"/\" if not specified.\n                              pattern: ^/.*\n                              type: string\n                            port:\n                              description: |-\n                                The port to access on the host.\n                                It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                              type: string\n                            scheme:\n                              default: HTTP\n                              description: |-\n                                The scheme to use for connecting to the host.\n                                Defaults to \"HTTP\".\n                              enum:\n                              - HTTP\n                              - HTTPS\n                              type: string\n                          required:\n                          - port\n                          type: object\n                        matchingKey:\n                          description: |-\n                            Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                            The impact of this field depends on the `targetPodSelector` value:\n\n\n                            - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                            - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                              will be selected for the Action.\n\n\n                            This field cannot be updated.\n                          type: string\n                        preCondition:\n                          description: |-\n                            Specifies the state that the cluster must reach before the Action is executed.\n                            Currently, this is only applicable to the `postProvision` action.\n\n\n                            The conditions are as follows:\n\n\n                            - `Immediately`: Executed right after the Component object is created.\n                              The readiness of the Component and its resources is not guaranteed at this stage.\n                            - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                              runtime resources (e.g. Pods) are in a ready state.\n                            - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                              This process does not affect the readiness state of the Component or the Cluster.\n                            - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                              This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                            This field cannot be updated.\n                          type: string\n                        retryPolicy:\n                          description: |-\n                            Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                            It specifies the conditions under which the Action should be retried and the limits to apply,\n                            such as the maximum number of retries and backoff strategy.\n\n\n                            This field cannot be updated.\n                          properties:\n                            maxRetries:\n                              default: 0\n                              description: |-\n                                Defines the maximum number of retry attempts that should be made for a given Action.\n                                This value is set to 0 by default, indicating that no retries will be made.\n                              type: integer\n                            retryInterval:\n                              default: 0\n                              description: |-\n                                Indicates the duration of time to wait between each retry attempt.\n                                This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                              format: int64\n                              type: integer\n                          type: object\n                        targetPodSelector:\n                          description: |-\n                            Defines the criteria used to select the target Pod(s) for executing the Action.\n                            This is useful when there is no default target replica identified.\n                            It allows for precise control over which Pod(s) the Action should run in.\n\n\n                            If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                            to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                            post-provision or pre-terminate of the component.\n\n\n                            This field cannot be updated.\n                          enum:\n                          - Any\n                          - All\n                          - Role\n                          - Ordinal\n                          type: string\n                        timeoutSeconds:\n                          default: 0\n                          description: |-\n                            Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                            If the Action does not complete within this time frame, it will be terminated.\n\n\n                            This field cannot be updated.\n                          format: int32\n                          type: integer\n                      type: object\n                    reconfigureActionName:\n                      description: |-\n                        The name of the custom reconfigure action.\n\n\n                        An empty name indicates that the reconfigure action is the default one defined by lifecycle actions.\n                      type: string\n                  required:\n                  - generation\n                  - name\n                  type: object\n                type: array\n              defaultTemplateOrdinals:\n                description: |-\n                  Specifies the desired Ordinals of the default template.\n                  The Ordinals used to specify the ordinal of the instance (pod) names to be generated under the default template.\n\n\n                  For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},\n                  then the instance names generated under the default template would be\n                  $(cluster.name)-$(component.name)-0、$(cluster.name)-$(component.name)-1 and $(cluster.name)-$(component.name)-7\n                properties:\n                  discrete:\n                    items:\n                      format: int32\n                      type: integer\n                    type: array\n                  ranges:\n                    items:\n                      description: |-\n                        Range represents a range with a start and an end value.\n                        It is used to define a continuous segment.\n                      properties:\n                        end:\n                          format: int32\n                          type: integer\n                        start:\n                          format: int32\n                          type: integer\n                      required:\n                      - end\n                      - start\n                      type: object\n                    type: array\n                type: object\n              instanceUpdateStrategy:\n                description: Provides fine-grained control over the spec update process\n                  of all instances.\n                properties:\n                  rollingUpdate:\n                    description: Specifies how the rolling update should be applied.\n                    properties:\n                      maxUnavailable:\n                        anyOf:\n                        - type: integer\n                        - type: string\n                        description: |-\n                          The maximum number of instances that can be unavailable during the update.\n                          Value can be an absolute number (ex: 5) or a percentage of desired instances (ex: 10%).\n                          Absolute number is calculated from percentage by rounding up. This can not be 0.\n                          Defaults to 1. The field applies to all instances. That means if there is any unavailable pod,\n                          it will be counted towards MaxUnavailable.\n                        x-kubernetes-int-or-string: true\n                      replicas:\n                        anyOf:\n                        - type: integer\n                        - type: string\n                        description: |-\n                          Indicates the number of instances that should be updated during a rolling update.\n                          The remaining instances will remain untouched. This is helpful in defining how many instances\n                          should participate in the update process.\n                          Value can be an absolute number (ex: 5) or a percentage of desired instances (ex: 10%).\n                          Absolute number is calculated from percentage by rounding up.\n                          The default value is ComponentSpec.Replicas (i.e., update all instances).\n                        x-kubernetes-int-or-string: true\n                    type: object\n                  type:\n                    description: |-\n                      Indicates the type of the update strategy.\n                      Default is RollingUpdate.\n                    enum:\n                    - RollingUpdate\n                    - OnDelete\n                    type: string\n                type: object\n              instances:\n                description: |-\n                  Overrides values in default Template.\n\n\n                  Instance is the fundamental unit managed by KubeBlocks.\n                  It represents a Pod with additional objects such as PVCs, Services, ConfigMaps, etc.\n                  An InstanceSet manages instances with a total count of Replicas,\n                  and by default, all these instances are generated from the same template.\n                  The InstanceTemplate provides a way to override values in the default template,\n                  allowing the InstanceSet to manage instances from different templates.\n\n\n                  The naming convention for instances (pods) based on the InstanceSet Name, InstanceTemplate Name, and ordinal.\n                  The constructed instance name follows the pattern: $(instance_set.name)-$(template.name)-$(ordinal).\n                  By default, the ordinal starts from 0 for each InstanceTemplate.\n                  It is important to ensure that the Name of each InstanceTemplate is unique.\n\n\n                  The sum of replicas across all InstanceTemplates should not exceed the total number of Replicas specified for the InstanceSet.\n                  Any remaining replicas will be generated using the default template and will follow the default naming rules.\n                items:\n                  description: InstanceTemplate allows customization of individual\n                    replica configurations in a Component.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                        Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                      type: object\n                    env:\n                      description: |-\n                        Defines Env to override.\n                        Add new or override existing envs.\n                      items:\n                        description: EnvVar represents an environment variable present\n                          in a Container.\n                        properties:\n                          name:\n                            description: Name of the environment variable. Must be\n                              a C_IDENTIFIER.\n                            type: string\n                          value:\n                            description: |-\n                              Variable references $(VAR_NAME) are expanded\n                              using the previously defined environment variables in the container and\n                              any service environment variables. If a variable cannot be resolved,\n                              the reference in the input string will be unchanged. Double $$ are reduced\n                              to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                              \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                              Escaped references will never be expanded, regardless of whether the variable\n                              exists or not.\n                              Defaults to \"\".\n                            type: string\n                          valueFrom:\n                            description: Source for the environment variable's value.\n                              Cannot be used if value is not empty.\n                            properties:\n                              configMapKeyRef:\n                                description: Selects a key of a ConfigMap.\n                                properties:\n                                  key:\n                                    description: The key to select.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap or\n                                      its key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              fieldRef:\n                                description: |-\n                                  Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                  spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              secretKeyRef:\n                                description: Selects a key of a secret in the pod's\n                                  namespace\n                                properties:\n                                  key:\n                                    description: The key of the secret to select from.  Must\n                                      be a valid secret key.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret or its\n                                      key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    labels:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                        Values for existing keys will be overwritten, and new keys will be added.\n                      type: object\n                    name:\n                      description: |-\n                        Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                        This name is constructed by concatenating the Component's name, the template's name, and the instance's ordinal\n                        using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                        The specified name overrides any default naming conventions or patterns.\n                      maxLength: 54\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    ordinals:\n                      description: |-\n                        Specifies the desired Ordinals of this InstanceTemplate.\n                        The Ordinals used to specify the ordinal of the instance (pod) names to be generated under this InstanceTemplate.\n\n\n                        For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},\n                        then the instance names generated under this InstanceTemplate would be\n                        $(cluster.name)-$(component.name)-$(template.name)-0、$(cluster.name)-$(component.name)-$(template.name)-1 and\n                        $(cluster.name)-$(component.name)-$(template.name)-7\n                      properties:\n                        discrete:\n                          items:\n                            format: int32\n                            type: integer\n                          type: array\n                        ranges:\n                          items:\n                            description: |-\n                              Range represents a range with a start and an end value.\n                              It is used to define a continuous segment.\n                            properties:\n                              end:\n                                format: int32\n                                type: integer\n                              start:\n                                format: int32\n                                type: integer\n                            required:\n                            - end\n                            - start\n                            type: object\n                          type: array\n                      type: object\n                    replicas:\n                      default: 1\n                      description: |-\n                        Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                        This field allows setting how many replicated instances of the Component,\n                        with the specific overrides in the InstanceTemplate, are created.\n                        The default value is 1. A value of 0 disables instance creation.\n                      format: int32\n                      minimum: 0\n                      type: integer\n                    resources:\n                      description: |-\n                        Specifies an override for the resource requirements of the first container in the Pod.\n                        This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                      properties:\n                        claims:\n                          description: |-\n                            Claims lists the names of resources, defined in spec.resourceClaims,\n                            that are used by this container.\n\n\n                            This is an alpha field and requires enabling the\n                            DynamicResourceAllocation feature gate.\n\n\n                            This field is immutable. It can only be set for containers.\n                          items:\n                            description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                            properties:\n                              name:\n                                description: |-\n                                  Name must match the name of one entry in pod.spec.resourceClaims of\n                                  the Pod where this field is used. It makes that resource available\n                                  inside a container.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        limits:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Limits describes the maximum amount of compute resources allowed.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                        requests:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Requests describes the minimum amount of compute resources required.\n                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                      type: object\n                    schedulingPolicy:\n                      description: Specifies the scheduling policy for the Component.\n                      properties:\n                        affinity:\n                          description: Specifies a group of affinity scheduling rules\n                            of the Cluster, including NodeAffinity, PodAffinity, and\n                            PodAntiAffinity.\n                          properties:\n                            nodeAffinity:\n                              description: Describes node affinity scheduling rules\n                                for the pod.\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: |-\n                                      An empty preferred scheduling term matches all objects with implicit weight 0\n                                      (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                    properties:\n                                      preference:\n                                        description: A node selector term, associated\n                                          with the corresponding weight.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      weight:\n                                        description: Weight associated with matching\n                                          the corresponding nodeSelectorTerm, in the\n                                          range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - preference\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to an update), the system\n                                    may or may not try to eventually evict the pod from its node.\n                                  properties:\n                                    nodeSelectorTerms:\n                                      description: Required. A list of node selector\n                                        terms. The terms are ORed.\n                                      items:\n                                        description: |-\n                                          A null or empty node selector term matches no objects. The requirements of\n                                          them are ANDed.\n                                          The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      type: array\n                                  required:\n                                  - nodeSelectorTerms\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                              type: object\n                            podAffinity:\n                              description: Describes pod affinity scheduling rules\n                                (e.g. co-locate this pod in the same node, zone, etc.\n                                as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                            podAntiAffinity:\n                              description: Describes pod anti-affinity scheduling\n                                rules (e.g. avoid putting this pod in the same node,\n                                zone, etc. as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the anti-affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the anti-affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the anti-affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                          type: object\n                        nodeName:\n                          description: |-\n                            NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                            the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                            requirements.\n                          type: string\n                        nodeSelector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            NodeSelector is a selector which must be true for the Pod to fit on a node.\n                            Selector which must match a node's labels for the Pod to be scheduled on that node.\n                            More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        schedulerName:\n                          description: |-\n                            If specified, the Pod will be dispatched by specified scheduler.\n                            If not specified, the Pod will be dispatched by default scheduler.\n                          type: string\n                        tolerations:\n                          description: |-\n                            Allows Pods to be scheduled onto nodes with matching taints.\n                            Each toleration in the array allows the Pod to tolerate node taints based on\n                            specified `key`, `value`, `effect`, and `operator`.\n\n\n                            - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                            - The `operator` determines how the toleration matches the taint.\n\n\n                            Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                          items:\n                            description: |-\n                              The pod this Toleration is attached to tolerates any taint that matches\n                              the triple <key,value,effect> using the matching operator <operator>.\n                            properties:\n                              effect:\n                                description: |-\n                                  Effect indicates the taint effect to match. Empty means match all taint effects.\n                                  When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                type: string\n                              key:\n                                description: |-\n                                  Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                  If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                type: string\n                              operator:\n                                description: |-\n                                  Operator represents a key's relationship to the value.\n                                  Valid operators are Exists and Equal. Defaults to Equal.\n                                  Exists is equivalent to wildcard for value, so that a pod can\n                                  tolerate all taints of a particular category.\n                                type: string\n                              tolerationSeconds:\n                                description: |-\n                                  TolerationSeconds represents the period of time the toleration (which must be\n                                  of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                  it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                  negative values will be treated as 0 (evict immediately) by the system.\n                                format: int64\n                                type: integer\n                              value:\n                                description: |-\n                                  Value is the taint value the toleration matches to.\n                                  If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                type: string\n                            type: object\n                          type: array\n                        topologySpreadConstraints:\n                          description: |-\n                            TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                            domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                            All topologySpreadConstraints are ANDed.\n                          items:\n                            description: TopologySpreadConstraint specifies how to\n                              spread matching pods among the given topology.\n                            properties:\n                              labelSelector:\n                                description: |-\n                                  LabelSelector is used to find matching pods.\n                                  Pods that match this label selector are counted to determine the number of pods\n                                  in their corresponding topology domain.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              matchLabelKeys:\n                                description: |-\n                                  MatchLabelKeys is a set of pod label keys to select the pods over which\n                                  spreading will be calculated. The keys are used to lookup values from the\n                                  incoming pod labels, those key-value labels are ANDed with labelSelector\n                                  to select the group of existing pods over which spreading will be calculated\n                                  for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                  MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                  Keys that don't exist in the incoming pod labels will\n                                  be ignored. A null or empty list means only match against labelSelector.\n\n\n                                  This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              maxSkew:\n                                description: |-\n                                  MaxSkew describes the degree to which pods may be unevenly distributed.\n                                  When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                  between the number of matching pods in the target topology and the global minimum.\n                                  The global minimum is the minimum number of matching pods in an eligible domain\n                                  or zero if the number of eligible domains is less than MinDomains.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 2/2/1:\n                                  In this case, the global minimum is 1.\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |   P   |\n                                  - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                  scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                  violate MaxSkew(1).\n                                  - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                  When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                  to topologies that satisfy it.\n                                  It's a required field. Default value is 1 and 0 is not allowed.\n                                format: int32\n                                type: integer\n                              minDomains:\n                                description: |-\n                                  MinDomains indicates a minimum number of eligible domains.\n                                  When the number of eligible domains with matching topology keys is less than minDomains,\n                                  Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                  And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                  this value has no effect on scheduling.\n                                  As a result, when the number of eligible domains is less than minDomains,\n                                  scheduler won't schedule more than maxSkew Pods to those domains.\n                                  If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                  Valid values are integers greater than 0.\n                                  When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                  For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                  labelSelector spread as 2/2/2:\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |  P P  |\n                                  The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                  In this situation, new pod with the same labelSelector cannot be scheduled,\n                                  because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                  it will violate MaxSkew.\n\n\n                                  This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                format: int32\n                                type: integer\n                              nodeAffinityPolicy:\n                                description: |-\n                                  NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                  when calculating pod topology spread skew. Options are:\n                                  - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                  - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                  If this value is nil, the behavior is equivalent to the Honor policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              nodeTaintsPolicy:\n                                description: |-\n                                  NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                  pod topology spread skew. Options are:\n                                  - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                  has a toleration, are included.\n                                  - Ignore: node taints are ignored. All nodes are included.\n\n\n                                  If this value is nil, the behavior is equivalent to the Ignore policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              topologyKey:\n                                description: |-\n                                  TopologyKey is the key of node labels. Nodes that have a label with this key\n                                  and identical values are considered to be in the same topology.\n                                  We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                  of pods into each bucket.\n                                  We define a domain as a particular instance of a topology.\n                                  Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                  nodeAffinityPolicy and nodeTaintsPolicy.\n                                  e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                  And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                  It's a required field.\n                                type: string\n                              whenUnsatisfiable:\n                                description: |-\n                                  WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                  the spread constraint.\n                                  - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                  - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                    but giving higher precedence to topologies that would help reduce the\n                                    skew.\n                                  A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                  if and only if every possible node assignment for that pod would violate\n                                  \"MaxSkew\" on some topology.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 3/1/1:\n                                  | zone1 | zone2 | zone3 |\n                                  | P P P |   P   |   P   |\n                                  If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                  to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                  MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                  won't make it *more* imbalanced.\n                                  It's a required field.\n                                type: string\n                            required:\n                            - maxSkew\n                            - topologyKey\n                            - whenUnsatisfiable\n                            type: object\n                          type: array\n                      type: object\n                    volumeClaimTemplates:\n                      description: Specifies an override for the storage requirements\n                        of the instances.\n                      items:\n                        description: PersistentVolumeClaim is a user's request for\n                          and claim to a persistent volume\n                        properties:\n                          apiVersion:\n                            description: |-\n                              APIVersion defines the versioned schema of this representation of an object.\n                              Servers should convert recognized schemas to the latest internal value, and\n                              may reject unrecognized values.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n                            type: string\n                          kind:\n                            description: |-\n                              Kind is a string value representing the REST resource this object represents.\n                              Servers may infer this from the endpoint the client submits requests to.\n                              Cannot be updated.\n                              In CamelCase.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                            type: string\n                          metadata:\n                            description: |-\n                              Standard object's metadata.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                type: object\n                              finalizers:\n                                items:\n                                  type: string\n                                type: array\n                              labels:\n                                additionalProperties:\n                                  type: string\n                                type: object\n                              name:\n                                type: string\n                              namespace:\n                                type: string\n                            type: object\n                          spec:\n                            description: |-\n                              spec defines the desired characteristics of a volume requested by a pod author.\n                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                            properties:\n                              accessModes:\n                                description: |-\n                                  accessModes contains the desired access modes the volume should have.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                items:\n                                  type: string\n                                type: array\n                              dataSource:\n                                description: |-\n                                  dataSource field can be used to specify either:\n                                  * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                  * An existing PVC (PersistentVolumeClaim)\n                                  If the provisioner or an external controller can support the specified data source,\n                                  it will create a new volume based on the contents of the specified data source.\n                                  When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                  and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                  If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                properties:\n                                  apiGroup:\n                                    description: |-\n                                      APIGroup is the group for the resource being referenced.\n                                      If APIGroup is not specified, the specified Kind must be in the core API group.\n                                      For any other third-party types, APIGroup is required.\n                                    type: string\n                                  kind:\n                                    description: Kind is the type of resource being\n                                      referenced\n                                    type: string\n                                  name:\n                                    description: Name is the name of resource being\n                                      referenced\n                                    type: string\n                                required:\n                                - kind\n                                - name\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              dataSourceRef:\n                                description: |-\n                                  dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                  volume is desired. This may be any object from a non-empty API group (non\n                                  core object) or a PersistentVolumeClaim object.\n                                  When this field is specified, volume binding will only succeed if the type of\n                                  the specified object matches some installed volume populator or dynamic\n                                  provisioner.\n                                  This field will replace the functionality of the dataSource field and as such\n                                  if both fields are non-empty, they must have the same value. For backwards\n                                  compatibility, when namespace isn't specified in dataSourceRef,\n                                  both fields (dataSource and dataSourceRef) will be set to the same\n                                  value automatically if one of them is empty and the other is non-empty.\n                                  When namespace is specified in dataSourceRef,\n                                  dataSource isn't set to the same value and must be empty.\n                                  There are three important differences between dataSource and dataSourceRef:\n                                  * While dataSource only allows two specific types of objects, dataSourceRef\n                                    allows any non-core object, as well as PersistentVolumeClaim objects.\n                                  * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                    preserves all values, and generates an error if a disallowed value is\n                                    specified.\n                                  * While dataSource only allows local objects, dataSourceRef allows objects\n                                    in any namespaces.\n                                  (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                  (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                properties:\n                                  apiGroup:\n                                    description: |-\n                                      APIGroup is the group for the resource being referenced.\n                                      If APIGroup is not specified, the specified Kind must be in the core API group.\n                                      For any other third-party types, APIGroup is required.\n                                    type: string\n                                  kind:\n                                    description: Kind is the type of resource being\n                                      referenced\n                                    type: string\n                                  name:\n                                    description: Name is the name of resource being\n                                      referenced\n                                    type: string\n                                  namespace:\n                                    description: |-\n                                      Namespace is the namespace of resource being referenced\n                                      Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                      (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                    type: string\n                                required:\n                                - kind\n                                - name\n                                type: object\n                              resources:\n                                description: |-\n                                  resources represents the minimum resources the volume should have.\n                                  If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                  that are lower than previous value but must still be higher than capacity recorded in the\n                                  status field of the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                properties:\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                              selector:\n                                description: selector is a label query over volumes\n                                  to consider for binding.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              storageClassName:\n                                description: |-\n                                  storageClassName is the name of the StorageClass required by the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                type: string\n                              volumeAttributesClassName:\n                                description: |-\n                                  volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                  If specified, the CSI driver will create or update the volume with the attributes defined\n                                  in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                  it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                  will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                  If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                  will be set by the persistentvolume controller if it exists.\n                                  If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                  set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                  exists.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                  (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                type: string\n                              volumeMode:\n                                description: |-\n                                  volumeMode defines what type of volume is required by the claim.\n                                  Value of Filesystem is implied when not included in claim spec.\n                                type: string\n                              volumeName:\n                                description: volumeName is the binding reference to\n                                  the PersistentVolume backing this claim.\n                                type: string\n                            type: object\n                          status:\n                            description: |-\n                              status represents the current information/status of a persistent volume claim.\n                              Read-only.\n                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                            properties:\n                              accessModes:\n                                description: |-\n                                  accessModes contains the actual access modes the volume backing the PVC has.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                items:\n                                  type: string\n                                type: array\n                              allocatedResourceStatuses:\n                                additionalProperties:\n                                  description: |-\n                                    When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource\n                                    that it does not recognizes, then it should ignore that update and let other controllers\n                                    handle it.\n                                  type: string\n                                description: \"allocatedResourceStatuses stores status\n                                  of resource being resized for the given PVC.\\nKey\n                                  names follow standard Kubernetes label syntax. Valid\n                                  values are either:\\n\\t* Un-prefixed keys:\\n\\t\\t-\n                                  storage - the capacity of the volume.\\n\\t* Custom\n                                  resources must use implementation-defined prefixed\n                                  names such as \\\"example.com/my-custom-resource\\\"\\nApart\n                                  from above values - keys that are unprefixed or\n                                  have kubernetes.io prefix are considered\\nreserved\n                                  and hence may not be used.\\n\\n\\nClaimResourceStatus\n                                  can be in any of following states:\\n\\t- ControllerResizeInProgress:\\n\\t\\tState\n                                  set when resize controller starts resizing the volume\n                                  in control-plane.\\n\\t- ControllerResizeFailed:\\n\\t\\tState\n                                  set when resize has failed in resize controller\n                                  with a terminal error.\\n\\t- NodeResizePending:\\n\\t\\tState\n                                  set when resize controller has finished resizing\n                                  the volume but further resizing of\\n\\t\\tvolume is\n                                  needed on the node.\\n\\t- NodeResizeInProgress:\\n\\t\\tState\n                                  set when kubelet starts resizing the volume.\\n\\t-\n                                  NodeResizeFailed:\\n\\t\\tState set when resizing has\n                                  failed in kubelet with a terminal error. Transient\n                                  errors don't set\\n\\t\\tNodeResizeFailed.\\nFor example:\n                                  if expanding a PVC for more capacity - this field\n                                  can be one of the following states:\\n\\t- pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"ControllerResizeInProgress\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"ControllerResizeFailed\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"NodeResizePending\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"NodeResizeInProgress\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"NodeResizeFailed\\\"\\nWhen this field is not set,\n                                  it means that no resize operation is in progress\n                                  for the given PVC.\\n\\n\\nA controller that receives\n                                  PVC update with previously unknown resourceName\n                                  or ClaimResourceStatus\\nshould ignore the update\n                                  for the purpose it was designed. For example - a\n                                  controller that\\nonly is responsible for resizing\n                                  capacity of the volume, should ignore PVC updates\n                                  that change other valid\\nresources associated with\n                                  PVC.\\n\\n\\nThis is an alpha field and requires enabling\n                                  RecoverVolumeExpansionFailure feature.\"\n                                type: object\n                                x-kubernetes-map-type: granular\n                              allocatedResources:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: \"allocatedResources tracks the resources\n                                  allocated to a PVC including its capacity.\\nKey\n                                  names follow standard Kubernetes label syntax. Valid\n                                  values are either:\\n\\t* Un-prefixed keys:\\n\\t\\t-\n                                  storage - the capacity of the volume.\\n\\t* Custom\n                                  resources must use implementation-defined prefixed\n                                  names such as \\\"example.com/my-custom-resource\\\"\\nApart\n                                  from above values - keys that are unprefixed or\n                                  have kubernetes.io prefix are considered\\nreserved\n                                  and hence may not be used.\\n\\n\\nCapacity reported\n                                  here may be larger than the actual capacity when\n                                  a volume expansion operation\\nis requested.\\nFor\n                                  storage quota, the larger value from allocatedResources\n                                  and PVC.spec.resources is used.\\nIf allocatedResources\n                                  is not set, PVC.spec.resources alone is used for\n                                  quota calculation.\\nIf a volume expansion capacity\n                                  request is lowered, allocatedResources is only\\nlowered\n                                  if there are no expansion operations in progress\n                                  and if the actual volume capacity\\nis equal or lower\n                                  than the requested capacity.\\n\\n\\nA controller that\n                                  receives PVC update with previously unknown resourceName\\nshould\n                                  ignore the update for the purpose it was designed.\n                                  For example - a controller that\\nonly is responsible\n                                  for resizing capacity of the volume, should ignore\n                                  PVC updates that change other valid\\nresources associated\n                                  with PVC.\\n\\n\\nThis is an alpha field and requires\n                                  enabling RecoverVolumeExpansionFailure feature.\"\n                                type: object\n                              capacity:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: capacity represents the actual resources\n                                  of the underlying volume.\n                                type: object\n                              conditions:\n                                description: |-\n                                  conditions is the current Condition of persistent volume claim. If underlying persistent volume is being\n                                  resized then the Condition will be set to 'ResizeStarted'.\n                                items:\n                                  description: PersistentVolumeClaimCondition contains\n                                    details about state of pvc\n                                  properties:\n                                    lastProbeTime:\n                                      description: lastProbeTime is the time we probed\n                                        the condition.\n                                      format: date-time\n                                      type: string\n                                    lastTransitionTime:\n                                      description: lastTransitionTime is the time\n                                        the condition transitioned from one status\n                                        to another.\n                                      format: date-time\n                                      type: string\n                                    message:\n                                      description: message is the human-readable message\n                                        indicating details about last transition.\n                                      type: string\n                                    reason:\n                                      description: |-\n                                        reason is a unique, this should be a short, machine understandable string that gives the reason\n                                        for condition's last transition. If it reports \"ResizeStarted\" that means the underlying\n                                        persistent volume is being resized.\n                                      type: string\n                                    status:\n                                      type: string\n                                    type:\n                                      description: PersistentVolumeClaimConditionType\n                                        is a valid value of PersistentVolumeClaimCondition.Type\n                                      type: string\n                                  required:\n                                  - status\n                                  - type\n                                  type: object\n                                type: array\n                              currentVolumeAttributesClassName:\n                                description: |-\n                                  currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using.\n                                  When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim\n                                  This is an alpha field and requires enabling VolumeAttributesClass feature.\n                                type: string\n                              modifyVolumeStatus:\n                                description: |-\n                                  ModifyVolumeStatus represents the status object of ControllerModifyVolume operation.\n                                  When this is unset, there is no ModifyVolume operation being attempted.\n                                  This is an alpha field and requires enabling VolumeAttributesClass feature.\n                                properties:\n                                  status:\n                                    description: \"status is the status of the ControllerModifyVolume\n                                      operation. It can be in any of following states:\\n\n                                      - Pending\\n   Pending indicates that the PersistentVolumeClaim\n                                      cannot be modified due to unmet requirements,\n                                      such as\\n   the specified VolumeAttributesClass\n                                      not existing.\\n - InProgress\\n   InProgress\n                                      indicates that the volume is being modified.\\n\n                                      - Infeasible\\n  Infeasible indicates that the\n                                      request has been rejected as invalid by the\n                                      CSI driver. To\\n\\t  resolve the error, a valid\n                                      VolumeAttributesClass needs to be specified.\\nNote:\n                                      New statuses can be added in the future. Consumers\n                                      should check for unknown statuses and fail appropriately.\"\n                                    type: string\n                                  targetVolumeAttributesClassName:\n                                    description: targetVolumeAttributesClassName is\n                                      the name of the VolumeAttributesClass the PVC\n                                      currently being reconciled\n                                    type: string\n                                required:\n                                - status\n                                type: object\n                              phase:\n                                description: phase represents the current phase of\n                                  PersistentVolumeClaim.\n                                type: string\n                            type: object\n                        type: object\n                      type: array\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              memberUpdateStrategy:\n                description: |-\n                  Members(Pods) update strategy.\n\n\n                  - serial: update Members one by one that guarantee minimum component unavailable time.\n                  - parallel: force parallel\n                  - bestEffortParallel: update Members in parallel that guarantee minimum component un-writable time.\n                enum:\n                - Serial\n                - Parallel\n                - BestEffortParallel\n                type: string\n              membershipReconfiguration:\n                description: Provides actions to do membership dynamic reconfiguration.\n                properties:\n                  switchover:\n                    description: Defines the procedure for a controlled transition\n                      of a role to a new replica.\n                    properties:\n                      exec:\n                        description: |-\n                          Defines the command to run.\n\n\n                          This field cannot be updated.\n                        properties:\n                          args:\n                            description: Args represents the arguments that are passed\n                              to the `command` for execution.\n                            items:\n                              type: string\n                            type: array\n                          command:\n                            description: |-\n                              Specifies the command to be executed inside the container.\n                              The working directory for this command is the container's root directory('/').\n                              Commands are executed directly without a shell environment, meaning shell-specific syntax ('|', etc.) is not supported.\n                              If the shell is required, it must be explicitly invoked in the command.\n\n\n                              A successful execution is indicated by an exit status of 0; any non-zero status signifies a failure.\n                            items:\n                              type: string\n                            type: array\n                          container:\n                            description: |-\n                              Specifies the name of the container within the same pod whose resources will be shared with the action.\n                              This allows the action to utilize the specified container's resources without executing within it.\n\n\n                              The name must match one of the containers defined in `componentDefinition.spec.runtime`.\n\n\n                              The resources that can be shared are included:\n\n\n                              - volume mounts\n\n\n                              This field cannot be updated.\n                            type: string\n                          env:\n                            description: |-\n                              Represents a list of environment variables that will be injected into the container.\n                              These variables enable the container to adapt its behavior based on the environment it's running in.\n\n\n                              This field cannot be updated.\n                            items:\n                              description: EnvVar represents an environment variable\n                                present in a Container.\n                              properties:\n                                name:\n                                  description: Name of the environment variable. Must\n                                    be a C_IDENTIFIER.\n                                  type: string\n                                value:\n                                  description: |-\n                                    Variable references $(VAR_NAME) are expanded\n                                    using the previously defined environment variables in the container and\n                                    any service environment variables. If a variable cannot be resolved,\n                                    the reference in the input string will be unchanged. Double $$ are reduced\n                                    to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                    \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                    Escaped references will never be expanded, regardless of whether the variable\n                                    exists or not.\n                                    Defaults to \"\".\n                                  type: string\n                                valueFrom:\n                                  description: Source for the environment variable's\n                                    value. Cannot be used if value is not empty.\n                                  properties:\n                                    configMapKeyRef:\n                                      description: Selects a key of a ConfigMap.\n                                      properties:\n                                        key:\n                                          description: The key to select.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the ConfigMap\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    fieldRef:\n                                      description: |-\n                                        Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                        spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    secretKeyRef:\n                                      description: Selects a key of a secret in the\n                                        pod's namespace\n                                      properties:\n                                        key:\n                                          description: The key of the secret to select\n                                            from.  Must be a valid secret key.\n                                          type: string\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: Specify whether the Secret\n                                            or its key must be defined\n                                          type: boolean\n                                      required:\n                                      - key\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  type: object\n                              required:\n                              - name\n                              type: object\n                            type: array\n                          image:\n                            description: |-\n                              Specifies the container image to be used for running the Action.\n\n\n                              When specified, a dedicated container will be created using this image to execute the Action.\n                              All actions with same image will share the same container.\n\n\n                              This field cannot be updated.\n                            type: string\n                          matchingKey:\n                            description: |-\n                              Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                              The impact of this field depends on the `targetPodSelector` value:\n\n\n                              - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                              - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                                will be selected for the Action.\n\n\n                              This field cannot be updated.\n                            type: string\n                          targetPodSelector:\n                            description: |-\n                              Defines the criteria used to select the target Pod(s) for executing the Action.\n                              This is useful when there is no default target replica identified.\n                              It allows for precise control over which Pod(s) the Action should run in.\n\n\n                              If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                              to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                              post-provision or pre-terminate of the component.\n\n\n                              This field cannot be updated.\n                            enum:\n                            - Any\n                            - All\n                            - Role\n                            - Ordinal\n                            type: string\n                        type: object\n                      grpc:\n                        description: |-\n                          Defines the gRPC call to issue.\n\n\n                          This field cannot be updated.\n                        properties:\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            description: Name of the method to invoke on the gRPC\n                              service.\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"50051\") or a named port defined in the container spec.\n                            type: string\n                          request:\n                            additionalProperties:\n                              type: string\n                            description: |-\n                              Request payload for the gRPC method.\n\n\n                              Keys are proto field names (lowerCamelCase); values are strings that can include Go templates.\n                              Templates are rendered with predefined action variables before the request is sent.\n                            type: object\n                          response:\n                            description: Required response schema for the gRPC method.\n                            properties:\n                              message:\n                                description: |-\n                                  Name of the field in the response whose value should be output.\n                                  Printed to stdout on success, or stderr on failure.\n                                type: string\n                              status:\n                                description: |-\n                                  Name of the string field in the response that carries status information.\n                                  If non-empty, the action fails.\n                                type: string\n                            type: object\n                          service:\n                            description: Fully-qualified name of the gRPC service\n                              to call.\n                            type: string\n                        required:\n                        - method\n                        - port\n                        - service\n                        type: object\n                      http:\n                        description: |-\n                          Defines the HTTP request to perform.\n\n\n                          This field cannot be updated.\n                        properties:\n                          body:\n                            description: |-\n                              Optional HTTP request body.\n\n\n                              Supports Go text/template syntax; rendered with predefined variables before sending.\n                            type: string\n                          headers:\n                            description: |-\n                              Custom headers to set in the request.\n                              Header values may use Go text/template syntax, rendered with predefined variables.\n                            items:\n                              description: HTTPHeader represents a single HTTP header\n                                key/value pair.\n                              properties:\n                                name:\n                                  description: Name of the header field.\n                                  type: string\n                                value:\n                                  description: Value of the header field.\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          host:\n                            description: |-\n                              The target host to connect to.\n                              Defaults to \"127.0.0.1\" if not specified.\n                            type: string\n                          method:\n                            default: GET\n                            description: |-\n                              The HTTP method to use.\n                              Defaults to \"GET\".\n                            enum:\n                            - GET\n                            - POST\n                            - PUT\n                            - DELETE\n                            - HEAD\n                            - PATCH\n                            type: string\n                          path:\n                            default: /\n                            description: |-\n                              The path to request on the HTTP server.\n                              Defaults to \"/\" if not specified.\n                            pattern: ^/.*\n                            type: string\n                          port:\n                            description: |-\n                              The port to access on the host.\n                              It may be a numeric string (e.g., \"8080\") or a named port defined in the container spec.\n                            type: string\n                          scheme:\n                            default: HTTP\n                            description: |-\n                              The scheme to use for connecting to the host.\n                              Defaults to \"HTTP\".\n                            enum:\n                            - HTTP\n                            - HTTPS\n                            type: string\n                        required:\n                        - port\n                        type: object\n                      matchingKey:\n                        description: |-\n                          Used in conjunction with the `targetPodSelector` field to refine the selection of target pod(s) for Action execution.\n                          The impact of this field depends on the `targetPodSelector` value:\n\n\n                          - When `targetPodSelector` is set to `Any` or `All`, this field will be ignored.\n                          - When `targetPodSelector` is set to `Role`, only those replicas whose role matches the `matchingKey`\n                            will be selected for the Action.\n\n\n                          This field cannot be updated.\n                        type: string\n                      preCondition:\n                        description: |-\n                          Specifies the state that the cluster must reach before the Action is executed.\n                          Currently, this is only applicable to the `postProvision` action.\n\n\n                          The conditions are as follows:\n\n\n                          - `Immediately`: Executed right after the Component object is created.\n                            The readiness of the Component and its resources is not guaranteed at this stage.\n                          - `RuntimeReady`: The Action is triggered after the Component object has been created and all associated\n                            runtime resources (e.g. Pods) are in a ready state.\n                          - `ComponentReady`: The Action is triggered after the Component itself is in a ready state.\n                            This process does not affect the readiness state of the Component or the Cluster.\n                          - `ClusterReady`: The Action is executed after the Cluster is in a ready state.\n                            This execution does not alter the Component or the Cluster's state of readiness.\n\n\n                          This field cannot be updated.\n                        type: string\n                      retryPolicy:\n                        description: |-\n                          Defines the strategy to be taken when retrying the Action after a failure.\n\n\n                          It specifies the conditions under which the Action should be retried and the limits to apply,\n                          such as the maximum number of retries and backoff strategy.\n\n\n                          This field cannot be updated.\n                        properties:\n                          maxRetries:\n                            default: 0\n                            description: |-\n                              Defines the maximum number of retry attempts that should be made for a given Action.\n                              This value is set to 0 by default, indicating that no retries will be made.\n                            type: integer\n                          retryInterval:\n                            default: 0\n                            description: |-\n                              Indicates the duration of time to wait between each retry attempt.\n                              This value is set to 0 by default, indicating that there will be no delay between retry attempts.\n                            format: int64\n                            type: integer\n                        type: object\n                      targetPodSelector:\n                        description: |-\n                          Defines the criteria used to select the target Pod(s) for executing the Action.\n                          This is useful when there is no default target replica identified.\n                          It allows for precise control over which Pod(s) the Action should run in.\n\n\n                          If not specified, the Action will be executed in the pod where the Action is triggered, such as the pod\n                          to be removed or added; or a random pod if the Action is triggered at the component level, such as\n                          post-provision or pre-terminate of the component.\n\n\n                          This field cannot be updated.\n                        enum:\n                        - Any\n                        - All\n                        - Role\n                        - Ordinal\n                        type: string\n                      timeoutSeconds:\n                        default: 0\n                        description: |-\n                          Specifies the maximum duration in seconds that the Action is allowed to run.\n\n\n                          If the Action does not complete within this time frame, it will be terminated.\n\n\n                          This field cannot be updated.\n                        format: int32\n                        type: integer\n                    type: object\n                type: object\n              minReadySeconds:\n                default: 0\n                description: |-\n                  Defines the minimum number of seconds a newly created pod should be ready\n                  without any of its container crashing to be considered available.\n                  Defaults to 0, meaning the pod will be considered available as soon as it is ready.\n                format: int32\n                minimum: 0\n                type: integer\n              offlineInstances:\n                description: |-\n                  Specifies the names of instances to be transitioned to offline status.\n\n\n                  Marking an instance as offline results in the following:\n\n\n                  1. The associated pod is stopped, and its PersistentVolumeClaim (PVC) is retained for potential\n                     future reuse or data recovery, but it is no longer actively used.\n                  2. The ordinal number assigned to this instance is preserved, ensuring it remains unique\n                     and avoiding conflicts with new instances.\n\n\n                  Setting instances to offline allows for a controlled scale-in process, preserving their data and maintaining\n                  ordinal consistency within the cluster.\n                  Note that offline instances and their associated resources, such as PVCs, are not automatically deleted.\n                  The cluster administrator must manually manage the cleanup and removal of these resources when they are no longer needed.\n                items:\n                  type: string\n                type: array\n              parallelPodManagementConcurrency:\n                anyOf:\n                - type: integer\n                - type: string\n                description: |-\n                  Controls the concurrency of pods during initial scale up, when replacing pods on nodes,\n                  or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.\n                  The default Concurrency is 100%.\n                x-kubernetes-int-or-string: true\n              paused:\n                description: Indicates that the InstanceSet is paused, meaning the\n                  reconciliation of this InstanceSet object will be paused.\n                type: boolean\n              persistentVolumeClaimRetentionPolicy:\n                description: |-\n                  persistentVolumeClaimRetentionPolicy describes the lifecycle of persistent\n                  volume claims created from volumeClaimTemplates. By default, all persistent\n                  volume claims are created as needed and retained until manually deleted. This\n                  policy allows the lifecycle to be altered, for example by deleting persistent\n                  volume claims when their workload is deleted, or when their pod is scaled\n                  down.\n                properties:\n                  whenDeleted:\n                    description: |-\n                      WhenDeleted specifies what happens to PVCs created from VolumeClaimTemplates when the workload is deleted.\n                      The `Retain` policy causes PVCs to not be affected by workload deletion.\n                      The default policy of `Delete` causes those PVCs to be deleted.\n                    enum:\n                    - Retain\n                    - Delete\n                    type: string\n                  whenScaled:\n                    description: |-\n                      WhenScaled specifies what happens to PVCs created from VolumeClaimTemplates when the workload is scaled down.\n                      The `Retain` policy causes PVCs to not be affected by a scale down.\n                      The default policy of `Delete` causes the associated PVCs for pods scaled down to be deleted.\n                    enum:\n                    - Retain\n                    - Delete\n                    type: string\n                type: object\n              podManagementPolicy:\n                description: |-\n                  Controls how pods are created during initial scale up,\n                  when replacing pods on nodes, or when scaling down.\n\n\n                  The default policy is `OrderedReady`, where pods are created in increasing order and the controller waits until each pod is ready before\n                  continuing. When scaling down, the pods are removed in the opposite order.\n                  The alternative policy is `Parallel` which will create pods in parallel\n                  to match the desired scale without waiting, and on scale down will delete\n                  all pods at once.\n\n\n                  Note: This field will be removed in future version.\n                type: string\n              podUpdatePolicy:\n                description: |-\n                  PodUpdatePolicy indicates how pods should be updated\n\n\n                  - `StrictInPlace` indicates that only allows in-place upgrades.\n                  Any attempt to modify other fields will be rejected.\n                  - `PreferInPlace` indicates that we will first attempt an in-place upgrade of the Pod.\n                  If that fails, it will fall back to the ReCreate, where pod will be recreated.\n                  Default value is \"PreferInPlace\"\n                type: string\n              replicas:\n                default: 1\n                description: |-\n                  Specifies the desired number of replicas of the given Template.\n                  These replicas are instantiations of the same Template, with each having a consistent identity.\n                  Defaults to 1 if unspecified.\n                format: int32\n                minimum: 0\n                type: integer\n              roles:\n                description: A list of roles defined in the system. Instanceset obtains\n                  role through pods' role label `kubeblocks.io/role`.\n                items:\n                  description: ReplicaRole represents a role that can be assigned\n                    to a component instance, defining its behavior and responsibilities.\n                  properties:\n                    name:\n                      description: |-\n                        Name defines the role's unique identifier. This value is used to set the \"apps.kubeblocks.io/role\" label\n                        on the corresponding object to identify its role.\n\n\n                        For example, common role names include:\n                        - \"leader\": The primary/master instance that handles write operations\n                        - \"follower\": Secondary/replica instances that replicate data from the leader\n                        - \"learner\": Read-only instances that don't participate in elections\n\n\n                        This field is immutable once set.\n                      maxLength: 32\n                      pattern: ^.*[^\\s]+.*$\n                      type: string\n                    participatesInQuorum:\n                      default: false\n                      description: |-\n                        ParticipatesInQuorum indicates if pods with this role are counted when determining quorum.\n                        This affects update strategies that need to maintain quorum for availability. Roles participate\n                        in quorum should have higher update priority than roles do not participate in quorum.\n                        The default value is false.\n\n\n                        For example, in a 5-pod component where:\n                        - 2 learner pods (participatesInQuorum=false)\n                        - 2 follower pods (participatesInQuorum=true)\n                        - 1 leader pod (participatesInQuorum=true)\n                        The quorum size would be 3 (based on the 3 participating pods), allowing parallel updates\n                        of 2 learners and 1 follower while maintaining quorum.\n\n\n                        This field is immutable once set.\n                      type: boolean\n                    updatePriority:\n                      default: 0\n                      description: |-\n                        UpdatePriority determines the order in which pods with different roles are updated.\n                        Pods are sorted by this priority (higher numbers = higher priority) and updated accordingly.\n                        Roles with the highest priority will be updated last.\n                        The default priority is 0.\n\n\n                        For example:\n                        - Leader role may have priority 2 (updated last)\n                        - Follower role may have priority 1 (updated before leader)\n                        - Learner role may have priority 0 (updated first)\n\n\n                        This field is immutable once set.\n                      type: integer\n                  required:\n                  - name\n                  type: object\n                type: array\n              selector:\n                description: |-\n                  Represents a label query over pods that should match the desired replica count indicated by the `replica` field.\n                  It must match the labels defined in the pod template.\n                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors\n                properties:\n                  matchExpressions:\n                    description: matchExpressions is a list of label selector requirements.\n                      The requirements are ANDed.\n                    items:\n                      description: |-\n                        A label selector requirement is a selector that contains values, a key, and an operator that\n                        relates the key and values.\n                      properties:\n                        key:\n                          description: key is the label key that the selector applies\n                            to.\n                          type: string\n                        operator:\n                          description: |-\n                            operator represents a key's relationship to a set of values.\n                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                          type: string\n                        values:\n                          description: |-\n                            values is an array of string values. If the operator is In or NotIn,\n                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                            the values array must be empty. This array is replaced during a strategic\n                            merge patch.\n                          items:\n                            type: string\n                          type: array\n                      required:\n                      - key\n                      - operator\n                      type: object\n                    type: array\n                  matchLabels:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                    type: object\n                type: object\n                x-kubernetes-map-type: atomic\n              template:\n                description: PodTemplateSpec describes the data a pod should have\n                  when created from a template\n                properties:\n                  metadata:\n                    description: |-\n                      Standard object's metadata.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata\n                    properties:\n                      annotations:\n                        additionalProperties:\n                          type: string\n                        type: object\n                      finalizers:\n                        items:\n                          type: string\n                        type: array\n                      labels:\n                        additionalProperties:\n                          type: string\n                        type: object\n                      name:\n                        type: string\n                      namespace:\n                        type: string\n                    type: object\n                  spec:\n                    description: |-\n                      Specification of the desired behavior of the pod.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                    properties:\n                      activeDeadlineSeconds:\n                        description: |-\n                          Optional duration in seconds the pod may be active on the node relative to\n                          StartTime before the system will actively try to mark it failed and kill associated containers.\n                          Value must be a positive integer.\n                        format: int64\n                        type: integer\n                      affinity:\n                        description: If specified, the pod's scheduling constraints\n                        properties:\n                          nodeAffinity:\n                            description: Describes node affinity scheduling rules\n                              for the pod.\n                            properties:\n                              preferredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  The scheduler will prefer to schedule pods to nodes that satisfy\n                                  the affinity expressions specified by this field, but it may choose\n                                  a node that violates one or more of the expressions. The node that is\n                                  most preferred is the one with the greatest sum of weights, i.e.\n                                  for each node that meets all of the scheduling requirements (resource\n                                  request, requiredDuringScheduling affinity expressions, etc.),\n                                  compute a sum by iterating through the elements of this field and adding\n                                  \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                  node(s) with the highest sum are the most preferred.\n                                items:\n                                  description: |-\n                                    An empty preferred scheduling term matches all objects with implicit weight 0\n                                    (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                  properties:\n                                    preference:\n                                      description: A node selector term, associated\n                                        with the corresponding weight.\n                                      properties:\n                                        matchExpressions:\n                                          description: A list of node selector requirements\n                                            by node's labels.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchFields:\n                                          description: A list of node selector requirements\n                                            by node's fields.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    weight:\n                                      description: Weight associated with matching\n                                        the corresponding nodeSelectorTerm, in the\n                                        range 1-100.\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - preference\n                                  - weight\n                                  type: object\n                                type: array\n                              requiredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  If the affinity requirements specified by this field are not met at\n                                  scheduling time, the pod will not be scheduled onto the node.\n                                  If the affinity requirements specified by this field cease to be met\n                                  at some point during pod execution (e.g. due to an update), the system\n                                  may or may not try to eventually evict the pod from its node.\n                                properties:\n                                  nodeSelectorTerms:\n                                    description: Required. A list of node selector\n                                      terms. The terms are ORed.\n                                    items:\n                                      description: |-\n                                        A null or empty node selector term matches no objects. The requirements of\n                                        them are ANDed.\n                                        The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                      properties:\n                                        matchExpressions:\n                                          description: A list of node selector requirements\n                                            by node's labels.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchFields:\n                                          description: A list of node selector requirements\n                                            by node's fields.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    type: array\n                                required:\n                                - nodeSelectorTerms\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          podAffinity:\n                            description: Describes pod affinity scheduling rules (e.g.\n                              co-locate this pod in the same node, zone, etc. as some\n                              other pod(s)).\n                            properties:\n                              preferredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  The scheduler will prefer to schedule pods to nodes that satisfy\n                                  the affinity expressions specified by this field, but it may choose\n                                  a node that violates one or more of the expressions. The node that is\n                                  most preferred is the one with the greatest sum of weights, i.e.\n                                  for each node that meets all of the scheduling requirements (resource\n                                  request, requiredDuringScheduling affinity expressions, etc.),\n                                  compute a sum by iterating through the elements of this field and adding\n                                  \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                  node(s) with the highest sum are the most preferred.\n                                items:\n                                  description: The weights of all of the matched WeightedPodAffinityTerm\n                                    fields are added per-node to find the most preferred\n                                    node(s)\n                                  properties:\n                                    podAffinityTerm:\n                                      description: Required. A pod affinity term,\n                                        associated with the corresponding weight.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            A label query over a set of resources, in this case pods.\n                                            If it's null, this PodAffinityTerm matches with no Pods.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        mismatchLabelKeys:\n                                          description: |-\n                                            MismatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                            Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        namespaceSelector:\n                                          description: |-\n                                            A label query over the set of namespaces that the term applies to.\n                                            The term is applied to the union of the namespaces selected by this field\n                                            and the ones listed in the namespaces field.\n                                            null selector and null or empty namespaces list means \"this pod's namespace\".\n                                            An empty selector ({}) matches all namespaces.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        namespaces:\n                                          description: |-\n                                            namespaces specifies a static list of namespace names that the term applies to.\n                                            The term is applied to the union of the namespaces listed in this field\n                                            and the ones selected by namespaceSelector.\n                                            null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                          items:\n                                            type: string\n                                          type: array\n                                        topologyKey:\n                                          description: |-\n                                            This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                            the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                            whose value of the label with key topologyKey matches that of any node on which any of the\n                                            selected pods is running.\n                                            Empty topologyKey is not allowed.\n                                          type: string\n                                      required:\n                                      - topologyKey\n                                      type: object\n                                    weight:\n                                      description: |-\n                                        weight associated with matching the corresponding podAffinityTerm,\n                                        in the range 1-100.\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - podAffinityTerm\n                                  - weight\n                                  type: object\n                                type: array\n                              requiredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  If the affinity requirements specified by this field are not met at\n                                  scheduling time, the pod will not be scheduled onto the node.\n                                  If the affinity requirements specified by this field cease to be met\n                                  at some point during pod execution (e.g. due to a pod label update), the\n                                  system may or may not try to eventually evict the pod from its node.\n                                  When there are multiple elements, the lists of nodes corresponding to each\n                                  podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                items:\n                                  description: |-\n                                    Defines a set of pods (namely those matching the labelSelector\n                                    relative to the given namespace(s)) that this pod should be\n                                    co-located (affinity) or not co-located (anti-affinity) with,\n                                    where co-located is defined as running on a node whose value of\n                                    the label with key <topologyKey> matches that of any node on which\n                                    a pod of the set of pods is running\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                type: array\n                            type: object\n                          podAntiAffinity:\n                            description: Describes pod anti-affinity scheduling rules\n                              (e.g. avoid putting this pod in the same node, zone,\n                              etc. as some other pod(s)).\n                            properties:\n                              preferredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  The scheduler will prefer to schedule pods to nodes that satisfy\n                                  the anti-affinity expressions specified by this field, but it may choose\n                                  a node that violates one or more of the expressions. The node that is\n                                  most preferred is the one with the greatest sum of weights, i.e.\n                                  for each node that meets all of the scheduling requirements (resource\n                                  request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                  compute a sum by iterating through the elements of this field and adding\n                                  \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                  node(s) with the highest sum are the most preferred.\n                                items:\n                                  description: The weights of all of the matched WeightedPodAffinityTerm\n                                    fields are added per-node to find the most preferred\n                                    node(s)\n                                  properties:\n                                    podAffinityTerm:\n                                      description: Required. A pod affinity term,\n                                        associated with the corresponding weight.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            A label query over a set of resources, in this case pods.\n                                            If it's null, this PodAffinityTerm matches with no Pods.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        mismatchLabelKeys:\n                                          description: |-\n                                            MismatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                            Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        namespaceSelector:\n                                          description: |-\n                                            A label query over the set of namespaces that the term applies to.\n                                            The term is applied to the union of the namespaces selected by this field\n                                            and the ones listed in the namespaces field.\n                                            null selector and null or empty namespaces list means \"this pod's namespace\".\n                                            An empty selector ({}) matches all namespaces.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        namespaces:\n                                          description: |-\n                                            namespaces specifies a static list of namespace names that the term applies to.\n                                            The term is applied to the union of the namespaces listed in this field\n                                            and the ones selected by namespaceSelector.\n                                            null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                          items:\n                                            type: string\n                                          type: array\n                                        topologyKey:\n                                          description: |-\n                                            This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                            the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                            whose value of the label with key topologyKey matches that of any node on which any of the\n                                            selected pods is running.\n                                            Empty topologyKey is not allowed.\n                                          type: string\n                                      required:\n                                      - topologyKey\n                                      type: object\n                                    weight:\n                                      description: |-\n                                        weight associated with matching the corresponding podAffinityTerm,\n                                        in the range 1-100.\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - podAffinityTerm\n                                  - weight\n                                  type: object\n                                type: array\n                              requiredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  If the anti-affinity requirements specified by this field are not met at\n                                  scheduling time, the pod will not be scheduled onto the node.\n                                  If the anti-affinity requirements specified by this field cease to be met\n                                  at some point during pod execution (e.g. due to a pod label update), the\n                                  system may or may not try to eventually evict the pod from its node.\n                                  When there are multiple elements, the lists of nodes corresponding to each\n                                  podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                items:\n                                  description: |-\n                                    Defines a set of pods (namely those matching the labelSelector\n                                    relative to the given namespace(s)) that this pod should be\n                                    co-located (affinity) or not co-located (anti-affinity) with,\n                                    where co-located is defined as running on a node whose value of\n                                    the label with key <topologyKey> matches that of any node on which\n                                    a pod of the set of pods is running\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                type: array\n                            type: object\n                        type: object\n                      automountServiceAccountToken:\n                        description: AutomountServiceAccountToken indicates whether\n                          a service account token should be automatically mounted.\n                        type: boolean\n                      containers:\n                        description: |-\n                          List of containers belonging to the pod.\n                          Containers cannot currently be added or removed.\n                          There must be at least one container in a Pod.\n                          Cannot be updated.\n                        items:\n                          description: A single application container that you want\n                            to run within a pod.\n                          properties:\n                            args:\n                              description: |-\n                                Arguments to the entrypoint.\n                                The container image's CMD is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: |-\n                                Entrypoint array. Not executed within a shell.\n                                The container image's ENTRYPOINT is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            env:\n                              description: |-\n                                List of environment variables to set in the container.\n                                Cannot be updated.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            envFrom:\n                              description: |-\n                                List of sources to populate environment variables in the container.\n                                The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                will be reported as an event when the container is starting. When a key exists in multiple\n                                sources, the value associated with the last source will take precedence.\n                                Values defined by an Env with a duplicate key will take precedence.\n                                Cannot be updated.\n                              items:\n                                description: EnvFromSource represents the source of\n                                  a set of ConfigMaps\n                                properties:\n                                  configMapRef:\n                                    description: The ConfigMap to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  prefix:\n                                    description: An optional identifier to prepend\n                                      to each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                    type: string\n                                  secretRef:\n                                    description: The Secret to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret must\n                                          be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                              type: array\n                            image:\n                              description: |-\n                                Container image name.\n                                More info: https://kubernetes.io/docs/concepts/containers/images\n                                This field is optional to allow higher level config management to default or override\n                                container images in workload controllers like Deployments and StatefulSets.\n                              type: string\n                            imagePullPolicy:\n                              description: |-\n                                Image pull policy.\n                                One of Always, Never, IfNotPresent.\n                                Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                              type: string\n                            lifecycle:\n                              description: |-\n                                Actions that the management system should take in response to container lifecycle events.\n                                Cannot be updated.\n                              properties:\n                                postStart:\n                                  description: |-\n                                    PostStart is called immediately after a container is created. If the handler fails,\n                                    the container is terminated and restarted according to its restart policy.\n                                    Other management of the container blocks until the hook completes.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                                preStop:\n                                  description: |-\n                                    PreStop is called immediately before a container is terminated due to an\n                                    API request or management event such as liveness/startup probe failure,\n                                    preemption, resource contention, etc. The handler is not called if the\n                                    container crashes or exits. The Pod's termination grace period countdown begins before the\n                                    PreStop hook is executed. Regardless of the outcome of the handler, the\n                                    container will eventually terminate within the Pod's termination grace\n                                    period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                    or until the termination grace period is reached.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                              type: object\n                            livenessProbe:\n                              description: |-\n                                Periodic probe of container liveness.\n                                Container will be restarted if the probe fails.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            name:\n                              description: |-\n                                Name of the container specified as a DNS_LABEL.\n                                Each container in a pod must have a unique name (DNS_LABEL).\n                                Cannot be updated.\n                              type: string\n                            ports:\n                              description: |-\n                                List of ports to expose from the container. Not specifying a port here\n                                DOES NOT prevent that port from being exposed. Any port which is\n                                listening on the default \"0.0.0.0\" address inside a container will be\n                                accessible from the network.\n                                Modifying this array with strategic merge patch may corrupt the data.\n                                For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                                Cannot be updated.\n                              items:\n                                description: ContainerPort represents a network port\n                                  in a single container.\n                                properties:\n                                  containerPort:\n                                    description: |-\n                                      Number of port to expose on the pod's IP address.\n                                      This must be a valid port number, 0 < x < 65536.\n                                    format: int32\n                                    type: integer\n                                  hostIP:\n                                    description: What host IP to bind the external\n                                      port to.\n                                    type: string\n                                  hostPort:\n                                    description: |-\n                                      Number of port to expose on the host.\n                                      If specified, this must be a valid port number, 0 < x < 65536.\n                                      If HostNetwork is specified, this must match ContainerPort.\n                                      Most containers do not need this.\n                                    format: int32\n                                    type: integer\n                                  name:\n                                    description: |-\n                                      If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                      named port in a pod must have a unique name. Name for the port that can be\n                                      referred to by services.\n                                    type: string\n                                  protocol:\n                                    default: TCP\n                                    description: |-\n                                      Protocol for port. Must be UDP, TCP, or SCTP.\n                                      Defaults to \"TCP\".\n                                    type: string\n                                required:\n                                - containerPort\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - containerPort\n                              - protocol\n                              x-kubernetes-list-type: map\n                            readinessProbe:\n                              description: |-\n                                Periodic probe of container service readiness.\n                                Container will be removed from service endpoints if the probe fails.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            resizePolicy:\n                              description: Resources resize policy for the container.\n                              items:\n                                description: ContainerResizePolicy represents resource\n                                  resize policy for the container.\n                                properties:\n                                  resourceName:\n                                    description: |-\n                                      Name of the resource to which this resource resize policy applies.\n                                      Supported values: cpu, memory.\n                                    type: string\n                                  restartPolicy:\n                                    description: |-\n                                      Restart policy to apply when specified resource is resized.\n                                      If not specified, it defaults to NotRequired.\n                                    type: string\n                                required:\n                                - resourceName\n                                - restartPolicy\n                                type: object\n                              type: array\n                              x-kubernetes-list-type: atomic\n                            resources:\n                              description: |-\n                                Compute Resources required by this container.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              properties:\n                                claims:\n                                  description: |-\n                                    Claims lists the names of resources, defined in spec.resourceClaims,\n                                    that are used by this container.\n\n\n                                    This is an alpha field and requires enabling the\n                                    DynamicResourceAllocation feature gate.\n\n\n                                    This field is immutable. It can only be set for containers.\n                                  items:\n                                    description: ResourceClaim references one entry\n                                      in PodSpec.ResourceClaims.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name must match the name of one entry in pod.spec.resourceClaims of\n                                          the Pod where this field is used. It makes that resource available\n                                          inside a container.\n                                        type: string\n                                    required:\n                                    - name\n                                    type: object\n                                  type: array\n                                  x-kubernetes-list-map-keys:\n                                  - name\n                                  x-kubernetes-list-type: map\n                                limits:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Limits describes the maximum amount of compute resources allowed.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                                requests:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Requests describes the minimum amount of compute resources required.\n                                    If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                    otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                              type: object\n                            restartPolicy:\n                              description: |-\n                                RestartPolicy defines the restart behavior of individual containers in a pod.\n                                This field may only be set for init containers, and the only allowed value is \"Always\".\n                                For non-init containers or when this field is not specified,\n                                the restart behavior is defined by the Pod's restart policy and the container type.\n                                Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                                this init container will be continually restarted on\n                                exit until all regular containers have terminated. Once all regular\n                                containers have completed, all init containers with restartPolicy \"Always\"\n                                will be shut down. This lifecycle differs from normal init containers and\n                                is often referred to as a \"sidecar\" container. Although this init\n                                container still starts in the init container sequence, it does not wait\n                                for the container to complete before proceeding to the next init\n                                container. Instead, the next init container starts immediately after this\n                                init container is started, or after any startupProbe has successfully\n                                completed.\n                              type: string\n                            securityContext:\n                              description: |-\n                                SecurityContext defines the security options the container should be run with.\n                                If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                              properties:\n                                allowPrivilegeEscalation:\n                                  description: |-\n                                    AllowPrivilegeEscalation controls whether a process can gain more\n                                    privileges than its parent process. This bool directly controls if\n                                    the no_new_privs flag will be set on the container process.\n                                    AllowPrivilegeEscalation is true always when the container is:\n                                    1) run as Privileged\n                                    2) has CAP_SYS_ADMIN\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                capabilities:\n                                  description: |-\n                                    The capabilities to add/drop when running containers.\n                                    Defaults to the default set of capabilities granted by the container runtime.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    add:\n                                      description: Added capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                    drop:\n                                      description: Removed capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                  type: object\n                                privileged:\n                                  description: |-\n                                    Run container in privileged mode.\n                                    Processes in privileged containers are essentially equivalent to root on the host.\n                                    Defaults to false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                procMount:\n                                  description: |-\n                                    procMount denotes the type of proc mount to use for the containers.\n                                    The default is DefaultProcMount which uses the container runtime defaults for\n                                    readonly paths and masked paths.\n                                    This requires the ProcMountType feature flag to be enabled.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: string\n                                readOnlyRootFilesystem:\n                                  description: |-\n                                    Whether this container has a read-only root filesystem.\n                                    Default is false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                runAsGroup:\n                                  description: |-\n                                    The GID to run the entrypoint of the container process.\n                                    Uses runtime default if unset.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                runAsNonRoot:\n                                  description: |-\n                                    Indicates that the container must run as a non-root user.\n                                    If true, the Kubelet will validate the image at runtime to ensure that it\n                                    does not run as UID 0 (root) and fail to start the container if it does.\n                                    If unset or false, no such validation will be performed.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: boolean\n                                runAsUser:\n                                  description: |-\n                                    The UID to run the entrypoint of the container process.\n                                    Defaults to user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                seLinuxOptions:\n                                  description: |-\n                                    The SELinux context to be applied to the container.\n                                    If unspecified, the container runtime will allocate a random SELinux context for each\n                                    container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    level:\n                                      description: Level is SELinux level label that\n                                        applies to the container.\n                                      type: string\n                                    role:\n                                      description: Role is a SELinux role label that\n                                        applies to the container.\n                                      type: string\n                                    type:\n                                      description: Type is a SELinux type label that\n                                        applies to the container.\n                                      type: string\n                                    user:\n                                      description: User is a SELinux user label that\n                                        applies to the container.\n                                      type: string\n                                  type: object\n                                seccompProfile:\n                                  description: |-\n                                    The seccomp options to use by this container. If seccomp options are\n                                    provided at both the pod & container level, the container options\n                                    override the pod options.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    localhostProfile:\n                                      description: |-\n                                        localhostProfile indicates a profile defined in a file on the node should be used.\n                                        The profile must be preconfigured on the node to work.\n                                        Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                        Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                      type: string\n                                    type:\n                                      description: |-\n                                        type indicates which kind of seccomp profile will be applied.\n                                        Valid options are:\n\n\n                                        Localhost - a profile defined in a file on the node should be used.\n                                        RuntimeDefault - the container runtime default profile should be used.\n                                        Unconfined - no profile should be applied.\n                                      type: string\n                                  required:\n                                  - type\n                                  type: object\n                                windowsOptions:\n                                  description: |-\n                                    The Windows specific settings applied to all containers.\n                                    If unspecified, the options from the PodSecurityContext will be used.\n                                    If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is linux.\n                                  properties:\n                                    gmsaCredentialSpec:\n                                      description: |-\n                                        GMSACredentialSpec is where the GMSA admission webhook\n                                        (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                        GMSA credential spec named by the GMSACredentialSpecName field.\n                                      type: string\n                                    gmsaCredentialSpecName:\n                                      description: GMSACredentialSpecName is the name\n                                        of the GMSA credential spec to use.\n                                      type: string\n                                    hostProcess:\n                                      description: |-\n                                        HostProcess determines if a container should be run as a 'Host Process' container.\n                                        All of a Pod's containers must have the same effective HostProcess value\n                                        (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                        In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                      type: boolean\n                                    runAsUserName:\n                                      description: |-\n                                        The UserName in Windows to run the entrypoint of the container process.\n                                        Defaults to the user specified in image metadata if unspecified.\n                                        May also be set in PodSecurityContext. If set in both SecurityContext and\n                                        PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      type: string\n                                  type: object\n                              type: object\n                            startupProbe:\n                              description: |-\n                                StartupProbe indicates that the Pod has successfully initialized.\n                                If specified, no other probes are executed until this completes successfully.\n                                If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                                This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                                when it might take a long time to load data or warm a cache, than during steady-state operation.\n                                This cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            stdin:\n                              description: |-\n                                Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                is not set, reads from stdin in the container will always result in EOF.\n                                Default is false.\n                              type: boolean\n                            stdinOnce:\n                              description: |-\n                                Whether the container runtime should close the stdin channel after it has been opened by\n                                a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                at which time stdin is closed and remains closed until the container is restarted. If this\n                                flag is false, a container processes that reads from stdin will never receive an EOF.\n                                Default is false\n                              type: boolean\n                            terminationMessagePath:\n                              description: |-\n                                Optional: Path at which the file to which the container's termination message\n                                will be written is mounted into the container's filesystem.\n                                Message written is intended to be brief final status, such as an assertion failure message.\n                                Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                all containers will be limited to 12kb.\n                                Defaults to /dev/termination-log.\n                                Cannot be updated.\n                              type: string\n                            terminationMessagePolicy:\n                              description: |-\n                                Indicate how the termination message should be populated. File will use the contents of\n                                terminationMessagePath to populate the container status message on both success and failure.\n                                FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                message file is empty and the container exited with an error.\n                                The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                Defaults to File.\n                                Cannot be updated.\n                              type: string\n                            tty:\n                              description: |-\n                                Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                Default is false.\n                              type: boolean\n                            volumeDevices:\n                              description: volumeDevices is the list of block devices\n                                to be used by the container.\n                              items:\n                                description: volumeDevice describes a mapping of a\n                                  raw block device within a container.\n                                properties:\n                                  devicePath:\n                                    description: devicePath is the path inside of\n                                      the container that the device will be mapped\n                                      to.\n                                    type: string\n                                  name:\n                                    description: name must match the name of a persistentVolumeClaim\n                                      in the pod\n                                    type: string\n                                required:\n                                - devicePath\n                                - name\n                                type: object\n                              type: array\n                            volumeMounts:\n                              description: |-\n                                Pod volumes to mount into the container's filesystem.\n                                Cannot be updated.\n                              items:\n                                description: VolumeMount describes a mounting of a\n                                  Volume within a container.\n                                properties:\n                                  mountPath:\n                                    description: |-\n                                      Path within the container at which the volume should be mounted.  Must\n                                      not contain ':'.\n                                    type: string\n                                  mountPropagation:\n                                    description: |-\n                                      mountPropagation determines how mounts are propagated from the host\n                                      to container and the other way around.\n                                      When not set, MountPropagationNone is used.\n                                      This field is beta in 1.10.\n                                    type: string\n                                  name:\n                                    description: This must match the Name of a Volume.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      Mounted read-only if true, read-write otherwise (false or unspecified).\n                                      Defaults to false.\n                                    type: boolean\n                                  subPath:\n                                    description: |-\n                                      Path within the volume from which the container's volume should be mounted.\n                                      Defaults to \"\" (volume's root).\n                                    type: string\n                                  subPathExpr:\n                                    description: |-\n                                      Expanded path within the volume from which the container's volume should be mounted.\n                                      Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                      Defaults to \"\" (volume's root).\n                                      SubPathExpr and SubPath are mutually exclusive.\n                                    type: string\n                                required:\n                                - mountPath\n                                - name\n                                type: object\n                              type: array\n                            workingDir:\n                              description: |-\n                                Container's working directory.\n                                If not specified, the container runtime's default will be used, which\n                                might be configured in the container image.\n                                Cannot be updated.\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        type: array\n                      dnsConfig:\n                        description: |-\n                          Specifies the DNS parameters of a pod.\n                          Parameters specified here will be merged to the generated DNS\n                          configuration based on DNSPolicy.\n                        properties:\n                          nameservers:\n                            description: |-\n                              A list of DNS name server IP addresses.\n                              This will be appended to the base nameservers generated from DNSPolicy.\n                              Duplicated nameservers will be removed.\n                            items:\n                              type: string\n                            type: array\n                          options:\n                            description: |-\n                              A list of DNS resolver options.\n                              This will be merged with the base options generated from DNSPolicy.\n                              Duplicated entries will be removed. Resolution options given in Options\n                              will override those that appear in the base DNSPolicy.\n                            items:\n                              description: PodDNSConfigOption defines DNS resolver\n                                options of a pod.\n                              properties:\n                                name:\n                                  description: Required.\n                                  type: string\n                                value:\n                                  type: string\n                              type: object\n                            type: array\n                          searches:\n                            description: |-\n                              A list of DNS search domains for host-name lookup.\n                              This will be appended to the base search paths generated from DNSPolicy.\n                              Duplicated search paths will be removed.\n                            items:\n                              type: string\n                            type: array\n                        type: object\n                      dnsPolicy:\n                        description: |-\n                          Set DNS policy for the pod.\n                          Defaults to \"ClusterFirst\".\n                          Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.\n                          DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy.\n                          To have DNS options set along with hostNetwork, you have to specify DNS policy\n                          explicitly to 'ClusterFirstWithHostNet'.\n                        type: string\n                      enableServiceLinks:\n                        description: |-\n                          EnableServiceLinks indicates whether information about services should be injected into pod's\n                          environment variables, matching the syntax of Docker links.\n                          Optional: Defaults to true.\n                        type: boolean\n                      ephemeralContainers:\n                        description: |-\n                          List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing\n                          pod to perform user-initiated actions such as debugging. This list cannot be specified when\n                          creating a pod, and it cannot be modified by updating the pod spec. In order to add an\n                          ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.\n                        items:\n                          description: |-\n                            An EphemeralContainer is a temporary container that you may add to an existing Pod for\n                            user-initiated activities such as debugging. Ephemeral containers have no resource or\n                            scheduling guarantees, and they will not be restarted when they exit or when a Pod is\n                            removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the\n                            Pod to exceed its resource allocation.\n\n\n                            To add an ephemeral container, use the ephemeralcontainers subresource of an existing\n                            Pod. Ephemeral containers may not be removed or restarted.\n                          properties:\n                            args:\n                              description: |-\n                                Arguments to the entrypoint.\n                                The image's CMD is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: |-\n                                Entrypoint array. Not executed within a shell.\n                                The image's ENTRYPOINT is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            env:\n                              description: |-\n                                List of environment variables to set in the container.\n                                Cannot be updated.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            envFrom:\n                              description: |-\n                                List of sources to populate environment variables in the container.\n                                The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                will be reported as an event when the container is starting. When a key exists in multiple\n                                sources, the value associated with the last source will take precedence.\n                                Values defined by an Env with a duplicate key will take precedence.\n                                Cannot be updated.\n                              items:\n                                description: EnvFromSource represents the source of\n                                  a set of ConfigMaps\n                                properties:\n                                  configMapRef:\n                                    description: The ConfigMap to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  prefix:\n                                    description: An optional identifier to prepend\n                                      to each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                    type: string\n                                  secretRef:\n                                    description: The Secret to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret must\n                                          be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                              type: array\n                            image:\n                              description: |-\n                                Container image name.\n                                More info: https://kubernetes.io/docs/concepts/containers/images\n                              type: string\n                            imagePullPolicy:\n                              description: |-\n                                Image pull policy.\n                                One of Always, Never, IfNotPresent.\n                                Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                              type: string\n                            lifecycle:\n                              description: Lifecycle is not allowed for ephemeral\n                                containers.\n                              properties:\n                                postStart:\n                                  description: |-\n                                    PostStart is called immediately after a container is created. If the handler fails,\n                                    the container is terminated and restarted according to its restart policy.\n                                    Other management of the container blocks until the hook completes.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                                preStop:\n                                  description: |-\n                                    PreStop is called immediately before a container is terminated due to an\n                                    API request or management event such as liveness/startup probe failure,\n                                    preemption, resource contention, etc. The handler is not called if the\n                                    container crashes or exits. The Pod's termination grace period countdown begins before the\n                                    PreStop hook is executed. Regardless of the outcome of the handler, the\n                                    container will eventually terminate within the Pod's termination grace\n                                    period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                    or until the termination grace period is reached.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                              type: object\n                            livenessProbe:\n                              description: Probes are not allowed for ephemeral containers.\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            name:\n                              description: |-\n                                Name of the ephemeral container specified as a DNS_LABEL.\n                                This name must be unique among all containers, init containers and ephemeral containers.\n                              type: string\n                            ports:\n                              description: Ports are not allowed for ephemeral containers.\n                              items:\n                                description: ContainerPort represents a network port\n                                  in a single container.\n                                properties:\n                                  containerPort:\n                                    description: |-\n                                      Number of port to expose on the pod's IP address.\n                                      This must be a valid port number, 0 < x < 65536.\n                                    format: int32\n                                    type: integer\n                                  hostIP:\n                                    description: What host IP to bind the external\n                                      port to.\n                                    type: string\n                                  hostPort:\n                                    description: |-\n                                      Number of port to expose on the host.\n                                      If specified, this must be a valid port number, 0 < x < 65536.\n                                      If HostNetwork is specified, this must match ContainerPort.\n                                      Most containers do not need this.\n                                    format: int32\n                                    type: integer\n                                  name:\n                                    description: |-\n                                      If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                      named port in a pod must have a unique name. Name for the port that can be\n                                      referred to by services.\n                                    type: string\n                                  protocol:\n                                    default: TCP\n                                    description: |-\n                                      Protocol for port. Must be UDP, TCP, or SCTP.\n                                      Defaults to \"TCP\".\n                                    type: string\n                                required:\n                                - containerPort\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - containerPort\n                              - protocol\n                              x-kubernetes-list-type: map\n                            readinessProbe:\n                              description: Probes are not allowed for ephemeral containers.\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            resizePolicy:\n                              description: Resources resize policy for the container.\n                              items:\n                                description: ContainerResizePolicy represents resource\n                                  resize policy for the container.\n                                properties:\n                                  resourceName:\n                                    description: |-\n                                      Name of the resource to which this resource resize policy applies.\n                                      Supported values: cpu, memory.\n                                    type: string\n                                  restartPolicy:\n                                    description: |-\n                                      Restart policy to apply when specified resource is resized.\n                                      If not specified, it defaults to NotRequired.\n                                    type: string\n                                required:\n                                - resourceName\n                                - restartPolicy\n                                type: object\n                              type: array\n                              x-kubernetes-list-type: atomic\n                            resources:\n                              description: |-\n                                Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources\n                                already allocated to the pod.\n                              properties:\n                                claims:\n                                  description: |-\n                                    Claims lists the names of resources, defined in spec.resourceClaims,\n                                    that are used by this container.\n\n\n                                    This is an alpha field and requires enabling the\n                                    DynamicResourceAllocation feature gate.\n\n\n                                    This field is immutable. It can only be set for containers.\n                                  items:\n                                    description: ResourceClaim references one entry\n                                      in PodSpec.ResourceClaims.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name must match the name of one entry in pod.spec.resourceClaims of\n                                          the Pod where this field is used. It makes that resource available\n                                          inside a container.\n                                        type: string\n                                    required:\n                                    - name\n                                    type: object\n                                  type: array\n                                  x-kubernetes-list-map-keys:\n                                  - name\n                                  x-kubernetes-list-type: map\n                                limits:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Limits describes the maximum amount of compute resources allowed.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                                requests:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Requests describes the minimum amount of compute resources required.\n                                    If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                    otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                              type: object\n                            restartPolicy:\n                              description: |-\n                                Restart policy for the container to manage the restart behavior of each\n                                container within a pod.\n                                This may only be set for init containers. You cannot set this field on\n                                ephemeral containers.\n                              type: string\n                            securityContext:\n                              description: |-\n                                Optional: SecurityContext defines the security options the ephemeral container should be run with.\n                                If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                              properties:\n                                allowPrivilegeEscalation:\n                                  description: |-\n                                    AllowPrivilegeEscalation controls whether a process can gain more\n                                    privileges than its parent process. This bool directly controls if\n                                    the no_new_privs flag will be set on the container process.\n                                    AllowPrivilegeEscalation is true always when the container is:\n                                    1) run as Privileged\n                                    2) has CAP_SYS_ADMIN\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                capabilities:\n                                  description: |-\n                                    The capabilities to add/drop when running containers.\n                                    Defaults to the default set of capabilities granted by the container runtime.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    add:\n                                      description: Added capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                    drop:\n                                      description: Removed capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                  type: object\n                                privileged:\n                                  description: |-\n                                    Run container in privileged mode.\n                                    Processes in privileged containers are essentially equivalent to root on the host.\n                                    Defaults to false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                procMount:\n                                  description: |-\n                                    procMount denotes the type of proc mount to use for the containers.\n                                    The default is DefaultProcMount which uses the container runtime defaults for\n                                    readonly paths and masked paths.\n                                    This requires the ProcMountType feature flag to be enabled.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: string\n                                readOnlyRootFilesystem:\n                                  description: |-\n                                    Whether this container has a read-only root filesystem.\n                                    Default is false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                runAsGroup:\n                                  description: |-\n                                    The GID to run the entrypoint of the container process.\n                                    Uses runtime default if unset.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                runAsNonRoot:\n                                  description: |-\n                                    Indicates that the container must run as a non-root user.\n                                    If true, the Kubelet will validate the image at runtime to ensure that it\n                                    does not run as UID 0 (root) and fail to start the container if it does.\n                                    If unset or false, no such validation will be performed.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: boolean\n                                runAsUser:\n                                  description: |-\n                                    The UID to run the entrypoint of the container process.\n                                    Defaults to user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                seLinuxOptions:\n                                  description: |-\n                                    The SELinux context to be applied to the container.\n                                    If unspecified, the container runtime will allocate a random SELinux context for each\n                                    container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    level:\n                                      description: Level is SELinux level label that\n                                        applies to the container.\n                                      type: string\n                                    role:\n                                      description: Role is a SELinux role label that\n                                        applies to the container.\n                                      type: string\n                                    type:\n                                      description: Type is a SELinux type label that\n                                        applies to the container.\n                                      type: string\n                                    user:\n                                      description: User is a SELinux user label that\n                                        applies to the container.\n                                      type: string\n                                  type: object\n                                seccompProfile:\n                                  description: |-\n                                    The seccomp options to use by this container. If seccomp options are\n                                    provided at both the pod & container level, the container options\n                                    override the pod options.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    localhostProfile:\n                                      description: |-\n                                        localhostProfile indicates a profile defined in a file on the node should be used.\n                                        The profile must be preconfigured on the node to work.\n                                        Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                        Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                      type: string\n                                    type:\n                                      description: |-\n                                        type indicates which kind of seccomp profile will be applied.\n                                        Valid options are:\n\n\n                                        Localhost - a profile defined in a file on the node should be used.\n                                        RuntimeDefault - the container runtime default profile should be used.\n                                        Unconfined - no profile should be applied.\n                                      type: string\n                                  required:\n                                  - type\n                                  type: object\n                                windowsOptions:\n                                  description: |-\n                                    The Windows specific settings applied to all containers.\n                                    If unspecified, the options from the PodSecurityContext will be used.\n                                    If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is linux.\n                                  properties:\n                                    gmsaCredentialSpec:\n                                      description: |-\n                                        GMSACredentialSpec is where the GMSA admission webhook\n                                        (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                        GMSA credential spec named by the GMSACredentialSpecName field.\n                                      type: string\n                                    gmsaCredentialSpecName:\n                                      description: GMSACredentialSpecName is the name\n                                        of the GMSA credential spec to use.\n                                      type: string\n                                    hostProcess:\n                                      description: |-\n                                        HostProcess determines if a container should be run as a 'Host Process' container.\n                                        All of a Pod's containers must have the same effective HostProcess value\n                                        (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                        In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                      type: boolean\n                                    runAsUserName:\n                                      description: |-\n                                        The UserName in Windows to run the entrypoint of the container process.\n                                        Defaults to the user specified in image metadata if unspecified.\n                                        May also be set in PodSecurityContext. If set in both SecurityContext and\n                                        PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      type: string\n                                  type: object\n                              type: object\n                            startupProbe:\n                              description: Probes are not allowed for ephemeral containers.\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            stdin:\n                              description: |-\n                                Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                is not set, reads from stdin in the container will always result in EOF.\n                                Default is false.\n                              type: boolean\n                            stdinOnce:\n                              description: |-\n                                Whether the container runtime should close the stdin channel after it has been opened by\n                                a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                at which time stdin is closed and remains closed until the container is restarted. If this\n                                flag is false, a container processes that reads from stdin will never receive an EOF.\n                                Default is false\n                              type: boolean\n                            targetContainerName:\n                              description: |-\n                                If set, the name of the container from PodSpec that this ephemeral container targets.\n                                The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container.\n                                If not set then the ephemeral container uses the namespaces configured in the Pod spec.\n\n\n                                The container runtime must implement support for this feature. If the runtime does not\n                                support namespace targeting then the result of setting this field is undefined.\n                              type: string\n                            terminationMessagePath:\n                              description: |-\n                                Optional: Path at which the file to which the container's termination message\n                                will be written is mounted into the container's filesystem.\n                                Message written is intended to be brief final status, such as an assertion failure message.\n                                Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                all containers will be limited to 12kb.\n                                Defaults to /dev/termination-log.\n                                Cannot be updated.\n                              type: string\n                            terminationMessagePolicy:\n                              description: |-\n                                Indicate how the termination message should be populated. File will use the contents of\n                                terminationMessagePath to populate the container status message on both success and failure.\n                                FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                message file is empty and the container exited with an error.\n                                The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                Defaults to File.\n                                Cannot be updated.\n                              type: string\n                            tty:\n                              description: |-\n                                Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                Default is false.\n                              type: boolean\n                            volumeDevices:\n                              description: volumeDevices is the list of block devices\n                                to be used by the container.\n                              items:\n                                description: volumeDevice describes a mapping of a\n                                  raw block device within a container.\n                                properties:\n                                  devicePath:\n                                    description: devicePath is the path inside of\n                                      the container that the device will be mapped\n                                      to.\n                                    type: string\n                                  name:\n                                    description: name must match the name of a persistentVolumeClaim\n                                      in the pod\n                                    type: string\n                                required:\n                                - devicePath\n                                - name\n                                type: object\n                              type: array\n                            volumeMounts:\n                              description: |-\n                                Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers.\n                                Cannot be updated.\n                              items:\n                                description: VolumeMount describes a mounting of a\n                                  Volume within a container.\n                                properties:\n                                  mountPath:\n                                    description: |-\n                                      Path within the container at which the volume should be mounted.  Must\n                                      not contain ':'.\n                                    type: string\n                                  mountPropagation:\n                                    description: |-\n                                      mountPropagation determines how mounts are propagated from the host\n                                      to container and the other way around.\n                                      When not set, MountPropagationNone is used.\n                                      This field is beta in 1.10.\n                                    type: string\n                                  name:\n                                    description: This must match the Name of a Volume.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      Mounted read-only if true, read-write otherwise (false or unspecified).\n                                      Defaults to false.\n                                    type: boolean\n                                  subPath:\n                                    description: |-\n                                      Path within the volume from which the container's volume should be mounted.\n                                      Defaults to \"\" (volume's root).\n                                    type: string\n                                  subPathExpr:\n                                    description: |-\n                                      Expanded path within the volume from which the container's volume should be mounted.\n                                      Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                      Defaults to \"\" (volume's root).\n                                      SubPathExpr and SubPath are mutually exclusive.\n                                    type: string\n                                required:\n                                - mountPath\n                                - name\n                                type: object\n                              type: array\n                            workingDir:\n                              description: |-\n                                Container's working directory.\n                                If not specified, the container runtime's default will be used, which\n                                might be configured in the container image.\n                                Cannot be updated.\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        type: array\n                      hostAliases:\n                        description: |-\n                          HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts\n                          file if specified. This is only valid for non-hostNetwork pods.\n                        items:\n                          description: |-\n                            HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the\n                            pod's hosts file.\n                          properties:\n                            hostnames:\n                              description: Hostnames for the above IP address.\n                              items:\n                                type: string\n                              type: array\n                            ip:\n                              description: IP address of the host file entry.\n                              type: string\n                          type: object\n                        type: array\n                      hostIPC:\n                        description: |-\n                          Use the host's ipc namespace.\n                          Optional: Default to false.\n                        type: boolean\n                      hostNetwork:\n                        description: |-\n                          Host networking requested for this pod. Use the host's network namespace.\n                          If this option is set, the ports that will be used must be specified.\n                          Default to false.\n                        type: boolean\n                      hostPID:\n                        description: |-\n                          Use the host's pid namespace.\n                          Optional: Default to false.\n                        type: boolean\n                      hostUsers:\n                        description: |-\n                          Use the host's user namespace.\n                          Optional: Default to true.\n                          If set to true or not present, the pod will be run in the host user namespace, useful\n                          for when the pod needs a feature only available to the host user namespace, such as\n                          loading a kernel module with CAP_SYS_MODULE.\n                          When set to false, a new userns is created for the pod. Setting false is useful for\n                          mitigating container breakout vulnerabilities even allowing users to run their\n                          containers as root without actually having root privileges on the host.\n                          This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.\n                        type: boolean\n                      hostname:\n                        description: |-\n                          Specifies the hostname of the Pod\n                          If not specified, the pod's hostname will be set to a system-defined value.\n                        type: string\n                      imagePullSecrets:\n                        description: |-\n                          ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec.\n                          If specified, these secrets will be passed to individual puller implementations for them to use.\n                          More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod\n                        items:\n                          description: |-\n                            LocalObjectReference contains enough information to let you locate the\n                            referenced object inside the same namespace.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        type: array\n                      initContainers:\n                        description: |-\n                          List of initialization containers belonging to the pod.\n                          Init containers are executed in order prior to containers being started. If any\n                          init container fails, the pod is considered to have failed and is handled according\n                          to its restartPolicy. The name for an init container or normal container must be\n                          unique among all containers.\n                          Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes.\n                          The resourceRequirements of an init container are taken into account during scheduling\n                          by finding the highest request/limit for each resource type, and then using the max of\n                          of that value or the sum of the normal containers. Limits are applied to init containers\n                          in a similar fashion.\n                          Init containers cannot currently be added or removed.\n                          Cannot be updated.\n                          More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n                        items:\n                          description: A single application container that you want\n                            to run within a pod.\n                          properties:\n                            args:\n                              description: |-\n                                Arguments to the entrypoint.\n                                The container image's CMD is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: |-\n                                Entrypoint array. Not executed within a shell.\n                                The container image's ENTRYPOINT is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            env:\n                              description: |-\n                                List of environment variables to set in the container.\n                                Cannot be updated.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            envFrom:\n                              description: |-\n                                List of sources to populate environment variables in the container.\n                                The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                will be reported as an event when the container is starting. When a key exists in multiple\n                                sources, the value associated with the last source will take precedence.\n                                Values defined by an Env with a duplicate key will take precedence.\n                                Cannot be updated.\n                              items:\n                                description: EnvFromSource represents the source of\n                                  a set of ConfigMaps\n                                properties:\n                                  configMapRef:\n                                    description: The ConfigMap to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  prefix:\n                                    description: An optional identifier to prepend\n                                      to each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                    type: string\n                                  secretRef:\n                                    description: The Secret to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret must\n                                          be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                              type: array\n                            image:\n                              description: |-\n                                Container image name.\n                                More info: https://kubernetes.io/docs/concepts/containers/images\n                                This field is optional to allow higher level config management to default or override\n                                container images in workload controllers like Deployments and StatefulSets.\n                              type: string\n                            imagePullPolicy:\n                              description: |-\n                                Image pull policy.\n                                One of Always, Never, IfNotPresent.\n                                Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                              type: string\n                            lifecycle:\n                              description: |-\n                                Actions that the management system should take in response to container lifecycle events.\n                                Cannot be updated.\n                              properties:\n                                postStart:\n                                  description: |-\n                                    PostStart is called immediately after a container is created. If the handler fails,\n                                    the container is terminated and restarted according to its restart policy.\n                                    Other management of the container blocks until the hook completes.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                                preStop:\n                                  description: |-\n                                    PreStop is called immediately before a container is terminated due to an\n                                    API request or management event such as liveness/startup probe failure,\n                                    preemption, resource contention, etc. The handler is not called if the\n                                    container crashes or exits. The Pod's termination grace period countdown begins before the\n                                    PreStop hook is executed. Regardless of the outcome of the handler, the\n                                    container will eventually terminate within the Pod's termination grace\n                                    period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                    or until the termination grace period is reached.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                              type: object\n                            livenessProbe:\n                              description: |-\n                                Periodic probe of container liveness.\n                                Container will be restarted if the probe fails.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            name:\n                              description: |-\n                                Name of the container specified as a DNS_LABEL.\n                                Each container in a pod must have a unique name (DNS_LABEL).\n                                Cannot be updated.\n                              type: string\n                            ports:\n                              description: |-\n                                List of ports to expose from the container. Not specifying a port here\n                                DOES NOT prevent that port from being exposed. Any port which is\n                                listening on the default \"0.0.0.0\" address inside a container will be\n                                accessible from the network.\n                                Modifying this array with strategic merge patch may corrupt the data.\n                                For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                                Cannot be updated.\n                              items:\n                                description: ContainerPort represents a network port\n                                  in a single container.\n                                properties:\n                                  containerPort:\n                                    description: |-\n                                      Number of port to expose on the pod's IP address.\n                                      This must be a valid port number, 0 < x < 65536.\n                                    format: int32\n                                    type: integer\n                                  hostIP:\n                                    description: What host IP to bind the external\n                                      port to.\n                                    type: string\n                                  hostPort:\n                                    description: |-\n                                      Number of port to expose on the host.\n                                      If specified, this must be a valid port number, 0 < x < 65536.\n                                      If HostNetwork is specified, this must match ContainerPort.\n                                      Most containers do not need this.\n                                    format: int32\n                                    type: integer\n                                  name:\n                                    description: |-\n                                      If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                      named port in a pod must have a unique name. Name for the port that can be\n                                      referred to by services.\n                                    type: string\n                                  protocol:\n                                    default: TCP\n                                    description: |-\n                                      Protocol for port. Must be UDP, TCP, or SCTP.\n                                      Defaults to \"TCP\".\n                                    type: string\n                                required:\n                                - containerPort\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - containerPort\n                              - protocol\n                              x-kubernetes-list-type: map\n                            readinessProbe:\n                              description: |-\n                                Periodic probe of container service readiness.\n                                Container will be removed from service endpoints if the probe fails.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            resizePolicy:\n                              description: Resources resize policy for the container.\n                              items:\n                                description: ContainerResizePolicy represents resource\n                                  resize policy for the container.\n                                properties:\n                                  resourceName:\n                                    description: |-\n                                      Name of the resource to which this resource resize policy applies.\n                                      Supported values: cpu, memory.\n                                    type: string\n                                  restartPolicy:\n                                    description: |-\n                                      Restart policy to apply when specified resource is resized.\n                                      If not specified, it defaults to NotRequired.\n                                    type: string\n                                required:\n                                - resourceName\n                                - restartPolicy\n                                type: object\n                              type: array\n                              x-kubernetes-list-type: atomic\n                            resources:\n                              description: |-\n                                Compute Resources required by this container.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              properties:\n                                claims:\n                                  description: |-\n                                    Claims lists the names of resources, defined in spec.resourceClaims,\n                                    that are used by this container.\n\n\n                                    This is an alpha field and requires enabling the\n                                    DynamicResourceAllocation feature gate.\n\n\n                                    This field is immutable. It can only be set for containers.\n                                  items:\n                                    description: ResourceClaim references one entry\n                                      in PodSpec.ResourceClaims.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name must match the name of one entry in pod.spec.resourceClaims of\n                                          the Pod where this field is used. It makes that resource available\n                                          inside a container.\n                                        type: string\n                                    required:\n                                    - name\n                                    type: object\n                                  type: array\n                                  x-kubernetes-list-map-keys:\n                                  - name\n                                  x-kubernetes-list-type: map\n                                limits:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Limits describes the maximum amount of compute resources allowed.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                                requests:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Requests describes the minimum amount of compute resources required.\n                                    If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                    otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                              type: object\n                            restartPolicy:\n                              description: |-\n                                RestartPolicy defines the restart behavior of individual containers in a pod.\n                                This field may only be set for init containers, and the only allowed value is \"Always\".\n                                For non-init containers or when this field is not specified,\n                                the restart behavior is defined by the Pod's restart policy and the container type.\n                                Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                                this init container will be continually restarted on\n                                exit until all regular containers have terminated. Once all regular\n                                containers have completed, all init containers with restartPolicy \"Always\"\n                                will be shut down. This lifecycle differs from normal init containers and\n                                is often referred to as a \"sidecar\" container. Although this init\n                                container still starts in the init container sequence, it does not wait\n                                for the container to complete before proceeding to the next init\n                                container. Instead, the next init container starts immediately after this\n                                init container is started, or after any startupProbe has successfully\n                                completed.\n                              type: string\n                            securityContext:\n                              description: |-\n                                SecurityContext defines the security options the container should be run with.\n                                If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                              properties:\n                                allowPrivilegeEscalation:\n                                  description: |-\n                                    AllowPrivilegeEscalation controls whether a process can gain more\n                                    privileges than its parent process. This bool directly controls if\n                                    the no_new_privs flag will be set on the container process.\n                                    AllowPrivilegeEscalation is true always when the container is:\n                                    1) run as Privileged\n                                    2) has CAP_SYS_ADMIN\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                capabilities:\n                                  description: |-\n                                    The capabilities to add/drop when running containers.\n                                    Defaults to the default set of capabilities granted by the container runtime.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    add:\n                                      description: Added capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                    drop:\n                                      description: Removed capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                  type: object\n                                privileged:\n                                  description: |-\n                                    Run container in privileged mode.\n                                    Processes in privileged containers are essentially equivalent to root on the host.\n                                    Defaults to false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                procMount:\n                                  description: |-\n                                    procMount denotes the type of proc mount to use for the containers.\n                                    The default is DefaultProcMount which uses the container runtime defaults for\n                                    readonly paths and masked paths.\n                                    This requires the ProcMountType feature flag to be enabled.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: string\n                                readOnlyRootFilesystem:\n                                  description: |-\n                                    Whether this container has a read-only root filesystem.\n                                    Default is false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                runAsGroup:\n                                  description: |-\n                                    The GID to run the entrypoint of the container process.\n                                    Uses runtime default if unset.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                runAsNonRoot:\n                                  description: |-\n                                    Indicates that the container must run as a non-root user.\n                                    If true, the Kubelet will validate the image at runtime to ensure that it\n                                    does not run as UID 0 (root) and fail to start the container if it does.\n                                    If unset or false, no such validation will be performed.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: boolean\n                                runAsUser:\n                                  description: |-\n                                    The UID to run the entrypoint of the container process.\n                                    Defaults to user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                seLinuxOptions:\n                                  description: |-\n                                    The SELinux context to be applied to the container.\n                                    If unspecified, the container runtime will allocate a random SELinux context for each\n                                    container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    level:\n                                      description: Level is SELinux level label that\n                                        applies to the container.\n                                      type: string\n                                    role:\n                                      description: Role is a SELinux role label that\n                                        applies to the container.\n                                      type: string\n                                    type:\n                                      description: Type is a SELinux type label that\n                                        applies to the container.\n                                      type: string\n                                    user:\n                                      description: User is a SELinux user label that\n                                        applies to the container.\n                                      type: string\n                                  type: object\n                                seccompProfile:\n                                  description: |-\n                                    The seccomp options to use by this container. If seccomp options are\n                                    provided at both the pod & container level, the container options\n                                    override the pod options.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    localhostProfile:\n                                      description: |-\n                                        localhostProfile indicates a profile defined in a file on the node should be used.\n                                        The profile must be preconfigured on the node to work.\n                                        Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                        Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                      type: string\n                                    type:\n                                      description: |-\n                                        type indicates which kind of seccomp profile will be applied.\n                                        Valid options are:\n\n\n                                        Localhost - a profile defined in a file on the node should be used.\n                                        RuntimeDefault - the container runtime default profile should be used.\n                                        Unconfined - no profile should be applied.\n                                      type: string\n                                  required:\n                                  - type\n                                  type: object\n                                windowsOptions:\n                                  description: |-\n                                    The Windows specific settings applied to all containers.\n                                    If unspecified, the options from the PodSecurityContext will be used.\n                                    If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is linux.\n                                  properties:\n                                    gmsaCredentialSpec:\n                                      description: |-\n                                        GMSACredentialSpec is where the GMSA admission webhook\n                                        (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                        GMSA credential spec named by the GMSACredentialSpecName field.\n                                      type: string\n                                    gmsaCredentialSpecName:\n                                      description: GMSACredentialSpecName is the name\n                                        of the GMSA credential spec to use.\n                                      type: string\n                                    hostProcess:\n                                      description: |-\n                                        HostProcess determines if a container should be run as a 'Host Process' container.\n                                        All of a Pod's containers must have the same effective HostProcess value\n                                        (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                        In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                      type: boolean\n                                    runAsUserName:\n                                      description: |-\n                                        The UserName in Windows to run the entrypoint of the container process.\n                                        Defaults to the user specified in image metadata if unspecified.\n                                        May also be set in PodSecurityContext. If set in both SecurityContext and\n                                        PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      type: string\n                                  type: object\n                              type: object\n                            startupProbe:\n                              description: |-\n                                StartupProbe indicates that the Pod has successfully initialized.\n                                If specified, no other probes are executed until this completes successfully.\n                                If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                                This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                                when it might take a long time to load data or warm a cache, than during steady-state operation.\n                                This cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            stdin:\n                              description: |-\n                                Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                is not set, reads from stdin in the container will always result in EOF.\n                                Default is false.\n                              type: boolean\n                            stdinOnce:\n                              description: |-\n                                Whether the container runtime should close the stdin channel after it has been opened by\n                                a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                at which time stdin is closed and remains closed until the container is restarted. If this\n                                flag is false, a container processes that reads from stdin will never receive an EOF.\n                                Default is false\n                              type: boolean\n                            terminationMessagePath:\n                              description: |-\n                                Optional: Path at which the file to which the container's termination message\n                                will be written is mounted into the container's filesystem.\n                                Message written is intended to be brief final status, such as an assertion failure message.\n                                Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                all containers will be limited to 12kb.\n                                Defaults to /dev/termination-log.\n                                Cannot be updated.\n                              type: string\n                            terminationMessagePolicy:\n                              description: |-\n                                Indicate how the termination message should be populated. File will use the contents of\n                                terminationMessagePath to populate the container status message on both success and failure.\n                                FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                message file is empty and the container exited with an error.\n                                The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                Defaults to File.\n                                Cannot be updated.\n                              type: string\n                            tty:\n                              description: |-\n                                Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                Default is false.\n                              type: boolean\n                            volumeDevices:\n                              description: volumeDevices is the list of block devices\n                                to be used by the container.\n                              items:\n                                description: volumeDevice describes a mapping of a\n                                  raw block device within a container.\n                                properties:\n                                  devicePath:\n                                    description: devicePath is the path inside of\n                                      the container that the device will be mapped\n                                      to.\n                                    type: string\n                                  name:\n                                    description: name must match the name of a persistentVolumeClaim\n                                      in the pod\n                                    type: string\n                                required:\n                                - devicePath\n                                - name\n                                type: object\n                              type: array\n                            volumeMounts:\n                              description: |-\n                                Pod volumes to mount into the container's filesystem.\n                                Cannot be updated.\n                              items:\n                                description: VolumeMount describes a mounting of a\n                                  Volume within a container.\n                                properties:\n                                  mountPath:\n                                    description: |-\n                                      Path within the container at which the volume should be mounted.  Must\n                                      not contain ':'.\n                                    type: string\n                                  mountPropagation:\n                                    description: |-\n                                      mountPropagation determines how mounts are propagated from the host\n                                      to container and the other way around.\n                                      When not set, MountPropagationNone is used.\n                                      This field is beta in 1.10.\n                                    type: string\n                                  name:\n                                    description: This must match the Name of a Volume.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      Mounted read-only if true, read-write otherwise (false or unspecified).\n                                      Defaults to false.\n                                    type: boolean\n                                  subPath:\n                                    description: |-\n                                      Path within the volume from which the container's volume should be mounted.\n                                      Defaults to \"\" (volume's root).\n                                    type: string\n                                  subPathExpr:\n                                    description: |-\n                                      Expanded path within the volume from which the container's volume should be mounted.\n                                      Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                      Defaults to \"\" (volume's root).\n                                      SubPathExpr and SubPath are mutually exclusive.\n                                    type: string\n                                required:\n                                - mountPath\n                                - name\n                                type: object\n                              type: array\n                            workingDir:\n                              description: |-\n                                Container's working directory.\n                                If not specified, the container runtime's default will be used, which\n                                might be configured in the container image.\n                                Cannot be updated.\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        type: array\n                      nodeName:\n                        description: |-\n                          NodeName is a request to schedule this pod onto a specific node. If it is non-empty,\n                          the scheduler simply schedules this pod onto that node, assuming that it fits resource\n                          requirements.\n                        type: string\n                      nodeSelector:\n                        additionalProperties:\n                          type: string\n                        description: |-\n                          NodeSelector is a selector which must be true for the pod to fit on a node.\n                          Selector which must match a node's labels for the pod to be scheduled on that node.\n                          More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      os:\n                        description: |-\n                          Specifies the OS of the containers in the pod.\n                          Some pod and container fields are restricted if this is set.\n\n\n                          If the OS field is set to linux, the following fields must be unset:\n                          -securityContext.windowsOptions\n\n\n                          If the OS field is set to windows, following fields must be unset:\n                          - spec.hostPID\n                          - spec.hostIPC\n                          - spec.hostUsers\n                          - spec.securityContext.seLinuxOptions\n                          - spec.securityContext.seccompProfile\n                          - spec.securityContext.fsGroup\n                          - spec.securityContext.fsGroupChangePolicy\n                          - spec.securityContext.sysctls\n                          - spec.shareProcessNamespace\n                          - spec.securityContext.runAsUser\n                          - spec.securityContext.runAsGroup\n                          - spec.securityContext.supplementalGroups\n                          - spec.containers[*].securityContext.seLinuxOptions\n                          - spec.containers[*].securityContext.seccompProfile\n                          - spec.containers[*].securityContext.capabilities\n                          - spec.containers[*].securityContext.readOnlyRootFilesystem\n                          - spec.containers[*].securityContext.privileged\n                          - spec.containers[*].securityContext.allowPrivilegeEscalation\n                          - spec.containers[*].securityContext.procMount\n                          - spec.containers[*].securityContext.runAsUser\n                          - spec.containers[*].securityContext.runAsGroup\n                        properties:\n                          name:\n                            description: |-\n                              Name is the name of the operating system. The currently supported values are linux and windows.\n                              Additional value may be defined in future and can be one of:\n                              https://github.com/opencontainers/runtime-spec/blob/master/config.md#platform-specific-configuration\n                              Clients should expect to handle additional values and treat unrecognized values in this field as os: null\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      overhead:\n                        additionalProperties:\n                          anyOf:\n                          - type: integer\n                          - type: string\n                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                          x-kubernetes-int-or-string: true\n                        description: |-\n                          Overhead represents the resource overhead associated with running a pod for a given RuntimeClass.\n                          This field will be autopopulated at admission time by the RuntimeClass admission controller. If\n                          the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests.\n                          The RuntimeClass admission controller will reject Pod create requests which have the overhead already\n                          set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value\n                          defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero.\n                          More info: https://git.k8s.io/enhancements/keps/sig-node/688-pod-overhead/README.md\n                        type: object\n                      preemptionPolicy:\n                        description: |-\n                          PreemptionPolicy is the Policy for preempting pods with lower priority.\n                          One of Never, PreemptLowerPriority.\n                          Defaults to PreemptLowerPriority if unset.\n                        type: string\n                      priority:\n                        description: |-\n                          The priority value. Various system components use this field to find the\n                          priority of the pod. When Priority Admission Controller is enabled, it\n                          prevents users from setting this field. The admission controller populates\n                          this field from PriorityClassName.\n                          The higher the value, the higher the priority.\n                        format: int32\n                        type: integer\n                      priorityClassName:\n                        description: |-\n                          If specified, indicates the pod's priority. \"system-node-critical\" and\n                          \"system-cluster-critical\" are two special keywords which indicate the\n                          highest priorities with the former being the highest priority. Any other\n                          name must be defined by creating a PriorityClass object with that name.\n                          If not specified, the pod priority will be default or zero if there is no\n                          default.\n                        type: string\n                      readinessGates:\n                        description: |-\n                          If specified, all readiness gates will be evaluated for pod readiness.\n                          A pod is ready when all its containers are ready AND\n                          all conditions specified in the readiness gates have status equal to \"True\"\n                          More info: https://git.k8s.io/enhancements/keps/sig-network/580-pod-readiness-gates\n                        items:\n                          description: PodReadinessGate contains the reference to\n                            a pod condition\n                          properties:\n                            conditionType:\n                              description: ConditionType refers to a condition in\n                                the pod's condition list with matching type.\n                              type: string\n                          required:\n                          - conditionType\n                          type: object\n                        type: array\n                      resourceClaims:\n                        description: |-\n                          ResourceClaims defines which ResourceClaims must be allocated\n                          and reserved before the Pod is allowed to start. The resources\n                          will be made available to those containers which consume them\n                          by name.\n\n\n                          This is an alpha field and requires enabling the\n                          DynamicResourceAllocation feature gate.\n\n\n                          This field is immutable.\n                        items:\n                          description: |-\n                            PodResourceClaim references exactly one ResourceClaim through a ClaimSource.\n                            It adds a name to it that uniquely identifies the ResourceClaim inside the Pod.\n                            Containers that need access to the ResourceClaim reference it with this name.\n                          properties:\n                            name:\n                              description: |-\n                                Name uniquely identifies this resource claim inside the pod.\n                                This must be a DNS_LABEL.\n                              type: string\n                            source:\n                              description: Source describes where to find the ResourceClaim.\n                              properties:\n                                resourceClaimName:\n                                  description: |-\n                                    ResourceClaimName is the name of a ResourceClaim object in the same\n                                    namespace as this pod.\n                                  type: string\n                                resourceClaimTemplateName:\n                                  description: |-\n                                    ResourceClaimTemplateName is the name of a ResourceClaimTemplate\n                                    object in the same namespace as this pod.\n\n\n                                    The template will be used to create a new ResourceClaim, which will\n                                    be bound to this pod. When this pod is deleted, the ResourceClaim\n                                    will also be deleted. The pod name and resource name, along with a\n                                    generated component, will be used to form a unique name for the\n                                    ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses.\n\n\n                                    This field is immutable and no changes will be made to the\n                                    corresponding ResourceClaim by the control plane after creating the\n                                    ResourceClaim.\n                                  type: string\n                              type: object\n                          required:\n                          - name\n                          type: object\n                        type: array\n                        x-kubernetes-list-map-keys:\n                        - name\n                        x-kubernetes-list-type: map\n                      restartPolicy:\n                        description: |-\n                          Restart policy for all containers within the pod.\n                          One of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted.\n                          Default to Always.\n                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy\n                        type: string\n                      runtimeClassName:\n                        description: |-\n                          RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used\n                          to run this pod.  If no RuntimeClass resource matches the named class, the pod will not be run.\n                          If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an\n                          empty definition that uses the default runtime handler.\n                          More info: https://git.k8s.io/enhancements/keps/sig-node/585-runtime-class\n                        type: string\n                      schedulerName:\n                        description: |-\n                          If specified, the pod will be dispatched by specified scheduler.\n                          If not specified, the pod will be dispatched by default scheduler.\n                        type: string\n                      schedulingGates:\n                        description: |-\n                          SchedulingGates is an opaque list of values that if specified will block scheduling the pod.\n                          If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the\n                          scheduler will not attempt to schedule the pod.\n\n\n                          SchedulingGates can only be set at pod creation time, and be removed only afterwards.\n\n\n                          This is a beta feature enabled by the PodSchedulingReadiness feature gate.\n                        items:\n                          description: PodSchedulingGate is associated to a Pod to\n                            guard its scheduling.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the scheduling gate.\n                                Each scheduling gate must have a unique name field.\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        type: array\n                        x-kubernetes-list-map-keys:\n                        - name\n                        x-kubernetes-list-type: map\n                      securityContext:\n                        description: |-\n                          SecurityContext holds pod-level security attributes and common container settings.\n                          Optional: Defaults to empty.  See type description for default values of each field.\n                        properties:\n                          fsGroup:\n                            description: |-\n                              A special supplemental group that applies to all containers in a pod.\n                              Some volume types allow the Kubelet to change the ownership of that volume\n                              to be owned by the pod:\n\n\n                              1. The owning GID will be the FSGroup\n                              2. The setgid bit is set (new files created in the volume will be owned by FSGroup)\n                              3. The permission bits are OR'd with rw-rw----\n\n\n                              If unset, the Kubelet will not modify the ownership and permissions of any volume.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            format: int64\n                            type: integer\n                          fsGroupChangePolicy:\n                            description: |-\n                              fsGroupChangePolicy defines behavior of changing ownership and permission of the volume\n                              before being exposed inside Pod. This field will only apply to\n                              volume types which support fsGroup based ownership(and permissions).\n                              It will have no effect on ephemeral volume types such as: secret, configmaps\n                              and emptydir.\n                              Valid values are \"OnRootMismatch\" and \"Always\". If not specified, \"Always\" is used.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            type: string\n                          runAsGroup:\n                            description: |-\n                              The GID to run the entrypoint of the container process.\n                              Uses runtime default if unset.\n                              May also be set in SecurityContext.  If set in both SecurityContext and\n                              PodSecurityContext, the value specified in SecurityContext takes precedence\n                              for that container.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            format: int64\n                            type: integer\n                          runAsNonRoot:\n                            description: |-\n                              Indicates that the container must run as a non-root user.\n                              If true, the Kubelet will validate the image at runtime to ensure that it\n                              does not run as UID 0 (root) and fail to start the container if it does.\n                              If unset or false, no such validation will be performed.\n                              May also be set in SecurityContext.  If set in both SecurityContext and\n                              PodSecurityContext, the value specified in SecurityContext takes precedence.\n                            type: boolean\n                          runAsUser:\n                            description: |-\n                              The UID to run the entrypoint of the container process.\n                              Defaults to user specified in image metadata if unspecified.\n                              May also be set in SecurityContext.  If set in both SecurityContext and\n                              PodSecurityContext, the value specified in SecurityContext takes precedence\n                              for that container.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            format: int64\n                            type: integer\n                          seLinuxOptions:\n                            description: |-\n                              The SELinux context to be applied to all containers.\n                              If unspecified, the container runtime will allocate a random SELinux context for each\n                              container.  May also be set in SecurityContext.  If set in\n                              both SecurityContext and PodSecurityContext, the value specified in SecurityContext\n                              takes precedence for that container.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            properties:\n                              level:\n                                description: Level is SELinux level label that applies\n                                  to the container.\n                                type: string\n                              role:\n                                description: Role is a SELinux role label that applies\n                                  to the container.\n                                type: string\n                              type:\n                                description: Type is a SELinux type label that applies\n                                  to the container.\n                                type: string\n                              user:\n                                description: User is a SELinux user label that applies\n                                  to the container.\n                                type: string\n                            type: object\n                          seccompProfile:\n                            description: |-\n                              The seccomp options to use by the containers in this pod.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            properties:\n                              localhostProfile:\n                                description: |-\n                                  localhostProfile indicates a profile defined in a file on the node should be used.\n                                  The profile must be preconfigured on the node to work.\n                                  Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                  Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                type: string\n                              type:\n                                description: |-\n                                  type indicates which kind of seccomp profile will be applied.\n                                  Valid options are:\n\n\n                                  Localhost - a profile defined in a file on the node should be used.\n                                  RuntimeDefault - the container runtime default profile should be used.\n                                  Unconfined - no profile should be applied.\n                                type: string\n                            required:\n                            - type\n                            type: object\n                          supplementalGroups:\n                            description: |-\n                              A list of groups applied to the first process run in each container, in addition\n                              to the container's primary GID, the fsGroup (if specified), and group memberships\n                              defined in the container image for the uid of the container process. If unspecified,\n                              no additional groups are added to any container. Note that group memberships\n                              defined in the container image for the uid of the container process are still effective,\n                              even if they are not included in this list.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            items:\n                              format: int64\n                              type: integer\n                            type: array\n                          sysctls:\n                            description: |-\n                              Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported\n                              sysctls (by the container runtime) might fail to launch.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            items:\n                              description: Sysctl defines a kernel parameter to be\n                                set\n                              properties:\n                                name:\n                                  description: Name of a property to set\n                                  type: string\n                                value:\n                                  description: Value of a property to set\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          windowsOptions:\n                            description: |-\n                              The Windows specific settings applied to all containers.\n                              If unspecified, the options within a container's SecurityContext will be used.\n                              If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              Note that this field cannot be set when spec.os.name is linux.\n                            properties:\n                              gmsaCredentialSpec:\n                                description: |-\n                                  GMSACredentialSpec is where the GMSA admission webhook\n                                  (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                  GMSA credential spec named by the GMSACredentialSpecName field.\n                                type: string\n                              gmsaCredentialSpecName:\n                                description: GMSACredentialSpecName is the name of\n                                  the GMSA credential spec to use.\n                                type: string\n                              hostProcess:\n                                description: |-\n                                  HostProcess determines if a container should be run as a 'Host Process' container.\n                                  All of a Pod's containers must have the same effective HostProcess value\n                                  (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                  In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                type: boolean\n                              runAsUserName:\n                                description: |-\n                                  The UserName in Windows to run the entrypoint of the container process.\n                                  Defaults to the user specified in image metadata if unspecified.\n                                  May also be set in PodSecurityContext. If set in both SecurityContext and\n                                  PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                type: string\n                            type: object\n                        type: object\n                      serviceAccount:\n                        description: |-\n                          DeprecatedServiceAccount is a depreciated alias for ServiceAccountName.\n                          Deprecated: Use serviceAccountName instead.\n                        type: string\n                      serviceAccountName:\n                        description: |-\n                          ServiceAccountName is the name of the ServiceAccount to use to run this pod.\n                          More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n                        type: string\n                      setHostnameAsFQDN:\n                        description: |-\n                          If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default).\n                          In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname).\n                          In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip\\\\Parameters to FQDN.\n                          If a pod does not have FQDN, this has no effect.\n                          Default to false.\n                        type: boolean\n                      shareProcessNamespace:\n                        description: |-\n                          Share a single process namespace between all of the containers in a pod.\n                          When this is set containers will be able to view and signal processes from other containers\n                          in the same pod, and the first process in each container will not be assigned PID 1.\n                          HostPID and ShareProcessNamespace cannot both be set.\n                          Optional: Default to false.\n                        type: boolean\n                      subdomain:\n                        description: |-\n                          If specified, the fully qualified Pod hostname will be \"<hostname>.<subdomain>.<pod namespace>.svc.<cluster domain>\".\n                          If not specified, the pod will not have a domainname at all.\n                        type: string\n                      terminationGracePeriodSeconds:\n                        description: |-\n                          Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request.\n                          Value must be non-negative integer. The value zero indicates stop immediately via\n                          the kill signal (no opportunity to shut down).\n                          If this value is nil, the default grace period will be used instead.\n                          The grace period is the duration in seconds after the processes running in the pod are sent\n                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                          Set this value longer than the expected cleanup time for your process.\n                          Defaults to 30 seconds.\n                        format: int64\n                        type: integer\n                      tolerations:\n                        description: If specified, the pod's tolerations.\n                        items:\n                          description: |-\n                            The pod this Toleration is attached to tolerates any taint that matches\n                            the triple <key,value,effect> using the matching operator <operator>.\n                          properties:\n                            effect:\n                              description: |-\n                                Effect indicates the taint effect to match. Empty means match all taint effects.\n                                When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                              type: string\n                            key:\n                              description: |-\n                                Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                              type: string\n                            operator:\n                              description: |-\n                                Operator represents a key's relationship to the value.\n                                Valid operators are Exists and Equal. Defaults to Equal.\n                                Exists is equivalent to wildcard for value, so that a pod can\n                                tolerate all taints of a particular category.\n                              type: string\n                            tolerationSeconds:\n                              description: |-\n                                TolerationSeconds represents the period of time the toleration (which must be\n                                of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                negative values will be treated as 0 (evict immediately) by the system.\n                              format: int64\n                              type: integer\n                            value:\n                              description: |-\n                                Value is the taint value the toleration matches to.\n                                If the operator is Exists, the value should be empty, otherwise just a regular string.\n                              type: string\n                          type: object\n                        type: array\n                      topologySpreadConstraints:\n                        description: |-\n                          TopologySpreadConstraints describes how a group of pods ought to spread across topology\n                          domains. Scheduler will schedule pods in a way which abides by the constraints.\n                          All topologySpreadConstraints are ANDed.\n                        items:\n                          description: TopologySpreadConstraint specifies how to spread\n                            matching pods among the given topology.\n                          properties:\n                            labelSelector:\n                              description: |-\n                                LabelSelector is used to find matching pods.\n                                Pods that match this label selector are counted to determine the number of pods\n                                in their corresponding topology domain.\n                              properties:\n                                matchExpressions:\n                                  description: matchExpressions is a list of label\n                                    selector requirements. The requirements are ANDed.\n                                  items:\n                                    description: |-\n                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                      relates the key and values.\n                                    properties:\n                                      key:\n                                        description: key is the label key that the\n                                          selector applies to.\n                                        type: string\n                                      operator:\n                                        description: |-\n                                          operator represents a key's relationship to a set of values.\n                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                        type: string\n                                      values:\n                                        description: |-\n                                          values is an array of string values. If the operator is In or NotIn,\n                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                          the values array must be empty. This array is replaced during a strategic\n                                          merge patch.\n                                        items:\n                                          type: string\n                                        type: array\n                                    required:\n                                    - key\n                                    - operator\n                                    type: object\n                                  type: array\n                                matchLabels:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                  type: object\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            matchLabelKeys:\n                              description: |-\n                                MatchLabelKeys is a set of pod label keys to select the pods over which\n                                spreading will be calculated. The keys are used to lookup values from the\n                                incoming pod labels, those key-value labels are ANDed with labelSelector\n                                to select the group of existing pods over which spreading will be calculated\n                                for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                Keys that don't exist in the incoming pod labels will\n                                be ignored. A null or empty list means only match against labelSelector.\n\n\n                                This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                              items:\n                                type: string\n                              type: array\n                              x-kubernetes-list-type: atomic\n                            maxSkew:\n                              description: |-\n                                MaxSkew describes the degree to which pods may be unevenly distributed.\n                                When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                between the number of matching pods in the target topology and the global minimum.\n                                The global minimum is the minimum number of matching pods in an eligible domain\n                                or zero if the number of eligible domains is less than MinDomains.\n                                For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                labelSelector spread as 2/2/1:\n                                In this case, the global minimum is 1.\n                                | zone1 | zone2 | zone3 |\n                                |  P P  |  P P  |   P   |\n                                - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                violate MaxSkew(1).\n                                - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                to topologies that satisfy it.\n                                It's a required field. Default value is 1 and 0 is not allowed.\n                              format: int32\n                              type: integer\n                            minDomains:\n                              description: |-\n                                MinDomains indicates a minimum number of eligible domains.\n                                When the number of eligible domains with matching topology keys is less than minDomains,\n                                Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                this value has no effect on scheduling.\n                                As a result, when the number of eligible domains is less than minDomains,\n                                scheduler won't schedule more than maxSkew Pods to those domains.\n                                If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                Valid values are integers greater than 0.\n                                When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                labelSelector spread as 2/2/2:\n                                | zone1 | zone2 | zone3 |\n                                |  P P  |  P P  |  P P  |\n                                The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                In this situation, new pod with the same labelSelector cannot be scheduled,\n                                because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                it will violate MaxSkew.\n\n\n                                This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                              format: int32\n                              type: integer\n                            nodeAffinityPolicy:\n                              description: |-\n                                NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                when calculating pod topology spread skew. Options are:\n                                - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                If this value is nil, the behavior is equivalent to the Honor policy.\n                                This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                              type: string\n                            nodeTaintsPolicy:\n                              description: |-\n                                NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                pod topology spread skew. Options are:\n                                - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                has a toleration, are included.\n                                - Ignore: node taints are ignored. All nodes are included.\n\n\n                                If this value is nil, the behavior is equivalent to the Ignore policy.\n                                This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                              type: string\n                            topologyKey:\n                              description: |-\n                                TopologyKey is the key of node labels. Nodes that have a label with this key\n                                and identical values are considered to be in the same topology.\n                                We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                of pods into each bucket.\n                                We define a domain as a particular instance of a topology.\n                                Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                nodeAffinityPolicy and nodeTaintsPolicy.\n                                e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                It's a required field.\n                              type: string\n                            whenUnsatisfiable:\n                              description: |-\n                                WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                the spread constraint.\n                                - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                  but giving higher precedence to topologies that would help reduce the\n                                  skew.\n                                A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                if and only if every possible node assignment for that pod would violate\n                                \"MaxSkew\" on some topology.\n                                For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                labelSelector spread as 3/1/1:\n                                | zone1 | zone2 | zone3 |\n                                | P P P |   P   |   P   |\n                                If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                won't make it *more* imbalanced.\n                                It's a required field.\n                              type: string\n                          required:\n                          - maxSkew\n                          - topologyKey\n                          - whenUnsatisfiable\n                          type: object\n                        type: array\n                        x-kubernetes-list-map-keys:\n                        - topologyKey\n                        - whenUnsatisfiable\n                        x-kubernetes-list-type: map\n                      volumes:\n                        description: |-\n                          List of volumes that can be mounted by containers belonging to the pod.\n                          More info: https://kubernetes.io/docs/concepts/storage/volumes\n                        items:\n                          description: Volume represents a named volume in a pod that\n                            may be accessed by any container in the pod.\n                          properties:\n                            awsElasticBlockStore:\n                              description: |-\n                                awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                                kubelet's host machine and then exposed to the pod.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type of the volume that you want to mount.\n                                    Tip: Ensure that the filesystem type is supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                partition:\n                                  description: |-\n                                    partition is the partition in the volume that you want to mount.\n                                    If omitted, the default is to mount by volume name.\n                                    Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                    Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                  format: int32\n                                  type: integer\n                                readOnly:\n                                  description: |-\n                                    readOnly value true will force the readOnly setting in VolumeMounts.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                  type: boolean\n                                volumeID:\n                                  description: |-\n                                    volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                  type: string\n                              required:\n                              - volumeID\n                              type: object\n                            azureDisk:\n                              description: azureDisk represents an Azure Data Disk\n                                mount on the host and bind mount to the pod.\n                              properties:\n                                cachingMode:\n                                  description: 'cachingMode is the Host Caching mode:\n                                    None, Read Only, Read Write.'\n                                  type: string\n                                diskName:\n                                  description: diskName is the Name of the data disk\n                                    in the blob storage\n                                  type: string\n                                diskURI:\n                                  description: diskURI is the URI of data disk in\n                                    the blob storage\n                                  type: string\n                                fsType:\n                                  description: |-\n                                    fsType is Filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                kind:\n                                  description: 'kind expected values are Shared: multiple\n                                    blob disks per storage account  Dedicated: single\n                                    blob disk per storage account  Managed: azure\n                                    managed data disk (only in managed availability\n                                    set). defaults to shared'\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly Defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                              required:\n                              - diskName\n                              - diskURI\n                              type: object\n                            azureFile:\n                              description: azureFile represents an Azure File Service\n                                mount on the host and bind mount to the pod.\n                              properties:\n                                readOnly:\n                                  description: |-\n                                    readOnly defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                secretName:\n                                  description: secretName is the  name of secret that\n                                    contains Azure Storage Account Name and Key\n                                  type: string\n                                shareName:\n                                  description: shareName is the azure share Name\n                                  type: string\n                              required:\n                              - secretName\n                              - shareName\n                              type: object\n                            cephfs:\n                              description: cephFS represents a Ceph FS mount on the\n                                host that shares a pod's lifetime\n                              properties:\n                                monitors:\n                                  description: |-\n                                    monitors is Required: Monitors is a collection of Ceph monitors\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  items:\n                                    type: string\n                                  type: array\n                                path:\n                                  description: 'path is Optional: Used as the mounted\n                                    root, rather than the full Ceph tree, default\n                                    is /'\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  type: boolean\n                                secretFile:\n                                  description: |-\n                                    secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  type: string\n                                secretRef:\n                                  description: |-\n                                    secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                user:\n                                  description: |-\n                                    user is optional: User is the rados user name, default is admin\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  type: string\n                              required:\n                              - monitors\n                              type: object\n                            cinder:\n                              description: |-\n                                cinder represents a cinder volume attached and mounted on kubelets host machine.\n                                More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                    More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef is optional: points to a secret object containing parameters used to connect\n                                    to OpenStack.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                volumeID:\n                                  description: |-\n                                    volumeID used to identify the volume in cinder.\n                                    More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                  type: string\n                              required:\n                              - volumeID\n                              type: object\n                            configMap:\n                              description: configMap represents a configMap that should\n                                populate this volume\n                              properties:\n                                defaultMode:\n                                  description: |-\n                                    defaultMode is optional: mode bits used to set permissions on created files by default.\n                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                    Defaults to 0644.\n                                    Directories within the path are not affected by this setting.\n                                    This might be in conflict with other options that affect the file\n                                    mode, like fsGroup, and the result can be other mode bits set.\n                                  format: int32\n                                  type: integer\n                                items:\n                                  description: |-\n                                    items if unspecified, each key-value pair in the Data field of the referenced\n                                    ConfigMap will be projected into the volume as a file whose name is the\n                                    key and content is the value. If specified, the listed keys will be\n                                    projected into the specified paths, and unlisted keys will not be\n                                    present. If a key is specified which is not present in the ConfigMap,\n                                    the volume setup will error unless it is marked optional. Paths must be\n                                    relative and may not contain the '..' path or start with '..'.\n                                  items:\n                                    description: Maps a string key to a path within\n                                      a volume.\n                                    properties:\n                                      key:\n                                        description: key is the key to project.\n                                        type: string\n                                      mode:\n                                        description: |-\n                                          mode is Optional: mode bits used to set permissions on this file.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          If not specified, the volume defaultMode will be used.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      path:\n                                        description: |-\n                                          path is the relative path of the file to map the key to.\n                                          May not be an absolute path.\n                                          May not contain the path element '..'.\n                                          May not start with the string '..'.\n                                        type: string\n                                    required:\n                                    - key\n                                    - path\n                                    type: object\n                                  type: array\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                                optional:\n                                  description: optional specify whether the ConfigMap\n                                    or its keys must be defined\n                                  type: boolean\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            csi:\n                              description: csi (Container Storage Interface) represents\n                                ephemeral storage that is handled by certain external\n                                CSI drivers (Beta feature).\n                              properties:\n                                driver:\n                                  description: |-\n                                    driver is the name of the CSI driver that handles this volume.\n                                    Consult with your admin for the correct name as registered in the cluster.\n                                  type: string\n                                fsType:\n                                  description: |-\n                                    fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                    If not provided, the empty value is passed to the associated CSI driver\n                                    which will determine the default filesystem to apply.\n                                  type: string\n                                nodePublishSecretRef:\n                                  description: |-\n                                    nodePublishSecretRef is a reference to the secret object containing\n                                    sensitive information to pass to the CSI driver to complete the CSI\n                                    NodePublishVolume and NodeUnpublishVolume calls.\n                                    This field is optional, and  may be empty if no secret is required. If the\n                                    secret object contains more than one secret, all secret references are passed.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                readOnly:\n                                  description: |-\n                                    readOnly specifies a read-only configuration for the volume.\n                                    Defaults to false (read/write).\n                                  type: boolean\n                                volumeAttributes:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    volumeAttributes stores driver-specific properties that are passed to the CSI\n                                    driver. Consult your driver's documentation for supported values.\n                                  type: object\n                              required:\n                              - driver\n                              type: object\n                            downwardAPI:\n                              description: downwardAPI represents downward API about\n                                the pod that should populate this volume\n                              properties:\n                                defaultMode:\n                                  description: |-\n                                    Optional: mode bits to use on created files by default. Must be a\n                                    Optional: mode bits used to set permissions on created files by default.\n                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                    Defaults to 0644.\n                                    Directories within the path are not affected by this setting.\n                                    This might be in conflict with other options that affect the file\n                                    mode, like fsGroup, and the result can be other mode bits set.\n                                  format: int32\n                                  type: integer\n                                items:\n                                  description: Items is a list of downward API volume\n                                    file\n                                  items:\n                                    description: DownwardAPIVolumeFile represents\n                                      information to create the file containing the\n                                      pod field\n                                    properties:\n                                      fieldRef:\n                                        description: 'Required: Selects a field of\n                                          the pod: only annotations, labels, name\n                                          and namespace are supported.'\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      mode:\n                                        description: |-\n                                          Optional: mode bits used to set permissions on this file, must be an octal value\n                                          between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          If not specified, the volume defaultMode will be used.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      path:\n                                        description: 'Required: Path is  the relative\n                                          path name of the file to be created. Must\n                                          not be absolute or contain the ''..'' path.\n                                          Must be utf-8 encoded. The first item of\n                                          the relative path must not start with ''..'''\n                                        type: string\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    required:\n                                    - path\n                                    type: object\n                                  type: array\n                              type: object\n                            emptyDir:\n                              description: |-\n                                emptyDir represents a temporary directory that shares a pod's lifetime.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                              properties:\n                                medium:\n                                  description: |-\n                                    medium represents what type of storage medium should back this directory.\n                                    The default is \"\" which means to use the node's default medium.\n                                    Must be an empty string (default) or Memory.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                  type: string\n                                sizeLimit:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                    The size limit is also applicable for memory medium.\n                                    The maximum usage on memory medium EmptyDir would be the minimum value between\n                                    the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                    The default is nil which means that the limit is undefined.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                              type: object\n                            ephemeral:\n                              description: |-\n                                ephemeral represents a volume that is handled by a cluster storage driver.\n                                The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                                and deleted when the pod is removed.\n\n\n                                Use this if:\n                                a) the volume is only needed while the pod runs,\n                                b) features of normal volumes like restoring from snapshot or capacity\n                                   tracking are needed,\n                                c) the storage driver is specified through a storage class, and\n                                d) the storage driver supports dynamic volume provisioning through\n                                   a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                   information on the connection between this volume type\n                                   and PersistentVolumeClaim).\n\n\n                                Use PersistentVolumeClaim or one of the vendor-specific\n                                APIs for volumes that persist for longer than the lifecycle\n                                of an individual pod.\n\n\n                                Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                                be used that way - see the documentation of the driver for\n                                more information.\n\n\n                                A pod can use both types of ephemeral volumes and\n                                persistent volumes at the same time.\n                              properties:\n                                volumeClaimTemplate:\n                                  description: |-\n                                    Will be used to create a stand-alone PVC to provision the volume.\n                                    The pod in which this EphemeralVolumeSource is embedded will be the\n                                    owner of the PVC, i.e. the PVC will be deleted together with the\n                                    pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                    `<volume name>` is the name from the `PodSpec.Volumes` array\n                                    entry. Pod validation will reject the pod if the concatenated name\n                                    is not valid for a PVC (for example, too long).\n\n\n                                    An existing PVC with that name that is not owned by the pod\n                                    will *not* be used for the pod to avoid using an unrelated\n                                    volume by mistake. Starting the pod is then blocked until\n                                    the unrelated PVC is removed. If such a pre-created PVC is\n                                    meant to be used by the pod, the PVC has to updated with an\n                                    owner reference to the pod once the pod exists. Normally\n                                    this should not be necessary, but it may be useful when\n                                    manually reconstructing a broken cluster.\n\n\n                                    This field is read-only and no changes will be made by Kubernetes\n                                    to the PVC after it has been created.\n\n\n                                    Required, must not be nil.\n                                  properties:\n                                    metadata:\n                                      description: |-\n                                        May contain labels and annotations that will be copied into the PVC\n                                        when creating it. No other fields are allowed and will be rejected during\n                                        validation.\n                                      properties:\n                                        annotations:\n                                          additionalProperties:\n                                            type: string\n                                          type: object\n                                        finalizers:\n                                          items:\n                                            type: string\n                                          type: array\n                                        labels:\n                                          additionalProperties:\n                                            type: string\n                                          type: object\n                                        name:\n                                          type: string\n                                        namespace:\n                                          type: string\n                                      type: object\n                                    spec:\n                                      description: |-\n                                        The specification for the PersistentVolumeClaim. The entire content is\n                                        copied unchanged into the PVC that gets created from this\n                                        template. The same fields as in a PersistentVolumeClaim\n                                        are also valid here.\n                                      properties:\n                                        accessModes:\n                                          description: |-\n                                            accessModes contains the desired access modes the volume should have.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                          items:\n                                            type: string\n                                          type: array\n                                        dataSource:\n                                          description: |-\n                                            dataSource field can be used to specify either:\n                                            * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                            * An existing PVC (PersistentVolumeClaim)\n                                            If the provisioner or an external controller can support the specified data source,\n                                            it will create a new volume based on the contents of the specified data source.\n                                            When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                            and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                            If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                          properties:\n                                            apiGroup:\n                                              description: |-\n                                                APIGroup is the group for the resource being referenced.\n                                                If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                For any other third-party types, APIGroup is required.\n                                              type: string\n                                            kind:\n                                              description: Kind is the type of resource\n                                                being referenced\n                                              type: string\n                                            name:\n                                              description: Name is the name of resource\n                                                being referenced\n                                              type: string\n                                          required:\n                                          - kind\n                                          - name\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        dataSourceRef:\n                                          description: |-\n                                            dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                            volume is desired. This may be any object from a non-empty API group (non\n                                            core object) or a PersistentVolumeClaim object.\n                                            When this field is specified, volume binding will only succeed if the type of\n                                            the specified object matches some installed volume populator or dynamic\n                                            provisioner.\n                                            This field will replace the functionality of the dataSource field and as such\n                                            if both fields are non-empty, they must have the same value. For backwards\n                                            compatibility, when namespace isn't specified in dataSourceRef,\n                                            both fields (dataSource and dataSourceRef) will be set to the same\n                                            value automatically if one of them is empty and the other is non-empty.\n                                            When namespace is specified in dataSourceRef,\n                                            dataSource isn't set to the same value and must be empty.\n                                            There are three important differences between dataSource and dataSourceRef:\n                                            * While dataSource only allows two specific types of objects, dataSourceRef\n                                              allows any non-core object, as well as PersistentVolumeClaim objects.\n                                            * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                              preserves all values, and generates an error if a disallowed value is\n                                              specified.\n                                            * While dataSource only allows local objects, dataSourceRef allows objects\n                                              in any namespaces.\n                                            (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                            (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                          properties:\n                                            apiGroup:\n                                              description: |-\n                                                APIGroup is the group for the resource being referenced.\n                                                If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                For any other third-party types, APIGroup is required.\n                                              type: string\n                                            kind:\n                                              description: Kind is the type of resource\n                                                being referenced\n                                              type: string\n                                            name:\n                                              description: Name is the name of resource\n                                                being referenced\n                                              type: string\n                                            namespace:\n                                              description: |-\n                                                Namespace is the namespace of resource being referenced\n                                                Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                                (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                              type: string\n                                          required:\n                                          - kind\n                                          - name\n                                          type: object\n                                        resources:\n                                          description: |-\n                                            resources represents the minimum resources the volume should have.\n                                            If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                            that are lower than previous value but must still be higher than capacity recorded in the\n                                            status field of the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                          properties:\n                                            limits:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Limits describes the maximum amount of compute resources allowed.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                            requests:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Requests describes the minimum amount of compute resources required.\n                                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                          type: object\n                                        selector:\n                                          description: selector is a label query over\n                                            volumes to consider for binding.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        storageClassName:\n                                          description: |-\n                                            storageClassName is the name of the StorageClass required by the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                          type: string\n                                        volumeAttributesClassName:\n                                          description: |-\n                                            volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                            If specified, the CSI driver will create or update the volume with the attributes defined\n                                            in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                            it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                            will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                            If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                            will be set by the persistentvolume controller if it exists.\n                                            If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                            set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                            exists.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                            (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                          type: string\n                                        volumeMode:\n                                          description: |-\n                                            volumeMode defines what type of volume is required by the claim.\n                                            Value of Filesystem is implied when not included in claim spec.\n                                          type: string\n                                        volumeName:\n                                          description: volumeName is the binding reference\n                                            to the PersistentVolume backing this claim.\n                                          type: string\n                                      type: object\n                                  required:\n                                  - spec\n                                  type: object\n                              type: object\n                            fc:\n                              description: fc represents a Fibre Channel resource\n                                that is attached to a kubelet's host machine and then\n                                exposed to the pod.\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                lun:\n                                  description: 'lun is Optional: FC target lun number'\n                                  format: int32\n                                  type: integer\n                                readOnly:\n                                  description: |-\n                                    readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                targetWWNs:\n                                  description: 'targetWWNs is Optional: FC target\n                                    worldwide names (WWNs)'\n                                  items:\n                                    type: string\n                                  type: array\n                                wwids:\n                                  description: |-\n                                    wwids Optional: FC volume world wide identifiers (wwids)\n                                    Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            flexVolume:\n                              description: |-\n                                flexVolume represents a generic volume resource that is\n                                provisioned/attached using an exec based plugin.\n                              properties:\n                                driver:\n                                  description: driver is the name of the driver to\n                                    use for this volume.\n                                  type: string\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                  type: string\n                                options:\n                                  additionalProperties:\n                                    type: string\n                                  description: 'options is Optional: this field holds\n                                    extra command options if any.'\n                                  type: object\n                                readOnly:\n                                  description: |-\n                                    readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef is Optional: secretRef is reference to the secret object containing\n                                    sensitive information to pass to the plugin scripts. This may be\n                                    empty if no secret object is specified. If the secret object\n                                    contains more than one secret, all secrets are passed to the plugin\n                                    scripts.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                              required:\n                              - driver\n                              type: object\n                            flocker:\n                              description: flocker represents a Flocker volume attached\n                                to a kubelet's host machine. This depends on the Flocker\n                                control service being running\n                              properties:\n                                datasetName:\n                                  description: |-\n                                    datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                    should be considered as deprecated\n                                  type: string\n                                datasetUUID:\n                                  description: datasetUUID is the UUID of the dataset.\n                                    This is unique identifier of a Flocker dataset\n                                  type: string\n                              type: object\n                            gcePersistentDisk:\n                              description: |-\n                                gcePersistentDisk represents a GCE Disk resource that is attached to a\n                                kubelet's host machine and then exposed to the pod.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is filesystem type of the volume that you want to mount.\n                                    Tip: Ensure that the filesystem type is supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                partition:\n                                  description: |-\n                                    partition is the partition in the volume that you want to mount.\n                                    If omitted, the default is to mount by volume name.\n                                    Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                    Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  format: int32\n                                  type: integer\n                                pdName:\n                                  description: |-\n                                    pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the ReadOnly setting in VolumeMounts.\n                                    Defaults to false.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  type: boolean\n                              required:\n                              - pdName\n                              type: object\n                            gitRepo:\n                              description: |-\n                                gitRepo represents a git repository at a particular revision.\n                                DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                                EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                                into the Pod's container.\n                              properties:\n                                directory:\n                                  description: |-\n                                    directory is the target directory name.\n                                    Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                    git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                    the subdirectory with the given name.\n                                  type: string\n                                repository:\n                                  description: repository is the URL\n                                  type: string\n                                revision:\n                                  description: revision is the commit hash for the\n                                    specified revision.\n                                  type: string\n                              required:\n                              - repository\n                              type: object\n                            glusterfs:\n                              description: |-\n                                glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                                More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                              properties:\n                                endpoints:\n                                  description: |-\n                                    endpoints is the endpoint name that details Glusterfs topology.\n                                    More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                  type: string\n                                path:\n                                  description: |-\n                                    path is the Glusterfs volume path.\n                                    More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                    Defaults to false.\n                                    More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                  type: boolean\n                              required:\n                              - endpoints\n                              - path\n                              type: object\n                            hostPath:\n                              description: |-\n                                hostPath represents a pre-existing file or directory on the host\n                                machine that is directly exposed to the container. This is generally\n                                used for system agents or other privileged things that are allowed\n                                to see the host machine. Most containers will NOT need this.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                ---\n                                TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                                mount host directories as read/write.\n                              properties:\n                                path:\n                                  description: |-\n                                    path of the directory on the host.\n                                    If the path is a symlink, it will follow the link to the real path.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                  type: string\n                                type:\n                                  description: |-\n                                    type for HostPath Volume\n                                    Defaults to \"\"\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                  type: string\n                              required:\n                              - path\n                              type: object\n                            iscsi:\n                              description: |-\n                                iscsi represents an ISCSI Disk resource that is attached to a\n                                kubelet's host machine and then exposed to the pod.\n                                More info: https://examples.k8s.io/volumes/iscsi/README.md\n                              properties:\n                                chapAuthDiscovery:\n                                  description: chapAuthDiscovery defines whether support\n                                    iSCSI Discovery CHAP authentication\n                                  type: boolean\n                                chapAuthSession:\n                                  description: chapAuthSession defines whether support\n                                    iSCSI Session CHAP authentication\n                                  type: boolean\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type of the volume that you want to mount.\n                                    Tip: Ensure that the filesystem type is supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                initiatorName:\n                                  description: |-\n                                    initiatorName is the custom iSCSI Initiator Name.\n                                    If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                    <target portal>:<volume name> will be created for the connection.\n                                  type: string\n                                iqn:\n                                  description: iqn is the target iSCSI Qualified Name.\n                                  type: string\n                                iscsiInterface:\n                                  description: |-\n                                    iscsiInterface is the interface Name that uses an iSCSI transport.\n                                    Defaults to 'default' (tcp).\n                                  type: string\n                                lun:\n                                  description: lun represents iSCSI Target Lun number.\n                                  format: int32\n                                  type: integer\n                                portals:\n                                  description: |-\n                                    portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                    is other than default (typically TCP ports 860 and 3260).\n                                  items:\n                                    type: string\n                                  type: array\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the ReadOnly setting in VolumeMounts.\n                                    Defaults to false.\n                                  type: boolean\n                                secretRef:\n                                  description: secretRef is the CHAP Secret for iSCSI\n                                    target and initiator authentication\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                targetPortal:\n                                  description: |-\n                                    targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                    is other than default (typically TCP ports 860 and 3260).\n                                  type: string\n                              required:\n                              - iqn\n                              - lun\n                              - targetPortal\n                              type: object\n                            name:\n                              description: |-\n                                name of the volume.\n                                Must be a DNS_LABEL and unique within the pod.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              type: string\n                            nfs:\n                              description: |-\n                                nfs represents an NFS mount on the host that shares a pod's lifetime\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                              properties:\n                                path:\n                                  description: |-\n                                    path that is exported by the NFS server.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the NFS export to be mounted with read-only permissions.\n                                    Defaults to false.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                  type: boolean\n                                server:\n                                  description: |-\n                                    server is the hostname or IP address of the NFS server.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                  type: string\n                              required:\n                              - path\n                              - server\n                              type: object\n                            persistentVolumeClaim:\n                              description: |-\n                                persistentVolumeClaimVolumeSource represents a reference to a\n                                PersistentVolumeClaim in the same namespace.\n                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                              properties:\n                                claimName:\n                                  description: |-\n                                    claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly Will force the ReadOnly setting in VolumeMounts.\n                                    Default false.\n                                  type: boolean\n                              required:\n                              - claimName\n                              type: object\n                            photonPersistentDisk:\n                              description: photonPersistentDisk represents a PhotonController\n                                persistent disk attached and mounted on kubelets host\n                                machine\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                pdID:\n                                  description: pdID is the ID that identifies Photon\n                                    Controller persistent disk\n                                  type: string\n                              required:\n                              - pdID\n                              type: object\n                            portworxVolume:\n                              description: portworxVolume represents a portworx volume\n                                attached and mounted on kubelets host machine\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fSType represents the filesystem type to mount\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                volumeID:\n                                  description: volumeID uniquely identifies a Portworx\n                                    volume\n                                  type: string\n                              required:\n                              - volumeID\n                              type: object\n                            projected:\n                              description: projected items for all in one resources\n                                secrets, configmaps, and downward API\n                              properties:\n                                defaultMode:\n                                  description: |-\n                                    defaultMode are the mode bits used to set permissions on created files by default.\n                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                    Directories within the path are not affected by this setting.\n                                    This might be in conflict with other options that affect the file\n                                    mode, like fsGroup, and the result can be other mode bits set.\n                                  format: int32\n                                  type: integer\n                                sources:\n                                  description: sources is the list of volume projections\n                                  items:\n                                    description: Projection that may be projected\n                                      along with other supported volume types\n                                    properties:\n                                      clusterTrustBundle:\n                                        description: |-\n                                          ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                          of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                          Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                          ClusterTrustBundle objects can either be selected by name, or by the\n                                          combination of signer name and a label selector.\n\n\n                                          Kubelet performs aggressive normalization of the PEM contents written\n                                          into the pod filesystem.  Esoteric PEM features such as inter-block\n                                          comments and block headers are stripped.  Certificates are deduplicated.\n                                          The ordering of certificates within the file is arbitrary, and Kubelet\n                                          may change the order over time.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              Select all ClusterTrustBundles that match this label selector.  Only has\n                                              effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                              interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                              everything\".\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          name:\n                                            description: |-\n                                              Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                              with signerName and labelSelector.\n                                            type: string\n                                          optional:\n                                            description: |-\n                                              If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                              aren't available.  If using name, then the named ClusterTrustBundle is\n                                              allowed not to exist.  If using signerName, then the combination of\n                                              signerName and labelSelector is allowed to match zero\n                                              ClusterTrustBundles.\n                                            type: boolean\n                                          path:\n                                            description: Relative path from the volume\n                                              root to write the bundle.\n                                            type: string\n                                          signerName:\n                                            description: |-\n                                              Select all ClusterTrustBundles that match this signer name.\n                                              Mutually-exclusive with name.  The contents of all selected\n                                              ClusterTrustBundles will be unified and deduplicated.\n                                            type: string\n                                        required:\n                                        - path\n                                        type: object\n                                      configMap:\n                                        description: configMap information about the\n                                          configMap data to project\n                                        properties:\n                                          items:\n                                            description: |-\n                                              items if unspecified, each key-value pair in the Data field of the referenced\n                                              ConfigMap will be projected into the volume as a file whose name is the\n                                              key and content is the value. If specified, the listed keys will be\n                                              projected into the specified paths, and unlisted keys will not be\n                                              present. If a key is specified which is not present in the ConfigMap,\n                                              the volume setup will error unless it is marked optional. Paths must be\n                                              relative and may not contain the '..' path or start with '..'.\n                                            items:\n                                              description: Maps a string key to a\n                                                path within a volume.\n                                              properties:\n                                                key:\n                                                  description: key is the key to project.\n                                                  type: string\n                                                mode:\n                                                  description: |-\n                                                    mode is Optional: mode bits used to set permissions on this file.\n                                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                    If not specified, the volume defaultMode will be used.\n                                                    This might be in conflict with other options that affect the file\n                                                    mode, like fsGroup, and the result can be other mode bits set.\n                                                  format: int32\n                                                  type: integer\n                                                path:\n                                                  description: |-\n                                                    path is the relative path of the file to map the key to.\n                                                    May not be an absolute path.\n                                                    May not contain the path element '..'.\n                                                    May not start with the string '..'.\n                                                  type: string\n                                              required:\n                                              - key\n                                              - path\n                                              type: object\n                                            type: array\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: optional specify whether\n                                              the ConfigMap or its keys must be defined\n                                            type: boolean\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      downwardAPI:\n                                        description: downwardAPI information about\n                                          the downwardAPI data to project\n                                        properties:\n                                          items:\n                                            description: Items is a list of DownwardAPIVolume\n                                              file\n                                            items:\n                                              description: DownwardAPIVolumeFile represents\n                                                information to create the file containing\n                                                the pod field\n                                              properties:\n                                                fieldRef:\n                                                  description: 'Required: Selects\n                                                    a field of the pod: only annotations,\n                                                    labels, name and namespace are\n                                                    supported.'\n                                                  properties:\n                                                    apiVersion:\n                                                      description: Version of the\n                                                        schema the FieldPath is written\n                                                        in terms of, defaults to \"v1\".\n                                                      type: string\n                                                    fieldPath:\n                                                      description: Path of the field\n                                                        to select in the specified\n                                                        API version.\n                                                      type: string\n                                                  required:\n                                                  - fieldPath\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                mode:\n                                                  description: |-\n                                                    Optional: mode bits used to set permissions on this file, must be an octal value\n                                                    between 0000 and 0777 or a decimal value between 0 and 511.\n                                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                    If not specified, the volume defaultMode will be used.\n                                                    This might be in conflict with other options that affect the file\n                                                    mode, like fsGroup, and the result can be other mode bits set.\n                                                  format: int32\n                                                  type: integer\n                                                path:\n                                                  description: 'Required: Path is  the\n                                                    relative path name of the file\n                                                    to be created. Must not be absolute\n                                                    or contain the ''..'' path. Must\n                                                    be utf-8 encoded. The first item\n                                                    of the relative path must not\n                                                    start with ''..'''\n                                                  type: string\n                                                resourceFieldRef:\n                                                  description: |-\n                                                    Selects a resource of the container: only resources limits and requests\n                                                    (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                  properties:\n                                                    containerName:\n                                                      description: 'Container name:\n                                                        required for volumes, optional\n                                                        for env vars'\n                                                      type: string\n                                                    divisor:\n                                                      anyOf:\n                                                      - type: integer\n                                                      - type: string\n                                                      description: Specifies the output\n                                                        format of the exposed resources,\n                                                        defaults to \"1\"\n                                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                      x-kubernetes-int-or-string: true\n                                                    resource:\n                                                      description: 'Required: resource\n                                                        to select'\n                                                      type: string\n                                                  required:\n                                                  - resource\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                              required:\n                                              - path\n                                              type: object\n                                            type: array\n                                        type: object\n                                      secret:\n                                        description: secret information about the\n                                          secret data to project\n                                        properties:\n                                          items:\n                                            description: |-\n                                              items if unspecified, each key-value pair in the Data field of the referenced\n                                              Secret will be projected into the volume as a file whose name is the\n                                              key and content is the value. If specified, the listed keys will be\n                                              projected into the specified paths, and unlisted keys will not be\n                                              present. If a key is specified which is not present in the Secret,\n                                              the volume setup will error unless it is marked optional. Paths must be\n                                              relative and may not contain the '..' path or start with '..'.\n                                            items:\n                                              description: Maps a string key to a\n                                                path within a volume.\n                                              properties:\n                                                key:\n                                                  description: key is the key to project.\n                                                  type: string\n                                                mode:\n                                                  description: |-\n                                                    mode is Optional: mode bits used to set permissions on this file.\n                                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                    If not specified, the volume defaultMode will be used.\n                                                    This might be in conflict with other options that affect the file\n                                                    mode, like fsGroup, and the result can be other mode bits set.\n                                                  format: int32\n                                                  type: integer\n                                                path:\n                                                  description: |-\n                                                    path is the relative path of the file to map the key to.\n                                                    May not be an absolute path.\n                                                    May not contain the path element '..'.\n                                                    May not start with the string '..'.\n                                                  type: string\n                                              required:\n                                              - key\n                                              - path\n                                              type: object\n                                            type: array\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: optional field specify whether\n                                              the Secret or its key must be defined\n                                            type: boolean\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      serviceAccountToken:\n                                        description: serviceAccountToken is information\n                                          about the serviceAccountToken data to project\n                                        properties:\n                                          audience:\n                                            description: |-\n                                              audience is the intended audience of the token. A recipient of a token\n                                              must identify itself with an identifier specified in the audience of the\n                                              token, and otherwise should reject the token. The audience defaults to the\n                                              identifier of the apiserver.\n                                            type: string\n                                          expirationSeconds:\n                                            description: |-\n                                              expirationSeconds is the requested duration of validity of the service\n                                              account token. As the token approaches expiration, the kubelet volume\n                                              plugin will proactively rotate the service account token. The kubelet will\n                                              start trying to rotate the token if the token is older than 80 percent of\n                                              its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                              and must be at least 10 minutes.\n                                            format: int64\n                                            type: integer\n                                          path:\n                                            description: |-\n                                              path is the path relative to the mount point of the file to project the\n                                              token into.\n                                            type: string\n                                        required:\n                                        - path\n                                        type: object\n                                    type: object\n                                  type: array\n                              type: object\n                            quobyte:\n                              description: quobyte represents a Quobyte mount on the\n                                host that shares a pod's lifetime\n                              properties:\n                                group:\n                                  description: |-\n                                    group to map volume access to\n                                    Default is no group\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                    Defaults to false.\n                                  type: boolean\n                                registry:\n                                  description: |-\n                                    registry represents a single or multiple Quobyte Registry services\n                                    specified as a string as host:port pair (multiple entries are separated with commas)\n                                    which acts as the central registry for volumes\n                                  type: string\n                                tenant:\n                                  description: |-\n                                    tenant owning the given Quobyte volume in the Backend\n                                    Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                  type: string\n                                user:\n                                  description: |-\n                                    user to map volume access to\n                                    Defaults to serivceaccount user\n                                  type: string\n                                volume:\n                                  description: volume is a string that references\n                                    an already created Quobyte volume by name.\n                                  type: string\n                              required:\n                              - registry\n                              - volume\n                              type: object\n                            rbd:\n                              description: |-\n                                rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type of the volume that you want to mount.\n                                    Tip: Ensure that the filesystem type is supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                image:\n                                  description: |-\n                                    image is the rados image name.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: string\n                                keyring:\n                                  description: |-\n                                    keyring is the path to key ring for RBDUser.\n                                    Default is /etc/ceph/keyring.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: string\n                                monitors:\n                                  description: |-\n                                    monitors is a collection of Ceph monitors.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  items:\n                                    type: string\n                                  type: array\n                                pool:\n                                  description: |-\n                                    pool is the rados pool name.\n                                    Default is rbd.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the ReadOnly setting in VolumeMounts.\n                                    Defaults to false.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef is name of the authentication secret for RBDUser. If provided\n                                    overrides keyring.\n                                    Default is nil.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                user:\n                                  description: |-\n                                    user is the rados user name.\n                                    Default is admin.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: string\n                              required:\n                              - image\n                              - monitors\n                              type: object\n                            scaleIO:\n                              description: scaleIO represents a ScaleIO persistent\n                                volume attached and mounted on Kubernetes nodes.\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                    Default is \"xfs\".\n                                  type: string\n                                gateway:\n                                  description: gateway is the host address of the\n                                    ScaleIO API Gateway.\n                                  type: string\n                                protectionDomain:\n                                  description: protectionDomain is the name of the\n                                    ScaleIO Protection Domain for the configured storage.\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly Defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef references to the secret for ScaleIO user and other\n                                    sensitive information. If this is not provided, Login operation will fail.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                sslEnabled:\n                                  description: sslEnabled Flag enable/disable SSL\n                                    communication with Gateway, default false\n                                  type: boolean\n                                storageMode:\n                                  description: |-\n                                    storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                    Default is ThinProvisioned.\n                                  type: string\n                                storagePool:\n                                  description: storagePool is the ScaleIO Storage\n                                    Pool associated with the protection domain.\n                                  type: string\n                                system:\n                                  description: system is the name of the storage system\n                                    as configured in ScaleIO.\n                                  type: string\n                                volumeName:\n                                  description: |-\n                                    volumeName is the name of a volume already created in the ScaleIO system\n                                    that is associated with this volume source.\n                                  type: string\n                              required:\n                              - gateway\n                              - secretRef\n                              - system\n                              type: object\n                            secret:\n                              description: |-\n                                secret represents a secret that should populate this volume.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                              properties:\n                                defaultMode:\n                                  description: |-\n                                    defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                    YAML accepts both octal and decimal values, JSON requires decimal values\n                                    for mode bits. Defaults to 0644.\n                                    Directories within the path are not affected by this setting.\n                                    This might be in conflict with other options that affect the file\n                                    mode, like fsGroup, and the result can be other mode bits set.\n                                  format: int32\n                                  type: integer\n                                items:\n                                  description: |-\n                                    items If unspecified, each key-value pair in the Data field of the referenced\n                                    Secret will be projected into the volume as a file whose name is the\n                                    key and content is the value. If specified, the listed keys will be\n                                    projected into the specified paths, and unlisted keys will not be\n                                    present. If a key is specified which is not present in the Secret,\n                                    the volume setup will error unless it is marked optional. Paths must be\n                                    relative and may not contain the '..' path or start with '..'.\n                                  items:\n                                    description: Maps a string key to a path within\n                                      a volume.\n                                    properties:\n                                      key:\n                                        description: key is the key to project.\n                                        type: string\n                                      mode:\n                                        description: |-\n                                          mode is Optional: mode bits used to set permissions on this file.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          If not specified, the volume defaultMode will be used.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      path:\n                                        description: |-\n                                          path is the relative path of the file to map the key to.\n                                          May not be an absolute path.\n                                          May not contain the path element '..'.\n                                          May not start with the string '..'.\n                                        type: string\n                                    required:\n                                    - key\n                                    - path\n                                    type: object\n                                  type: array\n                                optional:\n                                  description: optional field specify whether the\n                                    Secret or its keys must be defined\n                                  type: boolean\n                                secretName:\n                                  description: |-\n                                    secretName is the name of the secret in the pod's namespace to use.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                  type: string\n                              type: object\n                            storageos:\n                              description: storageOS represents a StorageOS volume\n                                attached and mounted on Kubernetes nodes.\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef specifies the secret to use for obtaining the StorageOS API\n                                    credentials.  If not specified, default values will be attempted.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                volumeName:\n                                  description: |-\n                                    volumeName is the human-readable name of the StorageOS volume.  Volume\n                                    names are only unique within a namespace.\n                                  type: string\n                                volumeNamespace:\n                                  description: |-\n                                    volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                    namespace is specified then the Pod's namespace will be used.  This allows the\n                                    Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                    Set VolumeName to any name to override the default behaviour.\n                                    Set to \"default\" if you are not using namespaces within StorageOS.\n                                    Namespaces that do not pre-exist within StorageOS will be created.\n                                  type: string\n                              type: object\n                            vsphereVolume:\n                              description: vsphereVolume represents a vSphere volume\n                                attached and mounted on kubelets host machine\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                storagePolicyID:\n                                  description: storagePolicyID is the storage Policy\n                                    Based Management (SPBM) profile ID associated\n                                    with the StoragePolicyName.\n                                  type: string\n                                storagePolicyName:\n                                  description: storagePolicyName is the storage Policy\n                                    Based Management (SPBM) profile name.\n                                  type: string\n                                volumePath:\n                                  description: volumePath is the path that identifies\n                                    vSphere volume vmdk\n                                  type: string\n                              required:\n                              - volumePath\n                              type: object\n                          required:\n                          - name\n                          type: object\n                        type: array\n                    required:\n                    - containers\n                    type: object\n                type: object\n              templateVars:\n                additionalProperties:\n                  type: string\n                description: Provides variables which are used to call Actions.\n                type: object\n              volumeClaimTemplates:\n                description: |-\n                  Specifies a list of PersistentVolumeClaim templates that define the storage requirements for each replica.\n                  Each template specifies the desired characteristics of a persistent volume, such as storage class,\n                  size, and access modes.\n                  These templates are used to dynamically provision persistent volumes for replicas upon their creation.\n                  The final name of each PVC is generated by appending the pod's identifier to the name specified in volumeClaimTemplates[*].name.\n                items:\n                  description: PersistentVolumeClaim is a user's request for and claim\n                    to a persistent volume\n                  properties:\n                    apiVersion:\n                      description: |-\n                        APIVersion defines the versioned schema of this representation of an object.\n                        Servers should convert recognized schemas to the latest internal value, and\n                        may reject unrecognized values.\n                        More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n                      type: string\n                    kind:\n                      description: |-\n                        Kind is a string value representing the REST resource this object represents.\n                        Servers may infer this from the endpoint the client submits requests to.\n                        Cannot be updated.\n                        In CamelCase.\n                        More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                      type: string\n                    metadata:\n                      description: |-\n                        Standard object's metadata.\n                        More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata\n                      properties:\n                        annotations:\n                          additionalProperties:\n                            type: string\n                          type: object\n                        finalizers:\n                          items:\n                            type: string\n                          type: array\n                        labels:\n                          additionalProperties:\n                            type: string\n                          type: object\n                        name:\n                          type: string\n                        namespace:\n                          type: string\n                      type: object\n                    spec:\n                      description: |-\n                        spec defines the desired characteristics of a volume requested by a pod author.\n                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                      properties:\n                        accessModes:\n                          description: |-\n                            accessModes contains the desired access modes the volume should have.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                          items:\n                            type: string\n                          type: array\n                        dataSource:\n                          description: |-\n                            dataSource field can be used to specify either:\n                            * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                            * An existing PVC (PersistentVolumeClaim)\n                            If the provisioner or an external controller can support the specified data source,\n                            it will create a new volume based on the contents of the specified data source.\n                            When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                            and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                            If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                          properties:\n                            apiGroup:\n                              description: |-\n                                APIGroup is the group for the resource being referenced.\n                                If APIGroup is not specified, the specified Kind must be in the core API group.\n                                For any other third-party types, APIGroup is required.\n                              type: string\n                            kind:\n                              description: Kind is the type of resource being referenced\n                              type: string\n                            name:\n                              description: Name is the name of resource being referenced\n                              type: string\n                          required:\n                          - kind\n                          - name\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        dataSourceRef:\n                          description: |-\n                            dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                            volume is desired. This may be any object from a non-empty API group (non\n                            core object) or a PersistentVolumeClaim object.\n                            When this field is specified, volume binding will only succeed if the type of\n                            the specified object matches some installed volume populator or dynamic\n                            provisioner.\n                            This field will replace the functionality of the dataSource field and as such\n                            if both fields are non-empty, they must have the same value. For backwards\n                            compatibility, when namespace isn't specified in dataSourceRef,\n                            both fields (dataSource and dataSourceRef) will be set to the same\n                            value automatically if one of them is empty and the other is non-empty.\n                            When namespace is specified in dataSourceRef,\n                            dataSource isn't set to the same value and must be empty.\n                            There are three important differences between dataSource and dataSourceRef:\n                            * While dataSource only allows two specific types of objects, dataSourceRef\n                              allows any non-core object, as well as PersistentVolumeClaim objects.\n                            * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                              preserves all values, and generates an error if a disallowed value is\n                              specified.\n                            * While dataSource only allows local objects, dataSourceRef allows objects\n                              in any namespaces.\n                            (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                            (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                          properties:\n                            apiGroup:\n                              description: |-\n                                APIGroup is the group for the resource being referenced.\n                                If APIGroup is not specified, the specified Kind must be in the core API group.\n                                For any other third-party types, APIGroup is required.\n                              type: string\n                            kind:\n                              description: Kind is the type of resource being referenced\n                              type: string\n                            name:\n                              description: Name is the name of resource being referenced\n                              type: string\n                            namespace:\n                              description: |-\n                                Namespace is the namespace of resource being referenced\n                                Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                              type: string\n                          required:\n                          - kind\n                          - name\n                          type: object\n                        resources:\n                          description: |-\n                            resources represents the minimum resources the volume should have.\n                            If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                            that are lower than previous value but must still be higher than capacity recorded in the\n                            status field of the claim.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                          properties:\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                        selector:\n                          description: selector is a label query over volumes to consider\n                            for binding.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        storageClassName:\n                          description: |-\n                            storageClassName is the name of the StorageClass required by the claim.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                          type: string\n                        volumeAttributesClassName:\n                          description: |-\n                            volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                            If specified, the CSI driver will create or update the volume with the attributes defined\n                            in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                            it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                            will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                            If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                            will be set by the persistentvolume controller if it exists.\n                            If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                            set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                            exists.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                            (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                          type: string\n                        volumeMode:\n                          description: |-\n                            volumeMode defines what type of volume is required by the claim.\n                            Value of Filesystem is implied when not included in claim spec.\n                          type: string\n                        volumeName:\n                          description: volumeName is the binding reference to the\n                            PersistentVolume backing this claim.\n                          type: string\n                      type: object\n                    status:\n                      description: |-\n                        status represents the current information/status of a persistent volume claim.\n                        Read-only.\n                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                      properties:\n                        accessModes:\n                          description: |-\n                            accessModes contains the actual access modes the volume backing the PVC has.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                          items:\n                            type: string\n                          type: array\n                        allocatedResourceStatuses:\n                          additionalProperties:\n                            description: |-\n                              When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource\n                              that it does not recognizes, then it should ignore that update and let other controllers\n                              handle it.\n                            type: string\n                          description: \"allocatedResourceStatuses stores status of\n                            resource being resized for the given PVC.\\nKey names follow\n                            standard Kubernetes label syntax. Valid values are either:\\n\\t*\n                            Un-prefixed keys:\\n\\t\\t- storage - the capacity of the\n                            volume.\\n\\t* Custom resources must use implementation-defined\n                            prefixed names such as \\\"example.com/my-custom-resource\\\"\\nApart\n                            from above values - keys that are unprefixed or have kubernetes.io\n                            prefix are considered\\nreserved and hence may not be used.\\n\\n\\nClaimResourceStatus\n                            can be in any of following states:\\n\\t- ControllerResizeInProgress:\\n\\t\\tState\n                            set when resize controller starts resizing the volume\n                            in control-plane.\\n\\t- ControllerResizeFailed:\\n\\t\\tState\n                            set when resize has failed in resize controller with a\n                            terminal error.\\n\\t- NodeResizePending:\\n\\t\\tState set\n                            when resize controller has finished resizing the volume\n                            but further resizing of\\n\\t\\tvolume is needed on the node.\\n\\t-\n                            NodeResizeInProgress:\\n\\t\\tState set when kubelet starts\n                            resizing the volume.\\n\\t- NodeResizeFailed:\\n\\t\\tState\n                            set when resizing has failed in kubelet with a terminal\n                            error. Transient errors don't set\\n\\t\\tNodeResizeFailed.\\nFor\n                            example: if expanding a PVC for more capacity - this field\n                            can be one of the following states:\\n\\t- pvc.status.allocatedResourceStatus['storage']\n                            = \\\"ControllerResizeInProgress\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                            = \\\"ControllerResizeFailed\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                            = \\\"NodeResizePending\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                            = \\\"NodeResizeInProgress\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                            = \\\"NodeResizeFailed\\\"\\nWhen this field is not set, it\n                            means that no resize operation is in progress for the\n                            given PVC.\\n\\n\\nA controller that receives PVC update\n                            with previously unknown resourceName or ClaimResourceStatus\\nshould\n                            ignore the update for the purpose it was designed. For\n                            example - a controller that\\nonly is responsible for resizing\n                            capacity of the volume, should ignore PVC updates that\n                            change other valid\\nresources associated with PVC.\\n\\n\\nThis\n                            is an alpha field and requires enabling RecoverVolumeExpansionFailure\n                            feature.\"\n                          type: object\n                          x-kubernetes-map-type: granular\n                        allocatedResources:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: \"allocatedResources tracks the resources allocated\n                            to a PVC including its capacity.\\nKey names follow standard\n                            Kubernetes label syntax. Valid values are either:\\n\\t*\n                            Un-prefixed keys:\\n\\t\\t- storage - the capacity of the\n                            volume.\\n\\t* Custom resources must use implementation-defined\n                            prefixed names such as \\\"example.com/my-custom-resource\\\"\\nApart\n                            from above values - keys that are unprefixed or have kubernetes.io\n                            prefix are considered\\nreserved and hence may not be used.\\n\\n\\nCapacity\n                            reported here may be larger than the actual capacity when\n                            a volume expansion operation\\nis requested.\\nFor storage\n                            quota, the larger value from allocatedResources and PVC.spec.resources\n                            is used.\\nIf allocatedResources is not set, PVC.spec.resources\n                            alone is used for quota calculation.\\nIf a volume expansion\n                            capacity request is lowered, allocatedResources is only\\nlowered\n                            if there are no expansion operations in progress and if\n                            the actual volume capacity\\nis equal or lower than the\n                            requested capacity.\\n\\n\\nA controller that receives PVC\n                            update with previously unknown resourceName\\nshould ignore\n                            the update for the purpose it was designed. For example\n                            - a controller that\\nonly is responsible for resizing\n                            capacity of the volume, should ignore PVC updates that\n                            change other valid\\nresources associated with PVC.\\n\\n\\nThis\n                            is an alpha field and requires enabling RecoverVolumeExpansionFailure\n                            feature.\"\n                          type: object\n                        capacity:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: capacity represents the actual resources of\n                            the underlying volume.\n                          type: object\n                        conditions:\n                          description: |-\n                            conditions is the current Condition of persistent volume claim. If underlying persistent volume is being\n                            resized then the Condition will be set to 'ResizeStarted'.\n                          items:\n                            description: PersistentVolumeClaimCondition contains details\n                              about state of pvc\n                            properties:\n                              lastProbeTime:\n                                description: lastProbeTime is the time we probed the\n                                  condition.\n                                format: date-time\n                                type: string\n                              lastTransitionTime:\n                                description: lastTransitionTime is the time the condition\n                                  transitioned from one status to another.\n                                format: date-time\n                                type: string\n                              message:\n                                description: message is the human-readable message\n                                  indicating details about last transition.\n                                type: string\n                              reason:\n                                description: |-\n                                  reason is a unique, this should be a short, machine understandable string that gives the reason\n                                  for condition's last transition. If it reports \"ResizeStarted\" that means the underlying\n                                  persistent volume is being resized.\n                                type: string\n                              status:\n                                type: string\n                              type:\n                                description: PersistentVolumeClaimConditionType is\n                                  a valid value of PersistentVolumeClaimCondition.Type\n                                type: string\n                            required:\n                            - status\n                            - type\n                            type: object\n                          type: array\n                        currentVolumeAttributesClassName:\n                          description: |-\n                            currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using.\n                            When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim\n                            This is an alpha field and requires enabling VolumeAttributesClass feature.\n                          type: string\n                        modifyVolumeStatus:\n                          description: |-\n                            ModifyVolumeStatus represents the status object of ControllerModifyVolume operation.\n                            When this is unset, there is no ModifyVolume operation being attempted.\n                            This is an alpha field and requires enabling VolumeAttributesClass feature.\n                          properties:\n                            status:\n                              description: \"status is the status of the ControllerModifyVolume\n                                operation. It can be in any of following states:\\n\n                                - Pending\\n   Pending indicates that the PersistentVolumeClaim\n                                cannot be modified due to unmet requirements, such\n                                as\\n   the specified VolumeAttributesClass not existing.\\n\n                                - InProgress\\n   InProgress indicates that the volume\n                                is being modified.\\n - Infeasible\\n  Infeasible indicates\n                                that the request has been rejected as invalid by the\n                                CSI driver. To\\n\\t  resolve the error, a valid VolumeAttributesClass\n                                needs to be specified.\\nNote: New statuses can be\n                                added in the future. Consumers should check for unknown\n                                statuses and fail appropriately.\"\n                              type: string\n                            targetVolumeAttributesClassName:\n                              description: targetVolumeAttributesClassName is the\n                                name of the VolumeAttributesClass the PVC currently\n                                being reconciled\n                              type: string\n                          required:\n                          - status\n                          type: object\n                        phase:\n                          description: phase represents the current phase of PersistentVolumeClaim.\n                          type: string\n                      type: object\n                  type: object\n                type: array\n            required:\n            - selector\n            - template\n            type: object\n          status:\n            description: Represents the current information about the state machine.\n              This data may be out of date.\n            properties:\n              availableReplicas:\n                description: Total number of available instances (ready for at least\n                  minReadySeconds) targeted by this InstanceSet.\n                format: int32\n                type: integer\n              conditions:\n                description: |-\n                  Represents the latest available observations of an instanceset's current state.\n                  Known .status.conditions.type are: \"InstanceFailure\", \"InstanceReady\"\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - type\n                x-kubernetes-list-type: map\n              currentReplicas:\n                description: |-\n                  currentReplicas is the number of instances created by the InstanceSet controller from the InstanceSet version\n                  indicated by CurrentRevisions.\n                format: int32\n                type: integer\n              currentRevision:\n                description: |-\n                  currentRevision, if not empty, indicates the version of the InstanceSet used to generate instances in the\n                  sequence [0,currentReplicas).\n                type: string\n              currentRevisions:\n                additionalProperties:\n                  type: string\n                description: |-\n                  currentRevisions, if not empty, indicates the old version of the InstanceSet used to generate the underlying workload.\n                  key is the pod name, value is the revision.\n                type: object\n              initReplicas:\n                description: |-\n                  Defines the initial number of instances when the cluster is first initialized.\n                  This value is set to spec.Replicas at the time of object creation and remains constant thereafter.\n                  Used only when spec.roles set.\n                format: int32\n                type: integer\n              instanceStatus:\n                description: Provides the status of each instance in the ITS.\n                items:\n                  properties:\n                    configs:\n                      description: The status of configs.\n                      items:\n                        properties:\n                          generation:\n                            description: The generation of the config.\n                            format: int64\n                            type: integer\n                          name:\n                            description: The name of the config.\n                            type: string\n                        required:\n                        - generation\n                        - name\n                        type: object\n                      type: array\n                    podName:\n                      default: Unknown\n                      description: Represents the name of the pod.\n                      type: string\n                  required:\n                  - podName\n                  type: object\n                type: array\n              membersStatus:\n                description: Provides the status of each member in the cluster.\n                items:\n                  properties:\n                    podName:\n                      default: Unknown\n                      description: Represents the name of the pod.\n                      type: string\n                    role:\n                      description: Defines the role of the replica in the cluster.\n                      properties:\n                        name:\n                          description: |-\n                            Name defines the role's unique identifier. This value is used to set the \"apps.kubeblocks.io/role\" label\n                            on the corresponding object to identify its role.\n\n\n                            For example, common role names include:\n                            - \"leader\": The primary/master instance that handles write operations\n                            - \"follower\": Secondary/replica instances that replicate data from the leader\n                            - \"learner\": Read-only instances that don't participate in elections\n\n\n                            This field is immutable once set.\n                          maxLength: 32\n                          pattern: ^.*[^\\s]+.*$\n                          type: string\n                        participatesInQuorum:\n                          default: false\n                          description: |-\n                            ParticipatesInQuorum indicates if pods with this role are counted when determining quorum.\n                            This affects update strategies that need to maintain quorum for availability. Roles participate\n                            in quorum should have higher update priority than roles do not participate in quorum.\n                            The default value is false.\n\n\n                            For example, in a 5-pod component where:\n                            - 2 learner pods (participatesInQuorum=false)\n                            - 2 follower pods (participatesInQuorum=true)\n                            - 1 leader pod (participatesInQuorum=true)\n                            The quorum size would be 3 (based on the 3 participating pods), allowing parallel updates\n                            of 2 learners and 1 follower while maintaining quorum.\n\n\n                            This field is immutable once set.\n                          type: boolean\n                        updatePriority:\n                          default: 0\n                          description: |-\n                            UpdatePriority determines the order in which pods with different roles are updated.\n                            Pods are sorted by this priority (higher numbers = higher priority) and updated accordingly.\n                            Roles with the highest priority will be updated last.\n                            The default priority is 0.\n\n\n                            For example:\n                            - Leader role may have priority 2 (updated last)\n                            - Follower role may have priority 1 (updated before leader)\n                            - Learner role may have priority 0 (updated first)\n\n\n                            This field is immutable once set.\n                          type: integer\n                      required:\n                      - name\n                      type: object\n                  required:\n                  - podName\n                  type: object\n                type: array\n              observedGeneration:\n                description: |-\n                  observedGeneration is the most recent generation observed for this InstanceSet. It corresponds to the\n                  InstanceSet's generation, which is updated on mutation by the API Server.\n                format: int64\n                type: integer\n              readyInitReplicas:\n                description: |-\n                  Represents the number of instances that have already reached the MembersStatus during the cluster initialization stage.\n                  This value remains constant once it equals InitReplicas.\n                  Used only when spec.roles set.\n                format: int32\n                type: integer\n              readyReplicas:\n                description: readyReplicas is the number of instances created for\n                  this InstanceSet with a Ready Condition.\n                format: int32\n                type: integer\n              replicas:\n                description: replicas is the number of instances created by the InstanceSet\n                  controller.\n                format: int32\n                type: integer\n              templatesStatus:\n                description: TemplatesStatus represents status of each instance generated\n                  by InstanceTemplates\n                items:\n                  description: InstanceTemplateStatus aggregates the status of replicas\n                    for each InstanceTemplate\n                  properties:\n                    availableReplicas:\n                      description: AvailableReplicas is the number of Pods that ready\n                        for at least minReadySeconds.\n                      format: int32\n                      type: integer\n                    currentReplicas:\n                      description: |-\n                        currentReplicas is the number of instances created by the InstanceSet controller from the InstanceSet version\n                        indicated by CurrentRevisions.\n                      format: int32\n                      type: integer\n                    name:\n                      description: Name, the name of the InstanceTemplate.\n                      type: string\n                    readyReplicas:\n                      description: ReadyReplicas is the number of Pods that have a\n                        Ready Condition.\n                      format: int32\n                      type: integer\n                    replicas:\n                      description: Replicas is the number of replicas of the InstanceTemplate.\n                      format: int32\n                      type: integer\n                    updatedReplicas:\n                      description: |-\n                        UpdatedReplicas is the number of Pods created by the InstanceSet controller from the InstanceSet version\n                        indicated by UpdateRevisions.\n                      format: int32\n                      type: integer\n                  required:\n                  - name\n                  type: object\n                type: array\n              updateRevision:\n                description: |-\n                  updateRevision, if not empty, indicates the version of the InstanceSet used to generate instances in the sequence\n                  [replicas-updatedReplicas,replicas)\n                type: string\n              updateRevisions:\n                additionalProperties:\n                  type: string\n                description: |-\n                  updateRevisions, if not empty, indicates the new version of the InstanceSet used to generate the underlying workload.\n                  key is the pod name, value is the revision.\n                type: object\n              updatedReplicas:\n                description: |-\n                  updatedReplicas is the number of instances created by the InstanceSet controller from the InstanceSet version\n                  indicated by UpdateRevisions.\n                format: int32\n                type: integer\n            required:\n            - replicas\n            type: object\n        type: object\n    served: true\n    storage: true\n    subresources:\n      scale:\n        specReplicasPath: .spec.replicas\n        statusReplicasPath: .status.replicas\n      status: {}\n  - additionalPrinterColumns:\n    - description: leader instance name.\n      jsonPath: .status.membersStatus[?(@.role.isLeader==true)].podName\n      name: LEADER\n      type: string\n    - description: ready replicas.\n      jsonPath: .status.readyReplicas\n      name: READY\n      type: string\n    - description: total replicas.\n      jsonPath: .status.replicas\n      name: REPLICAS\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: AGE\n      type: date\n    name: v1alpha1\n    schema:\n      openAPIV3Schema:\n        description: InstanceSet is the Schema for the instancesets API.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: Defines the desired state of the state machine. It includes\n              the configuration details for the state machine.\n            properties:\n              credential:\n                description: Credential used to connect to DB engine\n                properties:\n                  password:\n                    description: |-\n                      Represents the user's password for the credential.\n                      The corresponding environment variable will be KB_ITS_PASSWORD.\n                    properties:\n                      value:\n                        description: |-\n                          Specifies the value of the environment variable. This field is optional and defaults to an empty string.\n                          The value can include variable references in the format $(VAR_NAME) which will be expanded using previously defined environment variables in the container and any service environment variables.\n\n\n                          If a variable cannot be resolved, the reference in the input string will remain unchanged.\n                          Double $$ can be used to escape the $(VAR_NAME) syntax, resulting in a single $ and producing the string literal \"$(VAR_NAME)\".\n                          Escaped references will not be expanded, regardless of whether the variable exists or not.\n                        type: string\n                      valueFrom:\n                        description: Defines the source for the environment variable's\n                          value. This field is optional and cannot be used if the\n                          'Value' field is not empty.\n                        properties:\n                          configMapKeyRef:\n                            description: Selects a key of a ConfigMap.\n                            properties:\n                              key:\n                                description: The key to select.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the ConfigMap or its\n                                  key must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          fieldRef:\n                            description: |-\n                              Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                              spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                            properties:\n                              apiVersion:\n                                description: Version of the schema the FieldPath is\n                                  written in terms of, defaults to \"v1\".\n                                type: string\n                              fieldPath:\n                                description: Path of the field to select in the specified\n                                  API version.\n                                type: string\n                            required:\n                            - fieldPath\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          resourceFieldRef:\n                            description: |-\n                              Selects a resource of the container: only resources limits and requests\n                              (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                            properties:\n                              containerName:\n                                description: 'Container name: required for volumes,\n                                  optional for env vars'\n                                type: string\n                              divisor:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the output format of the exposed\n                                  resources, defaults to \"1\"\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              resource:\n                                description: 'Required: resource to select'\n                                type: string\n                            required:\n                            - resource\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          secretKeyRef:\n                            description: Selects a key of a secret in the pod's namespace\n                            properties:\n                              key:\n                                description: The key of the secret to select from.  Must\n                                  be a valid secret key.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the Secret or its key\n                                  must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                    type: object\n                  username:\n                    description: |-\n                      Defines the user's name for the credential.\n                      The corresponding environment variable will be KB_ITS_USERNAME.\n                    properties:\n                      value:\n                        description: |-\n                          Specifies the value of the environment variable. This field is optional and defaults to an empty string.\n                          The value can include variable references in the format $(VAR_NAME) which will be expanded using previously defined environment variables in the container and any service environment variables.\n\n\n                          If a variable cannot be resolved, the reference in the input string will remain unchanged.\n                          Double $$ can be used to escape the $(VAR_NAME) syntax, resulting in a single $ and producing the string literal \"$(VAR_NAME)\".\n                          Escaped references will not be expanded, regardless of whether the variable exists or not.\n                        type: string\n                      valueFrom:\n                        description: Defines the source for the environment variable's\n                          value. This field is optional and cannot be used if the\n                          'Value' field is not empty.\n                        properties:\n                          configMapKeyRef:\n                            description: Selects a key of a ConfigMap.\n                            properties:\n                              key:\n                                description: The key to select.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the ConfigMap or its\n                                  key must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          fieldRef:\n                            description: |-\n                              Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                              spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                            properties:\n                              apiVersion:\n                                description: Version of the schema the FieldPath is\n                                  written in terms of, defaults to \"v1\".\n                                type: string\n                              fieldPath:\n                                description: Path of the field to select in the specified\n                                  API version.\n                                type: string\n                            required:\n                            - fieldPath\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          resourceFieldRef:\n                            description: |-\n                              Selects a resource of the container: only resources limits and requests\n                              (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                            properties:\n                              containerName:\n                                description: 'Container name: required for volumes,\n                                  optional for env vars'\n                                type: string\n                              divisor:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: Specifies the output format of the exposed\n                                  resources, defaults to \"1\"\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              resource:\n                                description: 'Required: resource to select'\n                                type: string\n                            required:\n                            - resource\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          secretKeyRef:\n                            description: Selects a key of a secret in the pod's namespace\n                            properties:\n                              key:\n                                description: The key of the secret to select from.  Must\n                                  be a valid secret key.\n                                type: string\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: Specify whether the Secret or its key\n                                  must be defined\n                                type: boolean\n                            required:\n                            - key\n                            type: object\n                            x-kubernetes-map-type: atomic\n                        type: object\n                    type: object\n                required:\n                - password\n                - username\n                type: object\n              defaultTemplateOrdinals:\n                description: |-\n                  Specifies the desired Ordinals of the default template.\n                  The Ordinals used to specify the ordinal of the instance (pod) names to be generated under the default template.\n\n\n                  For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},\n                  then the instance names generated under the default template would be\n                  $(cluster.name)-$(component.name)-0、$(cluster.name)-$(component.name)-1 and $(cluster.name)-$(component.name)-7\n                properties:\n                  discrete:\n                    items:\n                      format: int32\n                      type: integer\n                    type: array\n                  ranges:\n                    items:\n                      description: |-\n                        Range represents a range with a start and an end value.\n                        It is used to define a continuous segment.\n                      properties:\n                        end:\n                          format: int32\n                          type: integer\n                        start:\n                          format: int32\n                          type: integer\n                      required:\n                      - end\n                      - start\n                      type: object\n                    type: array\n                type: object\n              instances:\n                description: |-\n                  Overrides values in default Template.\n\n\n                  Instance is the fundamental unit managed by KubeBlocks.\n                  It represents a Pod with additional objects such as PVCs, Services, ConfigMaps, etc.\n                  An InstanceSet manages instances with a total count of Replicas,\n                  and by default, all these instances are generated from the same template.\n                  The InstanceTemplate provides a way to override values in the default template,\n                  allowing the InstanceSet to manage instances from different templates.\n\n\n                  The naming convention for instances (pods) based on the InstanceSet Name, InstanceTemplate Name, and ordinal.\n                  The constructed instance name follows the pattern: $(instance_set.name)-$(template.name)-$(ordinal).\n                  By default, the ordinal starts from 0 for each InstanceTemplate.\n                  It is important to ensure that the Name of each InstanceTemplate is unique.\n\n\n                  The sum of replicas across all InstanceTemplates should not exceed the total number of Replicas specified for the InstanceSet.\n                  Any remaining replicas will be generated using the default template and will follow the default naming rules.\n                items:\n                  description: |-\n                    InstanceTemplate allows customization of individual replica configurations within a Component,\n                    without altering the base component template defined in ClusterComponentSpec.\n                    It enables the application of distinct settings to specific instances (replicas),\n                    providing flexibility while maintaining a common configuration baseline.\n                  properties:\n                    annotations:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Specifies a map of key-value pairs to be merged into the Pod's existing annotations.\n                        Existing keys will have their values overwritten, while new keys will be added to the annotations.\n                      type: object\n                    env:\n                      description: |-\n                        Defines Env to override.\n                        Add new or override existing envs.\n                      items:\n                        description: EnvVar represents an environment variable present\n                          in a Container.\n                        properties:\n                          name:\n                            description: Name of the environment variable. Must be\n                              a C_IDENTIFIER.\n                            type: string\n                          value:\n                            description: |-\n                              Variable references $(VAR_NAME) are expanded\n                              using the previously defined environment variables in the container and\n                              any service environment variables. If a variable cannot be resolved,\n                              the reference in the input string will be unchanged. Double $$ are reduced\n                              to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                              \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                              Escaped references will never be expanded, regardless of whether the variable\n                              exists or not.\n                              Defaults to \"\".\n                            type: string\n                          valueFrom:\n                            description: Source for the environment variable's value.\n                              Cannot be used if value is not empty.\n                            properties:\n                              configMapKeyRef:\n                                description: Selects a key of a ConfigMap.\n                                properties:\n                                  key:\n                                    description: The key to select.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the ConfigMap or\n                                      its key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              fieldRef:\n                                description: |-\n                                  Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                  spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                properties:\n                                  apiVersion:\n                                    description: Version of the schema the FieldPath\n                                      is written in terms of, defaults to \"v1\".\n                                    type: string\n                                  fieldPath:\n                                    description: Path of the field to select in the\n                                      specified API version.\n                                    type: string\n                                required:\n                                - fieldPath\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              resourceFieldRef:\n                                description: |-\n                                  Selects a resource of the container: only resources limits and requests\n                                  (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                properties:\n                                  containerName:\n                                    description: 'Container name: required for volumes,\n                                      optional for env vars'\n                                    type: string\n                                  divisor:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    description: Specifies the output format of the\n                                      exposed resources, defaults to \"1\"\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  resource:\n                                    description: 'Required: resource to select'\n                                    type: string\n                                required:\n                                - resource\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              secretKeyRef:\n                                description: Selects a key of a secret in the pod's\n                                  namespace\n                                properties:\n                                  key:\n                                    description: The key of the secret to select from.  Must\n                                      be a valid secret key.\n                                    type: string\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                  optional:\n                                    description: Specify whether the Secret or its\n                                      key must be defined\n                                    type: boolean\n                                required:\n                                - key\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                    image:\n                      description: Specifies an override for the first container's\n                        image in the pod.\n                      type: string\n                    labels:\n                      additionalProperties:\n                        type: string\n                      description: |-\n                        Specifies a map of key-value pairs that will be merged into the Pod's existing labels.\n                        Values for existing keys will be overwritten, and new keys will be added.\n                      type: object\n                    name:\n                      description: |-\n                        Name specifies the unique name of the instance Pod created using this InstanceTemplate.\n                        This name is constructed by concatenating the component's name, the template's name, and the instance's ordinal\n                        using the pattern: $(cluster.name)-$(component.name)-$(template.name)-$(ordinal). Ordinals start from 0.\n                        The specified name overrides any default naming conventions or patterns.\n                      maxLength: 54\n                      pattern: ^[a-z0-9]([a-z0-9\\.\\-]*[a-z0-9])?$\n                      type: string\n                    ordinals:\n                      description: |-\n                        Specifies the desired Ordinals of this InstanceTemplate.\n                        The Ordinals used to specify the ordinal of the instance (pod) names to be generated under this InstanceTemplate.\n\n\n                        For example, if Ordinals is {ranges: [{start: 0, end: 1}], discrete: [7]},\n                        then the instance names generated under this InstanceTemplate would be\n                        $(cluster.name)-$(component.name)-$(template.name)-0、$(cluster.name)-$(component.name)-$(template.name)-1 and\n                        $(cluster.name)-$(component.name)-$(template.name)-7\n                      properties:\n                        discrete:\n                          items:\n                            format: int32\n                            type: integer\n                          type: array\n                        ranges:\n                          items:\n                            description: |-\n                              Range represents a range with a start and an end value.\n                              It is used to define a continuous segment.\n                            properties:\n                              end:\n                                format: int32\n                                type: integer\n                              start:\n                                format: int32\n                                type: integer\n                            required:\n                            - end\n                            - start\n                            type: object\n                          type: array\n                      type: object\n                    replicas:\n                      default: 1\n                      description: |-\n                        Specifies the number of instances (Pods) to create from this InstanceTemplate.\n                        This field allows setting how many replicated instances of the component,\n                        with the specific overrides in the InstanceTemplate, are created.\n                        The default value is 1. A value of 0 disables instance creation.\n                      format: int32\n                      minimum: 0\n                      type: integer\n                    resources:\n                      description: |-\n                        Specifies an override for the resource requirements of the first container in the Pod.\n                        This field allows for customizing resource allocation (CPU, memory, etc.) for the container.\n                      properties:\n                        claims:\n                          description: |-\n                            Claims lists the names of resources, defined in spec.resourceClaims,\n                            that are used by this container.\n\n\n                            This is an alpha field and requires enabling the\n                            DynamicResourceAllocation feature gate.\n\n\n                            This field is immutable. It can only be set for containers.\n                          items:\n                            description: ResourceClaim references one entry in PodSpec.ResourceClaims.\n                            properties:\n                              name:\n                                description: |-\n                                  Name must match the name of one entry in pod.spec.resourceClaims of\n                                  the Pod where this field is used. It makes that resource available\n                                  inside a container.\n                                type: string\n                            required:\n                            - name\n                            type: object\n                          type: array\n                          x-kubernetes-list-map-keys:\n                          - name\n                          x-kubernetes-list-type: map\n                        limits:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Limits describes the maximum amount of compute resources allowed.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                        requests:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: |-\n                            Requests describes the minimum amount of compute resources required.\n                            If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                            otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                            More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                          type: object\n                      type: object\n                    schedulingPolicy:\n                      description: Specifies the scheduling policy for the Component.\n                      properties:\n                        affinity:\n                          description: Specifies a group of affinity scheduling rules\n                            of the Cluster, including NodeAffinity, PodAffinity, and\n                            PodAntiAffinity.\n                          properties:\n                            nodeAffinity:\n                              description: Describes node affinity scheduling rules\n                                for the pod.\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: |-\n                                      An empty preferred scheduling term matches all objects with implicit weight 0\n                                      (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                    properties:\n                                      preference:\n                                        description: A node selector term, associated\n                                          with the corresponding weight.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      weight:\n                                        description: Weight associated with matching\n                                          the corresponding nodeSelectorTerm, in the\n                                          range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - preference\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to an update), the system\n                                    may or may not try to eventually evict the pod from its node.\n                                  properties:\n                                    nodeSelectorTerms:\n                                      description: Required. A list of node selector\n                                        terms. The terms are ORed.\n                                      items:\n                                        description: |-\n                                          A null or empty node selector term matches no objects. The requirements of\n                                          them are ANDed.\n                                          The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                        properties:\n                                          matchExpressions:\n                                            description: A list of node selector requirements\n                                              by node's labels.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchFields:\n                                            description: A list of node selector requirements\n                                              by node's fields.\n                                            items:\n                                              description: |-\n                                                A node selector requirement is a selector that contains values, a key, and an operator\n                                                that relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: The label key that\n                                                    the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    Represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    An array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. If the operator is Gt or Lt, the values\n                                                    array must have a single element, which will be interpreted as an integer.\n                                                    This array is replaced during a strategic merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      type: array\n                                  required:\n                                  - nodeSelectorTerms\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                              type: object\n                            podAffinity:\n                              description: Describes pod affinity scheduling rules\n                                (e.g. co-locate this pod in the same node, zone, etc.\n                                as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                            podAntiAffinity:\n                              description: Describes pod anti-affinity scheduling\n                                rules (e.g. avoid putting this pod in the same node,\n                                zone, etc. as some other pod(s)).\n                              properties:\n                                preferredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    The scheduler will prefer to schedule pods to nodes that satisfy\n                                    the anti-affinity expressions specified by this field, but it may choose\n                                    a node that violates one or more of the expressions. The node that is\n                                    most preferred is the one with the greatest sum of weights, i.e.\n                                    for each node that meets all of the scheduling requirements (resource\n                                    request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                    compute a sum by iterating through the elements of this field and adding\n                                    \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                    node(s) with the highest sum are the most preferred.\n                                  items:\n                                    description: The weights of all of the matched\n                                      WeightedPodAffinityTerm fields are added per-node\n                                      to find the most preferred node(s)\n                                    properties:\n                                      podAffinityTerm:\n                                        description: Required. A pod affinity term,\n                                          associated with the corresponding weight.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              A label query over a set of resources, in this case pods.\n                                              If it's null, this PodAffinityTerm matches with no Pods.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          matchLabelKeys:\n                                            description: |-\n                                              MatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                              Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          mismatchLabelKeys:\n                                            description: |-\n                                              MismatchLabelKeys is a set of pod label keys to select which pods will\n                                              be taken into consideration. The keys are used to lookup values from the\n                                              incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                              to select the group of existing pods which pods will be taken into consideration\n                                              for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                              pod labels will be ignored. The default value is empty.\n                                              The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                              Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                              This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                            items:\n                                              type: string\n                                            type: array\n                                            x-kubernetes-list-type: atomic\n                                          namespaceSelector:\n                                            description: |-\n                                              A label query over the set of namespaces that the term applies to.\n                                              The term is applied to the union of the namespaces selected by this field\n                                              and the ones listed in the namespaces field.\n                                              null selector and null or empty namespaces list means \"this pod's namespace\".\n                                              An empty selector ({}) matches all namespaces.\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          namespaces:\n                                            description: |-\n                                              namespaces specifies a static list of namespace names that the term applies to.\n                                              The term is applied to the union of the namespaces listed in this field\n                                              and the ones selected by namespaceSelector.\n                                              null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                            items:\n                                              type: string\n                                            type: array\n                                          topologyKey:\n                                            description: |-\n                                              This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                              the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                              whose value of the label with key topologyKey matches that of any node on which any of the\n                                              selected pods is running.\n                                              Empty topologyKey is not allowed.\n                                            type: string\n                                        required:\n                                        - topologyKey\n                                        type: object\n                                      weight:\n                                        description: |-\n                                          weight associated with matching the corresponding podAffinityTerm,\n                                          in the range 1-100.\n                                        format: int32\n                                        type: integer\n                                    required:\n                                    - podAffinityTerm\n                                    - weight\n                                    type: object\n                                  type: array\n                                requiredDuringSchedulingIgnoredDuringExecution:\n                                  description: |-\n                                    If the anti-affinity requirements specified by this field are not met at\n                                    scheduling time, the pod will not be scheduled onto the node.\n                                    If the anti-affinity requirements specified by this field cease to be met\n                                    at some point during pod execution (e.g. due to a pod label update), the\n                                    system may or may not try to eventually evict the pod from its node.\n                                    When there are multiple elements, the lists of nodes corresponding to each\n                                    podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                  items:\n                                    description: |-\n                                      Defines a set of pods (namely those matching the labelSelector\n                                      relative to the given namespace(s)) that this pod should be\n                                      co-located (affinity) or not co-located (anti-affinity) with,\n                                      where co-located is defined as running on a node whose value of\n                                      the label with key <topologyKey> matches that of any node on which\n                                      a pod of the set of pods is running\n                                    properties:\n                                      labelSelector:\n                                        description: |-\n                                          A label query over a set of resources, in this case pods.\n                                          If it's null, this PodAffinityTerm matches with no Pods.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      matchLabelKeys:\n                                        description: |-\n                                          MatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                          Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      mismatchLabelKeys:\n                                        description: |-\n                                          MismatchLabelKeys is a set of pod label keys to select which pods will\n                                          be taken into consideration. The keys are used to lookup values from the\n                                          incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                          to select the group of existing pods which pods will be taken into consideration\n                                          for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                          pod labels will be ignored. The default value is empty.\n                                          The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                          Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                          This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                        items:\n                                          type: string\n                                        type: array\n                                        x-kubernetes-list-type: atomic\n                                      namespaceSelector:\n                                        description: |-\n                                          A label query over the set of namespaces that the term applies to.\n                                          The term is applied to the union of the namespaces selected by this field\n                                          and the ones listed in the namespaces field.\n                                          null selector and null or empty namespaces list means \"this pod's namespace\".\n                                          An empty selector ({}) matches all namespaces.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      namespaces:\n                                        description: |-\n                                          namespaces specifies a static list of namespace names that the term applies to.\n                                          The term is applied to the union of the namespaces listed in this field\n                                          and the ones selected by namespaceSelector.\n                                          null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                        items:\n                                          type: string\n                                        type: array\n                                      topologyKey:\n                                        description: |-\n                                          This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                          the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                          whose value of the label with key topologyKey matches that of any node on which any of the\n                                          selected pods is running.\n                                          Empty topologyKey is not allowed.\n                                        type: string\n                                    required:\n                                    - topologyKey\n                                    type: object\n                                  type: array\n                              type: object\n                          type: object\n                        nodeName:\n                          description: |-\n                            NodeName is a request to schedule this Pod onto a specific node. If it is non-empty,\n                            the scheduler simply schedules this Pod onto that node, assuming that it fits resource\n                            requirements.\n                          type: string\n                        nodeSelector:\n                          additionalProperties:\n                            type: string\n                          description: |-\n                            NodeSelector is a selector which must be true for the Pod to fit on a node.\n                            Selector which must match a node's labels for the Pod to be scheduled on that node.\n                            More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        schedulerName:\n                          description: |-\n                            If specified, the Pod will be dispatched by specified scheduler.\n                            If not specified, the Pod will be dispatched by default scheduler.\n                          type: string\n                        tolerations:\n                          description: |-\n                            Allows Pods to be scheduled onto nodes with matching taints.\n                            Each toleration in the array allows the Pod to tolerate node taints based on\n                            specified `key`, `value`, `effect`, and `operator`.\n\n\n                            - The `key`, `value`, and `effect` identify the taint that the toleration matches.\n                            - The `operator` determines how the toleration matches the taint.\n\n\n                            Pods with matching tolerations are allowed to be scheduled on tainted nodes, typically reserved for specific purposes.\n                          items:\n                            description: |-\n                              The pod this Toleration is attached to tolerates any taint that matches\n                              the triple <key,value,effect> using the matching operator <operator>.\n                            properties:\n                              effect:\n                                description: |-\n                                  Effect indicates the taint effect to match. Empty means match all taint effects.\n                                  When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                                type: string\n                              key:\n                                description: |-\n                                  Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                  If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                                type: string\n                              operator:\n                                description: |-\n                                  Operator represents a key's relationship to the value.\n                                  Valid operators are Exists and Equal. Defaults to Equal.\n                                  Exists is equivalent to wildcard for value, so that a pod can\n                                  tolerate all taints of a particular category.\n                                type: string\n                              tolerationSeconds:\n                                description: |-\n                                  TolerationSeconds represents the period of time the toleration (which must be\n                                  of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                  it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                  negative values will be treated as 0 (evict immediately) by the system.\n                                format: int64\n                                type: integer\n                              value:\n                                description: |-\n                                  Value is the taint value the toleration matches to.\n                                  If the operator is Exists, the value should be empty, otherwise just a regular string.\n                                type: string\n                            type: object\n                          type: array\n                        topologySpreadConstraints:\n                          description: |-\n                            TopologySpreadConstraints describes how a group of Pods ought to spread across topology\n                            domains. Scheduler will schedule Pods in a way which abides by the constraints.\n                            All topologySpreadConstraints are ANDed.\n                          items:\n                            description: TopologySpreadConstraint specifies how to\n                              spread matching pods among the given topology.\n                            properties:\n                              labelSelector:\n                                description: |-\n                                  LabelSelector is used to find matching pods.\n                                  Pods that match this label selector are counted to determine the number of pods\n                                  in their corresponding topology domain.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              matchLabelKeys:\n                                description: |-\n                                  MatchLabelKeys is a set of pod label keys to select the pods over which\n                                  spreading will be calculated. The keys are used to lookup values from the\n                                  incoming pod labels, those key-value labels are ANDed with labelSelector\n                                  to select the group of existing pods over which spreading will be calculated\n                                  for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                  MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                  Keys that don't exist in the incoming pod labels will\n                                  be ignored. A null or empty list means only match against labelSelector.\n\n\n                                  This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                                items:\n                                  type: string\n                                type: array\n                                x-kubernetes-list-type: atomic\n                              maxSkew:\n                                description: |-\n                                  MaxSkew describes the degree to which pods may be unevenly distributed.\n                                  When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                  between the number of matching pods in the target topology and the global minimum.\n                                  The global minimum is the minimum number of matching pods in an eligible domain\n                                  or zero if the number of eligible domains is less than MinDomains.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 2/2/1:\n                                  In this case, the global minimum is 1.\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |   P   |\n                                  - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                  scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                  violate MaxSkew(1).\n                                  - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                  When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                  to topologies that satisfy it.\n                                  It's a required field. Default value is 1 and 0 is not allowed.\n                                format: int32\n                                type: integer\n                              minDomains:\n                                description: |-\n                                  MinDomains indicates a minimum number of eligible domains.\n                                  When the number of eligible domains with matching topology keys is less than minDomains,\n                                  Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                  And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                  this value has no effect on scheduling.\n                                  As a result, when the number of eligible domains is less than minDomains,\n                                  scheduler won't schedule more than maxSkew Pods to those domains.\n                                  If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                  Valid values are integers greater than 0.\n                                  When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                  For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                  labelSelector spread as 2/2/2:\n                                  | zone1 | zone2 | zone3 |\n                                  |  P P  |  P P  |  P P  |\n                                  The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                  In this situation, new pod with the same labelSelector cannot be scheduled,\n                                  because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                  it will violate MaxSkew.\n\n\n                                  This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                                format: int32\n                                type: integer\n                              nodeAffinityPolicy:\n                                description: |-\n                                  NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                  when calculating pod topology spread skew. Options are:\n                                  - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                  - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                  If this value is nil, the behavior is equivalent to the Honor policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              nodeTaintsPolicy:\n                                description: |-\n                                  NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                  pod topology spread skew. Options are:\n                                  - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                  has a toleration, are included.\n                                  - Ignore: node taints are ignored. All nodes are included.\n\n\n                                  If this value is nil, the behavior is equivalent to the Ignore policy.\n                                  This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                                type: string\n                              topologyKey:\n                                description: |-\n                                  TopologyKey is the key of node labels. Nodes that have a label with this key\n                                  and identical values are considered to be in the same topology.\n                                  We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                  of pods into each bucket.\n                                  We define a domain as a particular instance of a topology.\n                                  Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                  nodeAffinityPolicy and nodeTaintsPolicy.\n                                  e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                  And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                  It's a required field.\n                                type: string\n                              whenUnsatisfiable:\n                                description: |-\n                                  WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                  the spread constraint.\n                                  - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                  - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                    but giving higher precedence to topologies that would help reduce the\n                                    skew.\n                                  A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                  if and only if every possible node assignment for that pod would violate\n                                  \"MaxSkew\" on some topology.\n                                  For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                  labelSelector spread as 3/1/1:\n                                  | zone1 | zone2 | zone3 |\n                                  | P P P |   P   |   P   |\n                                  If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                  to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                  MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                  won't make it *more* imbalanced.\n                                  It's a required field.\n                                type: string\n                            required:\n                            - maxSkew\n                            - topologyKey\n                            - whenUnsatisfiable\n                            type: object\n                          type: array\n                      type: object\n                    volumeClaimTemplates:\n                      description: |-\n                        Defines VolumeClaimTemplates to override.\n                        Add new or override existing volume claim templates.\n                      items:\n                        description: PersistentVolumeClaim is a user's request for\n                          and claim to a persistent volume\n                        properties:\n                          apiVersion:\n                            description: |-\n                              APIVersion defines the versioned schema of this representation of an object.\n                              Servers should convert recognized schemas to the latest internal value, and\n                              may reject unrecognized values.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n                            type: string\n                          kind:\n                            description: |-\n                              Kind is a string value representing the REST resource this object represents.\n                              Servers may infer this from the endpoint the client submits requests to.\n                              Cannot be updated.\n                              In CamelCase.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                            type: string\n                          metadata:\n                            description: |-\n                              Standard object's metadata.\n                              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata\n                            properties:\n                              annotations:\n                                additionalProperties:\n                                  type: string\n                                type: object\n                              finalizers:\n                                items:\n                                  type: string\n                                type: array\n                              labels:\n                                additionalProperties:\n                                  type: string\n                                type: object\n                              name:\n                                type: string\n                              namespace:\n                                type: string\n                            type: object\n                          spec:\n                            description: |-\n                              spec defines the desired characteristics of a volume requested by a pod author.\n                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                            properties:\n                              accessModes:\n                                description: |-\n                                  accessModes contains the desired access modes the volume should have.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                items:\n                                  type: string\n                                type: array\n                              dataSource:\n                                description: |-\n                                  dataSource field can be used to specify either:\n                                  * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                  * An existing PVC (PersistentVolumeClaim)\n                                  If the provisioner or an external controller can support the specified data source,\n                                  it will create a new volume based on the contents of the specified data source.\n                                  When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                  and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                  If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                properties:\n                                  apiGroup:\n                                    description: |-\n                                      APIGroup is the group for the resource being referenced.\n                                      If APIGroup is not specified, the specified Kind must be in the core API group.\n                                      For any other third-party types, APIGroup is required.\n                                    type: string\n                                  kind:\n                                    description: Kind is the type of resource being\n                                      referenced\n                                    type: string\n                                  name:\n                                    description: Name is the name of resource being\n                                      referenced\n                                    type: string\n                                required:\n                                - kind\n                                - name\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              dataSourceRef:\n                                description: |-\n                                  dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                  volume is desired. This may be any object from a non-empty API group (non\n                                  core object) or a PersistentVolumeClaim object.\n                                  When this field is specified, volume binding will only succeed if the type of\n                                  the specified object matches some installed volume populator or dynamic\n                                  provisioner.\n                                  This field will replace the functionality of the dataSource field and as such\n                                  if both fields are non-empty, they must have the same value. For backwards\n                                  compatibility, when namespace isn't specified in dataSourceRef,\n                                  both fields (dataSource and dataSourceRef) will be set to the same\n                                  value automatically if one of them is empty and the other is non-empty.\n                                  When namespace is specified in dataSourceRef,\n                                  dataSource isn't set to the same value and must be empty.\n                                  There are three important differences between dataSource and dataSourceRef:\n                                  * While dataSource only allows two specific types of objects, dataSourceRef\n                                    allows any non-core object, as well as PersistentVolumeClaim objects.\n                                  * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                    preserves all values, and generates an error if a disallowed value is\n                                    specified.\n                                  * While dataSource only allows local objects, dataSourceRef allows objects\n                                    in any namespaces.\n                                  (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                  (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                properties:\n                                  apiGroup:\n                                    description: |-\n                                      APIGroup is the group for the resource being referenced.\n                                      If APIGroup is not specified, the specified Kind must be in the core API group.\n                                      For any other third-party types, APIGroup is required.\n                                    type: string\n                                  kind:\n                                    description: Kind is the type of resource being\n                                      referenced\n                                    type: string\n                                  name:\n                                    description: Name is the name of resource being\n                                      referenced\n                                    type: string\n                                  namespace:\n                                    description: |-\n                                      Namespace is the namespace of resource being referenced\n                                      Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                      (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                    type: string\n                                required:\n                                - kind\n                                - name\n                                type: object\n                              resources:\n                                description: |-\n                                  resources represents the minimum resources the volume should have.\n                                  If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                  that are lower than previous value but must still be higher than capacity recorded in the\n                                  status field of the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                properties:\n                                  limits:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Limits describes the maximum amount of compute resources allowed.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                  requests:\n                                    additionalProperties:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                      x-kubernetes-int-or-string: true\n                                    description: |-\n                                      Requests describes the minimum amount of compute resources required.\n                                      If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                      otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                      More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                    type: object\n                                type: object\n                              selector:\n                                description: selector is a label query over volumes\n                                  to consider for binding.\n                                properties:\n                                  matchExpressions:\n                                    description: matchExpressions is a list of label\n                                      selector requirements. The requirements are\n                                      ANDed.\n                                    items:\n                                      description: |-\n                                        A label selector requirement is a selector that contains values, a key, and an operator that\n                                        relates the key and values.\n                                      properties:\n                                        key:\n                                          description: key is the label key that the\n                                            selector applies to.\n                                          type: string\n                                        operator:\n                                          description: |-\n                                            operator represents a key's relationship to a set of values.\n                                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                                          type: string\n                                        values:\n                                          description: |-\n                                            values is an array of string values. If the operator is In or NotIn,\n                                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                            the values array must be empty. This array is replaced during a strategic\n                                            merge patch.\n                                          items:\n                                            type: string\n                                          type: array\n                                      required:\n                                      - key\n                                      - operator\n                                      type: object\n                                    type: array\n                                  matchLabels:\n                                    additionalProperties:\n                                      type: string\n                                    description: |-\n                                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                    type: object\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              storageClassName:\n                                description: |-\n                                  storageClassName is the name of the StorageClass required by the claim.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                type: string\n                              volumeAttributesClassName:\n                                description: |-\n                                  volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                  If specified, the CSI driver will create or update the volume with the attributes defined\n                                  in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                  it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                  will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                  If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                  will be set by the persistentvolume controller if it exists.\n                                  If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                  set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                  exists.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                  (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                type: string\n                              volumeMode:\n                                description: |-\n                                  volumeMode defines what type of volume is required by the claim.\n                                  Value of Filesystem is implied when not included in claim spec.\n                                type: string\n                              volumeName:\n                                description: volumeName is the binding reference to\n                                  the PersistentVolume backing this claim.\n                                type: string\n                            type: object\n                          status:\n                            description: |-\n                              status represents the current information/status of a persistent volume claim.\n                              Read-only.\n                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                            properties:\n                              accessModes:\n                                description: |-\n                                  accessModes contains the actual access modes the volume backing the PVC has.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                items:\n                                  type: string\n                                type: array\n                              allocatedResourceStatuses:\n                                additionalProperties:\n                                  description: |-\n                                    When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource\n                                    that it does not recognizes, then it should ignore that update and let other controllers\n                                    handle it.\n                                  type: string\n                                description: \"allocatedResourceStatuses stores status\n                                  of resource being resized for the given PVC.\\nKey\n                                  names follow standard Kubernetes label syntax. Valid\n                                  values are either:\\n\\t* Un-prefixed keys:\\n\\t\\t-\n                                  storage - the capacity of the volume.\\n\\t* Custom\n                                  resources must use implementation-defined prefixed\n                                  names such as \\\"example.com/my-custom-resource\\\"\\nApart\n                                  from above values - keys that are unprefixed or\n                                  have kubernetes.io prefix are considered\\nreserved\n                                  and hence may not be used.\\n\\n\\nClaimResourceStatus\n                                  can be in any of following states:\\n\\t- ControllerResizeInProgress:\\n\\t\\tState\n                                  set when resize controller starts resizing the volume\n                                  in control-plane.\\n\\t- ControllerResizeFailed:\\n\\t\\tState\n                                  set when resize has failed in resize controller\n                                  with a terminal error.\\n\\t- NodeResizePending:\\n\\t\\tState\n                                  set when resize controller has finished resizing\n                                  the volume but further resizing of\\n\\t\\tvolume is\n                                  needed on the node.\\n\\t- NodeResizeInProgress:\\n\\t\\tState\n                                  set when kubelet starts resizing the volume.\\n\\t-\n                                  NodeResizeFailed:\\n\\t\\tState set when resizing has\n                                  failed in kubelet with a terminal error. Transient\n                                  errors don't set\\n\\t\\tNodeResizeFailed.\\nFor example:\n                                  if expanding a PVC for more capacity - this field\n                                  can be one of the following states:\\n\\t- pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"ControllerResizeInProgress\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"ControllerResizeFailed\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"NodeResizePending\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"NodeResizeInProgress\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                                  = \\\"NodeResizeFailed\\\"\\nWhen this field is not set,\n                                  it means that no resize operation is in progress\n                                  for the given PVC.\\n\\n\\nA controller that receives\n                                  PVC update with previously unknown resourceName\n                                  or ClaimResourceStatus\\nshould ignore the update\n                                  for the purpose it was designed. For example - a\n                                  controller that\\nonly is responsible for resizing\n                                  capacity of the volume, should ignore PVC updates\n                                  that change other valid\\nresources associated with\n                                  PVC.\\n\\n\\nThis is an alpha field and requires enabling\n                                  RecoverVolumeExpansionFailure feature.\"\n                                type: object\n                                x-kubernetes-map-type: granular\n                              allocatedResources:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: \"allocatedResources tracks the resources\n                                  allocated to a PVC including its capacity.\\nKey\n                                  names follow standard Kubernetes label syntax. Valid\n                                  values are either:\\n\\t* Un-prefixed keys:\\n\\t\\t-\n                                  storage - the capacity of the volume.\\n\\t* Custom\n                                  resources must use implementation-defined prefixed\n                                  names such as \\\"example.com/my-custom-resource\\\"\\nApart\n                                  from above values - keys that are unprefixed or\n                                  have kubernetes.io prefix are considered\\nreserved\n                                  and hence may not be used.\\n\\n\\nCapacity reported\n                                  here may be larger than the actual capacity when\n                                  a volume expansion operation\\nis requested.\\nFor\n                                  storage quota, the larger value from allocatedResources\n                                  and PVC.spec.resources is used.\\nIf allocatedResources\n                                  is not set, PVC.spec.resources alone is used for\n                                  quota calculation.\\nIf a volume expansion capacity\n                                  request is lowered, allocatedResources is only\\nlowered\n                                  if there are no expansion operations in progress\n                                  and if the actual volume capacity\\nis equal or lower\n                                  than the requested capacity.\\n\\n\\nA controller that\n                                  receives PVC update with previously unknown resourceName\\nshould\n                                  ignore the update for the purpose it was designed.\n                                  For example - a controller that\\nonly is responsible\n                                  for resizing capacity of the volume, should ignore\n                                  PVC updates that change other valid\\nresources associated\n                                  with PVC.\\n\\n\\nThis is an alpha field and requires\n                                  enabling RecoverVolumeExpansionFailure feature.\"\n                                type: object\n                              capacity:\n                                additionalProperties:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                                description: capacity represents the actual resources\n                                  of the underlying volume.\n                                type: object\n                              conditions:\n                                description: |-\n                                  conditions is the current Condition of persistent volume claim. If underlying persistent volume is being\n                                  resized then the Condition will be set to 'ResizeStarted'.\n                                items:\n                                  description: PersistentVolumeClaimCondition contains\n                                    details about state of pvc\n                                  properties:\n                                    lastProbeTime:\n                                      description: lastProbeTime is the time we probed\n                                        the condition.\n                                      format: date-time\n                                      type: string\n                                    lastTransitionTime:\n                                      description: lastTransitionTime is the time\n                                        the condition transitioned from one status\n                                        to another.\n                                      format: date-time\n                                      type: string\n                                    message:\n                                      description: message is the human-readable message\n                                        indicating details about last transition.\n                                      type: string\n                                    reason:\n                                      description: |-\n                                        reason is a unique, this should be a short, machine understandable string that gives the reason\n                                        for condition's last transition. If it reports \"ResizeStarted\" that means the underlying\n                                        persistent volume is being resized.\n                                      type: string\n                                    status:\n                                      type: string\n                                    type:\n                                      description: PersistentVolumeClaimConditionType\n                                        is a valid value of PersistentVolumeClaimCondition.Type\n                                      type: string\n                                  required:\n                                  - status\n                                  - type\n                                  type: object\n                                type: array\n                              currentVolumeAttributesClassName:\n                                description: |-\n                                  currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using.\n                                  When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim\n                                  This is an alpha field and requires enabling VolumeAttributesClass feature.\n                                type: string\n                              modifyVolumeStatus:\n                                description: |-\n                                  ModifyVolumeStatus represents the status object of ControllerModifyVolume operation.\n                                  When this is unset, there is no ModifyVolume operation being attempted.\n                                  This is an alpha field and requires enabling VolumeAttributesClass feature.\n                                properties:\n                                  status:\n                                    description: \"status is the status of the ControllerModifyVolume\n                                      operation. It can be in any of following states:\\n\n                                      - Pending\\n   Pending indicates that the PersistentVolumeClaim\n                                      cannot be modified due to unmet requirements,\n                                      such as\\n   the specified VolumeAttributesClass\n                                      not existing.\\n - InProgress\\n   InProgress\n                                      indicates that the volume is being modified.\\n\n                                      - Infeasible\\n  Infeasible indicates that the\n                                      request has been rejected as invalid by the\n                                      CSI driver. To\\n\\t  resolve the error, a valid\n                                      VolumeAttributesClass needs to be specified.\\nNote:\n                                      New statuses can be added in the future. Consumers\n                                      should check for unknown statuses and fail appropriately.\"\n                                    type: string\n                                  targetVolumeAttributesClassName:\n                                    description: targetVolumeAttributesClassName is\n                                      the name of the VolumeAttributesClass the PVC\n                                      currently being reconciled\n                                    type: string\n                                required:\n                                - status\n                                type: object\n                              phase:\n                                description: phase represents the current phase of\n                                  PersistentVolumeClaim.\n                                type: string\n                            type: object\n                        type: object\n                      type: array\n                    volumeMounts:\n                      description: |-\n                        Defines VolumeMounts to override.\n                        Add new or override existing volume mounts of the first container in the pod.\n                      items:\n                        description: VolumeMount describes a mounting of a Volume\n                          within a container.\n                        properties:\n                          mountPath:\n                            description: |-\n                              Path within the container at which the volume should be mounted.  Must\n                              not contain ':'.\n                            type: string\n                          mountPropagation:\n                            description: |-\n                              mountPropagation determines how mounts are propagated from the host\n                              to container and the other way around.\n                              When not set, MountPropagationNone is used.\n                              This field is beta in 1.10.\n                            type: string\n                          name:\n                            description: This must match the Name of a Volume.\n                            type: string\n                          readOnly:\n                            description: |-\n                              Mounted read-only if true, read-write otherwise (false or unspecified).\n                              Defaults to false.\n                            type: boolean\n                          subPath:\n                            description: |-\n                              Path within the volume from which the container's volume should be mounted.\n                              Defaults to \"\" (volume's root).\n                            type: string\n                          subPathExpr:\n                            description: |-\n                              Expanded path within the volume from which the container's volume should be mounted.\n                              Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                              Defaults to \"\" (volume's root).\n                              SubPathExpr and SubPath are mutually exclusive.\n                            type: string\n                        required:\n                        - mountPath\n                        - name\n                        type: object\n                      type: array\n                    volumes:\n                      description: |-\n                        Defines Volumes to override.\n                        Add new or override existing volumes.\n                      items:\n                        description: Volume represents a named volume in a pod that\n                          may be accessed by any container in the pod.\n                        properties:\n                          awsElasticBlockStore:\n                            description: |-\n                              awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              partition:\n                                description: |-\n                                  partition is the partition in the volume that you want to mount.\n                                  If omitted, the default is to mount by volume name.\n                                  Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                  Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                format: int32\n                                type: integer\n                              readOnly:\n                                description: |-\n                                  readOnly value true will force the readOnly setting in VolumeMounts.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                type: boolean\n                              volumeID:\n                                description: |-\n                                  volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          azureDisk:\n                            description: azureDisk represents an Azure Data Disk mount\n                              on the host and bind mount to the pod.\n                            properties:\n                              cachingMode:\n                                description: 'cachingMode is the Host Caching mode:\n                                  None, Read Only, Read Write.'\n                                type: string\n                              diskName:\n                                description: diskName is the Name of the data disk\n                                  in the blob storage\n                                type: string\n                              diskURI:\n                                description: diskURI is the URI of data disk in the\n                                  blob storage\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType is Filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              kind:\n                                description: 'kind expected values are Shared: multiple\n                                  blob disks per storage account  Dedicated: single\n                                  blob disk per storage account  Managed: azure managed\n                                  data disk (only in managed availability set). defaults\n                                  to shared'\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                            required:\n                            - diskName\n                            - diskURI\n                            type: object\n                          azureFile:\n                            description: azureFile represents an Azure File Service\n                              mount on the host and bind mount to the pod.\n                            properties:\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretName:\n                                description: secretName is the  name of secret that\n                                  contains Azure Storage Account Name and Key\n                                type: string\n                              shareName:\n                                description: shareName is the azure share Name\n                                type: string\n                            required:\n                            - secretName\n                            - shareName\n                            type: object\n                          cephfs:\n                            description: cephFS represents a Ceph FS mount on the\n                              host that shares a pod's lifetime\n                            properties:\n                              monitors:\n                                description: |-\n                                  monitors is Required: Monitors is a collection of Ceph monitors\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                items:\n                                  type: string\n                                type: array\n                              path:\n                                description: 'path is Optional: Used as the mounted\n                                  root, rather than the full Ceph tree, default is\n                                  /'\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: boolean\n                              secretFile:\n                                description: |-\n                                  secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: string\n                              secretRef:\n                                description: |-\n                                  secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              user:\n                                description: |-\n                                  user is optional: User is the rados user name, default is admin\n                                  More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                type: string\n                            required:\n                            - monitors\n                            type: object\n                          cinder:\n                            description: |-\n                              cinder represents a cinder volume attached and mounted on kubelets host machine.\n                              More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is optional: points to a secret object containing parameters used to connect\n                                  to OpenStack.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              volumeID:\n                                description: |-\n                                  volumeID used to identify the volume in cinder.\n                                  More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          configMap:\n                            description: configMap represents a configMap that should\n                              populate this volume\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items if unspecified, each key-value pair in the Data field of the referenced\n                                  ConfigMap will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the ConfigMap,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              name:\n                                description: |-\n                                  Name of the referent.\n                                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                  TODO: Add other useful fields. apiVersion, kind, uid?\n                                type: string\n                              optional:\n                                description: optional specify whether the ConfigMap\n                                  or its keys must be defined\n                                type: boolean\n                            type: object\n                            x-kubernetes-map-type: atomic\n                          csi:\n                            description: csi (Container Storage Interface) represents\n                              ephemeral storage that is handled by certain external\n                              CSI drivers (Beta feature).\n                            properties:\n                              driver:\n                                description: |-\n                                  driver is the name of the CSI driver that handles this volume.\n                                  Consult with your admin for the correct name as registered in the cluster.\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                  If not provided, the empty value is passed to the associated CSI driver\n                                  which will determine the default filesystem to apply.\n                                type: string\n                              nodePublishSecretRef:\n                                description: |-\n                                  nodePublishSecretRef is a reference to the secret object containing\n                                  sensitive information to pass to the CSI driver to complete the CSI\n                                  NodePublishVolume and NodeUnpublishVolume calls.\n                                  This field is optional, and  may be empty if no secret is required. If the\n                                  secret object contains more than one secret, all secret references are passed.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              readOnly:\n                                description: |-\n                                  readOnly specifies a read-only configuration for the volume.\n                                  Defaults to false (read/write).\n                                type: boolean\n                              volumeAttributes:\n                                additionalProperties:\n                                  type: string\n                                description: |-\n                                  volumeAttributes stores driver-specific properties that are passed to the CSI\n                                  driver. Consult your driver's documentation for supported values.\n                                type: object\n                            required:\n                            - driver\n                            type: object\n                          downwardAPI:\n                            description: downwardAPI represents downward API about\n                              the pod that should populate this volume\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  Optional: mode bits to use on created files by default. Must be a\n                                  Optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: Items is a list of downward API volume\n                                  file\n                                items:\n                                  description: DownwardAPIVolumeFile represents information\n                                    to create the file containing the pod field\n                                  properties:\n                                    fieldRef:\n                                      description: 'Required: Selects a field of the\n                                        pod: only annotations, labels, name and namespace\n                                        are supported.'\n                                      properties:\n                                        apiVersion:\n                                          description: Version of the schema the FieldPath\n                                            is written in terms of, defaults to \"v1\".\n                                          type: string\n                                        fieldPath:\n                                          description: Path of the field to select\n                                            in the specified API version.\n                                          type: string\n                                      required:\n                                      - fieldPath\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    mode:\n                                      description: |-\n                                        Optional: mode bits used to set permissions on this file, must be an octal value\n                                        between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: 'Required: Path is  the relative\n                                        path name of the file to be created. Must\n                                        not be absolute or contain the ''..'' path.\n                                        Must be utf-8 encoded. The first item of the\n                                        relative path must not start with ''..'''\n                                      type: string\n                                    resourceFieldRef:\n                                      description: |-\n                                        Selects a resource of the container: only resources limits and requests\n                                        (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                      properties:\n                                        containerName:\n                                          description: 'Container name: required for\n                                            volumes, optional for env vars'\n                                          type: string\n                                        divisor:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: Specifies the output format\n                                            of the exposed resources, defaults to\n                                            \"1\"\n                                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                          x-kubernetes-int-or-string: true\n                                        resource:\n                                          description: 'Required: resource to select'\n                                          type: string\n                                      required:\n                                      - resource\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                  required:\n                                  - path\n                                  type: object\n                                type: array\n                            type: object\n                          emptyDir:\n                            description: |-\n                              emptyDir represents a temporary directory that shares a pod's lifetime.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                            properties:\n                              medium:\n                                description: |-\n                                  medium represents what type of storage medium should back this directory.\n                                  The default is \"\" which means to use the node's default medium.\n                                  Must be an empty string (default) or Memory.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                type: string\n                              sizeLimit:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                description: |-\n                                  sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                  The size limit is also applicable for memory medium.\n                                  The maximum usage on memory medium EmptyDir would be the minimum value between\n                                  the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                  The default is nil which means that the limit is undefined.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                            type: object\n                          ephemeral:\n                            description: |-\n                              ephemeral represents a volume that is handled by a cluster storage driver.\n                              The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                              and deleted when the pod is removed.\n\n\n                              Use this if:\n                              a) the volume is only needed while the pod runs,\n                              b) features of normal volumes like restoring from snapshot or capacity\n                                 tracking are needed,\n                              c) the storage driver is specified through a storage class, and\n                              d) the storage driver supports dynamic volume provisioning through\n                                 a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                 information on the connection between this volume type\n                                 and PersistentVolumeClaim).\n\n\n                              Use PersistentVolumeClaim or one of the vendor-specific\n                              APIs for volumes that persist for longer than the lifecycle\n                              of an individual pod.\n\n\n                              Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                              be used that way - see the documentation of the driver for\n                              more information.\n\n\n                              A pod can use both types of ephemeral volumes and\n                              persistent volumes at the same time.\n                            properties:\n                              volumeClaimTemplate:\n                                description: |-\n                                  Will be used to create a stand-alone PVC to provision the volume.\n                                  The pod in which this EphemeralVolumeSource is embedded will be the\n                                  owner of the PVC, i.e. the PVC will be deleted together with the\n                                  pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                  `<volume name>` is the name from the `PodSpec.Volumes` array\n                                  entry. Pod validation will reject the pod if the concatenated name\n                                  is not valid for a PVC (for example, too long).\n\n\n                                  An existing PVC with that name that is not owned by the pod\n                                  will *not* be used for the pod to avoid using an unrelated\n                                  volume by mistake. Starting the pod is then blocked until\n                                  the unrelated PVC is removed. If such a pre-created PVC is\n                                  meant to be used by the pod, the PVC has to updated with an\n                                  owner reference to the pod once the pod exists. Normally\n                                  this should not be necessary, but it may be useful when\n                                  manually reconstructing a broken cluster.\n\n\n                                  This field is read-only and no changes will be made by Kubernetes\n                                  to the PVC after it has been created.\n\n\n                                  Required, must not be nil.\n                                properties:\n                                  metadata:\n                                    description: |-\n                                      May contain labels and annotations that will be copied into the PVC\n                                      when creating it. No other fields are allowed and will be rejected during\n                                      validation.\n                                    properties:\n                                      annotations:\n                                        additionalProperties:\n                                          type: string\n                                        type: object\n                                      finalizers:\n                                        items:\n                                          type: string\n                                        type: array\n                                      labels:\n                                        additionalProperties:\n                                          type: string\n                                        type: object\n                                      name:\n                                        type: string\n                                      namespace:\n                                        type: string\n                                    type: object\n                                  spec:\n                                    description: |-\n                                      The specification for the PersistentVolumeClaim. The entire content is\n                                      copied unchanged into the PVC that gets created from this\n                                      template. The same fields as in a PersistentVolumeClaim\n                                      are also valid here.\n                                    properties:\n                                      accessModes:\n                                        description: |-\n                                          accessModes contains the desired access modes the volume should have.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                        items:\n                                          type: string\n                                        type: array\n                                      dataSource:\n                                        description: |-\n                                          dataSource field can be used to specify either:\n                                          * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                          * An existing PVC (PersistentVolumeClaim)\n                                          If the provisioner or an external controller can support the specified data source,\n                                          it will create a new volume based on the contents of the specified data source.\n                                          When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                          and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                          If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                        properties:\n                                          apiGroup:\n                                            description: |-\n                                              APIGroup is the group for the resource being referenced.\n                                              If APIGroup is not specified, the specified Kind must be in the core API group.\n                                              For any other third-party types, APIGroup is required.\n                                            type: string\n                                          kind:\n                                            description: Kind is the type of resource\n                                              being referenced\n                                            type: string\n                                          name:\n                                            description: Name is the name of resource\n                                              being referenced\n                                            type: string\n                                        required:\n                                        - kind\n                                        - name\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      dataSourceRef:\n                                        description: |-\n                                          dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                          volume is desired. This may be any object from a non-empty API group (non\n                                          core object) or a PersistentVolumeClaim object.\n                                          When this field is specified, volume binding will only succeed if the type of\n                                          the specified object matches some installed volume populator or dynamic\n                                          provisioner.\n                                          This field will replace the functionality of the dataSource field and as such\n                                          if both fields are non-empty, they must have the same value. For backwards\n                                          compatibility, when namespace isn't specified in dataSourceRef,\n                                          both fields (dataSource and dataSourceRef) will be set to the same\n                                          value automatically if one of them is empty and the other is non-empty.\n                                          When namespace is specified in dataSourceRef,\n                                          dataSource isn't set to the same value and must be empty.\n                                          There are three important differences between dataSource and dataSourceRef:\n                                          * While dataSource only allows two specific types of objects, dataSourceRef\n                                            allows any non-core object, as well as PersistentVolumeClaim objects.\n                                          * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                            preserves all values, and generates an error if a disallowed value is\n                                            specified.\n                                          * While dataSource only allows local objects, dataSourceRef allows objects\n                                            in any namespaces.\n                                          (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                          (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                        properties:\n                                          apiGroup:\n                                            description: |-\n                                              APIGroup is the group for the resource being referenced.\n                                              If APIGroup is not specified, the specified Kind must be in the core API group.\n                                              For any other third-party types, APIGroup is required.\n                                            type: string\n                                          kind:\n                                            description: Kind is the type of resource\n                                              being referenced\n                                            type: string\n                                          name:\n                                            description: Name is the name of resource\n                                              being referenced\n                                            type: string\n                                          namespace:\n                                            description: |-\n                                              Namespace is the namespace of resource being referenced\n                                              Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                              (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                            type: string\n                                        required:\n                                        - kind\n                                        - name\n                                        type: object\n                                      resources:\n                                        description: |-\n                                          resources represents the minimum resources the volume should have.\n                                          If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                          that are lower than previous value but must still be higher than capacity recorded in the\n                                          status field of the claim.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                        properties:\n                                          limits:\n                                            additionalProperties:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            description: |-\n                                              Limits describes the maximum amount of compute resources allowed.\n                                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                            type: object\n                                          requests:\n                                            additionalProperties:\n                                              anyOf:\n                                              - type: integer\n                                              - type: string\n                                              pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                              x-kubernetes-int-or-string: true\n                                            description: |-\n                                              Requests describes the minimum amount of compute resources required.\n                                              If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                              otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                            type: object\n                                        type: object\n                                      selector:\n                                        description: selector is a label query over\n                                          volumes to consider for binding.\n                                        properties:\n                                          matchExpressions:\n                                            description: matchExpressions is a list\n                                              of label selector requirements. The\n                                              requirements are ANDed.\n                                            items:\n                                              description: |-\n                                                A label selector requirement is a selector that contains values, a key, and an operator that\n                                                relates the key and values.\n                                              properties:\n                                                key:\n                                                  description: key is the label key\n                                                    that the selector applies to.\n                                                  type: string\n                                                operator:\n                                                  description: |-\n                                                    operator represents a key's relationship to a set of values.\n                                                    Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                  type: string\n                                                values:\n                                                  description: |-\n                                                    values is an array of string values. If the operator is In or NotIn,\n                                                    the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                    the values array must be empty. This array is replaced during a strategic\n                                                    merge patch.\n                                                  items:\n                                                    type: string\n                                                  type: array\n                                              required:\n                                              - key\n                                              - operator\n                                              type: object\n                                            type: array\n                                          matchLabels:\n                                            additionalProperties:\n                                              type: string\n                                            description: |-\n                                              matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                              map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                              operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                            type: object\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      storageClassName:\n                                        description: |-\n                                          storageClassName is the name of the StorageClass required by the claim.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                        type: string\n                                      volumeAttributesClassName:\n                                        description: |-\n                                          volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                          If specified, the CSI driver will create or update the volume with the attributes defined\n                                          in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                          it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                          will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                          If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                          will be set by the persistentvolume controller if it exists.\n                                          If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                          set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                          exists.\n                                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                          (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                        type: string\n                                      volumeMode:\n                                        description: |-\n                                          volumeMode defines what type of volume is required by the claim.\n                                          Value of Filesystem is implied when not included in claim spec.\n                                        type: string\n                                      volumeName:\n                                        description: volumeName is the binding reference\n                                          to the PersistentVolume backing this claim.\n                                        type: string\n                                    type: object\n                                required:\n                                - spec\n                                type: object\n                            type: object\n                          fc:\n                            description: fc represents a Fibre Channel resource that\n                              is attached to a kubelet's host machine and then exposed\n                              to the pod.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              lun:\n                                description: 'lun is Optional: FC target lun number'\n                                format: int32\n                                type: integer\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              targetWWNs:\n                                description: 'targetWWNs is Optional: FC target worldwide\n                                  names (WWNs)'\n                                items:\n                                  type: string\n                                type: array\n                              wwids:\n                                description: |-\n                                  wwids Optional: FC volume world wide identifiers (wwids)\n                                  Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                items:\n                                  type: string\n                                type: array\n                            type: object\n                          flexVolume:\n                            description: |-\n                              flexVolume represents a generic volume resource that is\n                              provisioned/attached using an exec based plugin.\n                            properties:\n                              driver:\n                                description: driver is the name of the driver to use\n                                  for this volume.\n                                type: string\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                type: string\n                              options:\n                                additionalProperties:\n                                  type: string\n                                description: 'options is Optional: this field holds\n                                  extra command options if any.'\n                                type: object\n                              readOnly:\n                                description: |-\n                                  readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is Optional: secretRef is reference to the secret object containing\n                                  sensitive information to pass to the plugin scripts. This may be\n                                  empty if no secret object is specified. If the secret object\n                                  contains more than one secret, all secrets are passed to the plugin\n                                  scripts.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            required:\n                            - driver\n                            type: object\n                          flocker:\n                            description: flocker represents a Flocker volume attached\n                              to a kubelet's host machine. This depends on the Flocker\n                              control service being running\n                            properties:\n                              datasetName:\n                                description: |-\n                                  datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                  should be considered as deprecated\n                                type: string\n                              datasetUUID:\n                                description: datasetUUID is the UUID of the dataset.\n                                  This is unique identifier of a Flocker dataset\n                                type: string\n                            type: object\n                          gcePersistentDisk:\n                            description: |-\n                              gcePersistentDisk represents a GCE Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              partition:\n                                description: |-\n                                  partition is the partition in the volume that you want to mount.\n                                  If omitted, the default is to mount by volume name.\n                                  Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                  Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                format: int32\n                                type: integer\n                              pdName:\n                                description: |-\n                                  pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                type: boolean\n                            required:\n                            - pdName\n                            type: object\n                          gitRepo:\n                            description: |-\n                              gitRepo represents a git repository at a particular revision.\n                              DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                              EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                              into the Pod's container.\n                            properties:\n                              directory:\n                                description: |-\n                                  directory is the target directory name.\n                                  Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                  git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                  the subdirectory with the given name.\n                                type: string\n                              repository:\n                                description: repository is the URL\n                                type: string\n                              revision:\n                                description: revision is the commit hash for the specified\n                                  revision.\n                                type: string\n                            required:\n                            - repository\n                            type: object\n                          glusterfs:\n                            description: |-\n                              glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                              More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                            properties:\n                              endpoints:\n                                description: |-\n                                  endpoints is the endpoint name that details Glusterfs topology.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: string\n                              path:\n                                description: |-\n                                  path is the Glusterfs volume path.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                  Defaults to false.\n                                  More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                type: boolean\n                            required:\n                            - endpoints\n                            - path\n                            type: object\n                          hostPath:\n                            description: |-\n                              hostPath represents a pre-existing file or directory on the host\n                              machine that is directly exposed to the container. This is generally\n                              used for system agents or other privileged things that are allowed\n                              to see the host machine. Most containers will NOT need this.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                              ---\n                              TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                              mount host directories as read/write.\n                            properties:\n                              path:\n                                description: |-\n                                  path of the directory on the host.\n                                  If the path is a symlink, it will follow the link to the real path.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                type: string\n                              type:\n                                description: |-\n                                  type for HostPath Volume\n                                  Defaults to \"\"\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                type: string\n                            required:\n                            - path\n                            type: object\n                          iscsi:\n                            description: |-\n                              iscsi represents an ISCSI Disk resource that is attached to a\n                              kubelet's host machine and then exposed to the pod.\n                              More info: https://examples.k8s.io/volumes/iscsi/README.md\n                            properties:\n                              chapAuthDiscovery:\n                                description: chapAuthDiscovery defines whether support\n                                  iSCSI Discovery CHAP authentication\n                                type: boolean\n                              chapAuthSession:\n                                description: chapAuthSession defines whether support\n                                  iSCSI Session CHAP authentication\n                                type: boolean\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              initiatorName:\n                                description: |-\n                                  initiatorName is the custom iSCSI Initiator Name.\n                                  If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                  <target portal>:<volume name> will be created for the connection.\n                                type: string\n                              iqn:\n                                description: iqn is the target iSCSI Qualified Name.\n                                type: string\n                              iscsiInterface:\n                                description: |-\n                                  iscsiInterface is the interface Name that uses an iSCSI transport.\n                                  Defaults to 'default' (tcp).\n                                type: string\n                              lun:\n                                description: lun represents iSCSI Target Lun number.\n                                format: int32\n                                type: integer\n                              portals:\n                                description: |-\n                                  portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                  is other than default (typically TCP ports 860 and 3260).\n                                items:\n                                  type: string\n                                type: array\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                type: boolean\n                              secretRef:\n                                description: secretRef is the CHAP Secret for iSCSI\n                                  target and initiator authentication\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              targetPortal:\n                                description: |-\n                                  targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                  is other than default (typically TCP ports 860 and 3260).\n                                type: string\n                            required:\n                            - iqn\n                            - lun\n                            - targetPortal\n                            type: object\n                          name:\n                            description: |-\n                              name of the volume.\n                              Must be a DNS_LABEL and unique within the pod.\n                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                            type: string\n                          nfs:\n                            description: |-\n                              nfs represents an NFS mount on the host that shares a pod's lifetime\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                            properties:\n                              path:\n                                description: |-\n                                  path that is exported by the NFS server.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the NFS export to be mounted with read-only permissions.\n                                  Defaults to false.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: boolean\n                              server:\n                                description: |-\n                                  server is the hostname or IP address of the NFS server.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                type: string\n                            required:\n                            - path\n                            - server\n                            type: object\n                          persistentVolumeClaim:\n                            description: |-\n                              persistentVolumeClaimVolumeSource represents a reference to a\n                              PersistentVolumeClaim in the same namespace.\n                              More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                            properties:\n                              claimName:\n                                description: |-\n                                  claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                  More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Will force the ReadOnly setting in VolumeMounts.\n                                  Default false.\n                                type: boolean\n                            required:\n                            - claimName\n                            type: object\n                          photonPersistentDisk:\n                            description: photonPersistentDisk represents a PhotonController\n                              persistent disk attached and mounted on kubelets host\n                              machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              pdID:\n                                description: pdID is the ID that identifies Photon\n                                  Controller persistent disk\n                                type: string\n                            required:\n                            - pdID\n                            type: object\n                          portworxVolume:\n                            description: portworxVolume represents a portworx volume\n                              attached and mounted on kubelets host machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fSType represents the filesystem type to mount\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              volumeID:\n                                description: volumeID uniquely identifies a Portworx\n                                  volume\n                                type: string\n                            required:\n                            - volumeID\n                            type: object\n                          projected:\n                            description: projected items for all in one resources\n                              secrets, configmaps, and downward API\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode are the mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              sources:\n                                description: sources is the list of volume projections\n                                items:\n                                  description: Projection that may be projected along\n                                    with other supported volume types\n                                  properties:\n                                    clusterTrustBundle:\n                                      description: |-\n                                        ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                        of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                        Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                        ClusterTrustBundle objects can either be selected by name, or by the\n                                        combination of signer name and a label selector.\n\n\n                                        Kubelet performs aggressive normalization of the PEM contents written\n                                        into the pod filesystem.  Esoteric PEM features such as inter-block\n                                        comments and block headers are stripped.  Certificates are deduplicated.\n                                        The ordering of certificates within the file is arbitrary, and Kubelet\n                                        may change the order over time.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            Select all ClusterTrustBundles that match this label selector.  Only has\n                                            effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                            interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                            everything\".\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        name:\n                                          description: |-\n                                            Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                            with signerName and labelSelector.\n                                          type: string\n                                        optional:\n                                          description: |-\n                                            If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                            aren't available.  If using name, then the named ClusterTrustBundle is\n                                            allowed not to exist.  If using signerName, then the combination of\n                                            signerName and labelSelector is allowed to match zero\n                                            ClusterTrustBundles.\n                                          type: boolean\n                                        path:\n                                          description: Relative path from the volume\n                                            root to write the bundle.\n                                          type: string\n                                        signerName:\n                                          description: |-\n                                            Select all ClusterTrustBundles that match this signer name.\n                                            Mutually-exclusive with name.  The contents of all selected\n                                            ClusterTrustBundles will be unified and deduplicated.\n                                          type: string\n                                      required:\n                                      - path\n                                      type: object\n                                    configMap:\n                                      description: configMap information about the\n                                        configMap data to project\n                                      properties:\n                                        items:\n                                          description: |-\n                                            items if unspecified, each key-value pair in the Data field of the referenced\n                                            ConfigMap will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the ConfigMap,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: optional specify whether the\n                                            ConfigMap or its keys must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    downwardAPI:\n                                      description: downwardAPI information about the\n                                        downwardAPI data to project\n                                      properties:\n                                        items:\n                                          description: Items is a list of DownwardAPIVolume\n                                            file\n                                          items:\n                                            description: DownwardAPIVolumeFile represents\n                                              information to create the file containing\n                                              the pod field\n                                            properties:\n                                              fieldRef:\n                                                description: 'Required: Selects a\n                                                  field of the pod: only annotations,\n                                                  labels, name and namespace are supported.'\n                                                properties:\n                                                  apiVersion:\n                                                    description: Version of the schema\n                                                      the FieldPath is written in\n                                                      terms of, defaults to \"v1\".\n                                                    type: string\n                                                  fieldPath:\n                                                    description: Path of the field\n                                                      to select in the specified API\n                                                      version.\n                                                    type: string\n                                                required:\n                                                - fieldPath\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                              mode:\n                                                description: |-\n                                                  Optional: mode bits used to set permissions on this file, must be an octal value\n                                                  between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: 'Required: Path is  the\n                                                  relative path name of the file to\n                                                  be created. Must not be absolute\n                                                  or contain the ''..'' path. Must\n                                                  be utf-8 encoded. The first item\n                                                  of the relative path must not start\n                                                  with ''..'''\n                                                type: string\n                                              resourceFieldRef:\n                                                description: |-\n                                                  Selects a resource of the container: only resources limits and requests\n                                                  (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                properties:\n                                                  containerName:\n                                                    description: 'Container name:\n                                                      required for volumes, optional\n                                                      for env vars'\n                                                    type: string\n                                                  divisor:\n                                                    anyOf:\n                                                    - type: integer\n                                                    - type: string\n                                                    description: Specifies the output\n                                                      format of the exposed resources,\n                                                      defaults to \"1\"\n                                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                    x-kubernetes-int-or-string: true\n                                                  resource:\n                                                    description: 'Required: resource\n                                                      to select'\n                                                    type: string\n                                                required:\n                                                - resource\n                                                type: object\n                                                x-kubernetes-map-type: atomic\n                                            required:\n                                            - path\n                                            type: object\n                                          type: array\n                                      type: object\n                                    secret:\n                                      description: secret information about the secret\n                                        data to project\n                                      properties:\n                                        items:\n                                          description: |-\n                                            items if unspecified, each key-value pair in the Data field of the referenced\n                                            Secret will be projected into the volume as a file whose name is the\n                                            key and content is the value. If specified, the listed keys will be\n                                            projected into the specified paths, and unlisted keys will not be\n                                            present. If a key is specified which is not present in the Secret,\n                                            the volume setup will error unless it is marked optional. Paths must be\n                                            relative and may not contain the '..' path or start with '..'.\n                                          items:\n                                            description: Maps a string key to a path\n                                              within a volume.\n                                            properties:\n                                              key:\n                                                description: key is the key to project.\n                                                type: string\n                                              mode:\n                                                description: |-\n                                                  mode is Optional: mode bits used to set permissions on this file.\n                                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                  YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                  If not specified, the volume defaultMode will be used.\n                                                  This might be in conflict with other options that affect the file\n                                                  mode, like fsGroup, and the result can be other mode bits set.\n                                                format: int32\n                                                type: integer\n                                              path:\n                                                description: |-\n                                                  path is the relative path of the file to map the key to.\n                                                  May not be an absolute path.\n                                                  May not contain the path element '..'.\n                                                  May not start with the string '..'.\n                                                type: string\n                                            required:\n                                            - key\n                                            - path\n                                            type: object\n                                          type: array\n                                        name:\n                                          description: |-\n                                            Name of the referent.\n                                            More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                            TODO: Add other useful fields. apiVersion, kind, uid?\n                                          type: string\n                                        optional:\n                                          description: optional field specify whether\n                                            the Secret or its key must be defined\n                                          type: boolean\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    serviceAccountToken:\n                                      description: serviceAccountToken is information\n                                        about the serviceAccountToken data to project\n                                      properties:\n                                        audience:\n                                          description: |-\n                                            audience is the intended audience of the token. A recipient of a token\n                                            must identify itself with an identifier specified in the audience of the\n                                            token, and otherwise should reject the token. The audience defaults to the\n                                            identifier of the apiserver.\n                                          type: string\n                                        expirationSeconds:\n                                          description: |-\n                                            expirationSeconds is the requested duration of validity of the service\n                                            account token. As the token approaches expiration, the kubelet volume\n                                            plugin will proactively rotate the service account token. The kubelet will\n                                            start trying to rotate the token if the token is older than 80 percent of\n                                            its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                            and must be at least 10 minutes.\n                                          format: int64\n                                          type: integer\n                                        path:\n                                          description: |-\n                                            path is the path relative to the mount point of the file to project the\n                                            token into.\n                                          type: string\n                                      required:\n                                      - path\n                                      type: object\n                                  type: object\n                                type: array\n                            type: object\n                          quobyte:\n                            description: quobyte represents a Quobyte mount on the\n                              host that shares a pod's lifetime\n                            properties:\n                              group:\n                                description: |-\n                                  group to map volume access to\n                                  Default is no group\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                  Defaults to false.\n                                type: boolean\n                              registry:\n                                description: |-\n                                  registry represents a single or multiple Quobyte Registry services\n                                  specified as a string as host:port pair (multiple entries are separated with commas)\n                                  which acts as the central registry for volumes\n                                type: string\n                              tenant:\n                                description: |-\n                                  tenant owning the given Quobyte volume in the Backend\n                                  Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                type: string\n                              user:\n                                description: |-\n                                  user to map volume access to\n                                  Defaults to serivceaccount user\n                                type: string\n                              volume:\n                                description: volume is a string that references an\n                                  already created Quobyte volume by name.\n                                type: string\n                            required:\n                            - registry\n                            - volume\n                            type: object\n                          rbd:\n                            description: |-\n                              rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                              More info: https://examples.k8s.io/volumes/rbd/README.md\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type of the volume that you want to mount.\n                                  Tip: Ensure that the filesystem type is supported by the host operating system.\n                                  Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                  TODO: how do we prevent errors in the filesystem from compromising the machine\n                                type: string\n                              image:\n                                description: |-\n                                  image is the rados image name.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              keyring:\n                                description: |-\n                                  keyring is the path to key ring for RBDUser.\n                                  Default is /etc/ceph/keyring.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              monitors:\n                                description: |-\n                                  monitors is a collection of Ceph monitors.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                items:\n                                  type: string\n                                type: array\n                              pool:\n                                description: |-\n                                  pool is the rados pool name.\n                                  Default is rbd.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly here will force the ReadOnly setting in VolumeMounts.\n                                  Defaults to false.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef is name of the authentication secret for RBDUser. If provided\n                                  overrides keyring.\n                                  Default is nil.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              user:\n                                description: |-\n                                  user is the rados user name.\n                                  Default is admin.\n                                  More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                type: string\n                            required:\n                            - image\n                            - monitors\n                            type: object\n                          scaleIO:\n                            description: scaleIO represents a ScaleIO persistent volume\n                              attached and mounted on Kubernetes nodes.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                  Default is \"xfs\".\n                                type: string\n                              gateway:\n                                description: gateway is the host address of the ScaleIO\n                                  API Gateway.\n                                type: string\n                              protectionDomain:\n                                description: protectionDomain is the name of the ScaleIO\n                                  Protection Domain for the configured storage.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly Defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef references to the secret for ScaleIO user and other\n                                  sensitive information. If this is not provided, Login operation will fail.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              sslEnabled:\n                                description: sslEnabled Flag enable/disable SSL communication\n                                  with Gateway, default false\n                                type: boolean\n                              storageMode:\n                                description: |-\n                                  storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                  Default is ThinProvisioned.\n                                type: string\n                              storagePool:\n                                description: storagePool is the ScaleIO Storage Pool\n                                  associated with the protection domain.\n                                type: string\n                              system:\n                                description: system is the name of the storage system\n                                  as configured in ScaleIO.\n                                type: string\n                              volumeName:\n                                description: |-\n                                  volumeName is the name of a volume already created in the ScaleIO system\n                                  that is associated with this volume source.\n                                type: string\n                            required:\n                            - gateway\n                            - secretRef\n                            - system\n                            type: object\n                          secret:\n                            description: |-\n                              secret represents a secret that should populate this volume.\n                              More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                            properties:\n                              defaultMode:\n                                description: |-\n                                  defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                  Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                  YAML accepts both octal and decimal values, JSON requires decimal values\n                                  for mode bits. Defaults to 0644.\n                                  Directories within the path are not affected by this setting.\n                                  This might be in conflict with other options that affect the file\n                                  mode, like fsGroup, and the result can be other mode bits set.\n                                format: int32\n                                type: integer\n                              items:\n                                description: |-\n                                  items If unspecified, each key-value pair in the Data field of the referenced\n                                  Secret will be projected into the volume as a file whose name is the\n                                  key and content is the value. If specified, the listed keys will be\n                                  projected into the specified paths, and unlisted keys will not be\n                                  present. If a key is specified which is not present in the Secret,\n                                  the volume setup will error unless it is marked optional. Paths must be\n                                  relative and may not contain the '..' path or start with '..'.\n                                items:\n                                  description: Maps a string key to a path within\n                                    a volume.\n                                  properties:\n                                    key:\n                                      description: key is the key to project.\n                                      type: string\n                                    mode:\n                                      description: |-\n                                        mode is Optional: mode bits used to set permissions on this file.\n                                        Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                        YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                        If not specified, the volume defaultMode will be used.\n                                        This might be in conflict with other options that affect the file\n                                        mode, like fsGroup, and the result can be other mode bits set.\n                                      format: int32\n                                      type: integer\n                                    path:\n                                      description: |-\n                                        path is the relative path of the file to map the key to.\n                                        May not be an absolute path.\n                                        May not contain the path element '..'.\n                                        May not start with the string '..'.\n                                      type: string\n                                  required:\n                                  - key\n                                  - path\n                                  type: object\n                                type: array\n                              optional:\n                                description: optional field specify whether the Secret\n                                  or its keys must be defined\n                                type: boolean\n                              secretName:\n                                description: |-\n                                  secretName is the name of the secret in the pod's namespace to use.\n                                  More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                type: string\n                            type: object\n                          storageos:\n                            description: storageOS represents a StorageOS volume attached\n                              and mounted on Kubernetes nodes.\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is the filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              readOnly:\n                                description: |-\n                                  readOnly defaults to false (read/write). ReadOnly here will force\n                                  the ReadOnly setting in VolumeMounts.\n                                type: boolean\n                              secretRef:\n                                description: |-\n                                  secretRef specifies the secret to use for obtaining the StorageOS API\n                                  credentials.  If not specified, default values will be attempted.\n                                properties:\n                                  name:\n                                    description: |-\n                                      Name of the referent.\n                                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                      TODO: Add other useful fields. apiVersion, kind, uid?\n                                    type: string\n                                type: object\n                                x-kubernetes-map-type: atomic\n                              volumeName:\n                                description: |-\n                                  volumeName is the human-readable name of the StorageOS volume.  Volume\n                                  names are only unique within a namespace.\n                                type: string\n                              volumeNamespace:\n                                description: |-\n                                  volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                  namespace is specified then the Pod's namespace will be used.  This allows the\n                                  Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                  Set VolumeName to any name to override the default behaviour.\n                                  Set to \"default\" if you are not using namespaces within StorageOS.\n                                  Namespaces that do not pre-exist within StorageOS will be created.\n                                type: string\n                            type: object\n                          vsphereVolume:\n                            description: vsphereVolume represents a vSphere volume\n                              attached and mounted on kubelets host machine\n                            properties:\n                              fsType:\n                                description: |-\n                                  fsType is filesystem type to mount.\n                                  Must be a filesystem type supported by the host operating system.\n                                  Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                type: string\n                              storagePolicyID:\n                                description: storagePolicyID is the storage Policy\n                                  Based Management (SPBM) profile ID associated with\n                                  the StoragePolicyName.\n                                type: string\n                              storagePolicyName:\n                                description: storagePolicyName is the storage Policy\n                                  Based Management (SPBM) profile name.\n                                type: string\n                              volumePath:\n                                description: volumePath is the path that identifies\n                                  vSphere volume vmdk\n                                type: string\n                            required:\n                            - volumePath\n                            type: object\n                        required:\n                        - name\n                        type: object\n                      type: array\n                  required:\n                  - name\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - name\n                x-kubernetes-list-type: map\n              memberUpdateStrategy:\n                description: |-\n                  Members(Pods) update strategy.\n\n\n                  - serial: update Members one by one that guarantee minimum component unavailable time.\n                  - bestEffortParallel: update Members in parallel that guarantee minimum component un-writable time.\n                  - parallel: force parallel\n                enum:\n                - Serial\n                - BestEffortParallel\n                - Parallel\n                type: string\n              membershipReconfiguration:\n                description: Provides actions to do membership dynamic reconfiguration.\n                properties:\n                  logSyncAction:\n                    description: |-\n                      Defines the action to trigger the new member to start log syncing.\n                      If the Image is not configured, the Image from the previous non-nil action will be used.\n                    properties:\n                      args:\n                        description: Additional parameters used to perform specific\n                          statements. This field is optional.\n                        items:\n                          type: string\n                        type: array\n                      command:\n                        description: A set of instructions that will be executed within\n                          the Container to retrieve or process role information. This\n                          field is required.\n                        items:\n                          type: string\n                        type: array\n                      image:\n                        description: Refers to the utility image that contains the\n                          command which can be utilized to retrieve or process role\n                          information.\n                        type: string\n                    required:\n                    - command\n                    type: object\n                  memberJoinAction:\n                    description: |-\n                      Defines the action to add a member.\n                      If the Image is not configured, the Image from the previous non-nil action will be used.\n                    properties:\n                      args:\n                        description: Additional parameters used to perform specific\n                          statements. This field is optional.\n                        items:\n                          type: string\n                        type: array\n                      command:\n                        description: A set of instructions that will be executed within\n                          the Container to retrieve or process role information. This\n                          field is required.\n                        items:\n                          type: string\n                        type: array\n                      image:\n                        description: Refers to the utility image that contains the\n                          command which can be utilized to retrieve or process role\n                          information.\n                        type: string\n                    required:\n                    - command\n                    type: object\n                  memberLeaveAction:\n                    description: |-\n                      Defines the action to remove a member.\n                      If the Image is not configured, the Image from the previous non-nil action will be used.\n                    properties:\n                      args:\n                        description: Additional parameters used to perform specific\n                          statements. This field is optional.\n                        items:\n                          type: string\n                        type: array\n                      command:\n                        description: A set of instructions that will be executed within\n                          the Container to retrieve or process role information. This\n                          field is required.\n                        items:\n                          type: string\n                        type: array\n                      image:\n                        description: Refers to the utility image that contains the\n                          command which can be utilized to retrieve or process role\n                          information.\n                        type: string\n                    required:\n                    - command\n                    type: object\n                  promoteAction:\n                    description: |-\n                      Defines the action to inform the cluster that the new member can join voting now.\n                      If the Image is not configured, the Image from the previous non-nil action will be used.\n                    properties:\n                      args:\n                        description: Additional parameters used to perform specific\n                          statements. This field is optional.\n                        items:\n                          type: string\n                        type: array\n                      command:\n                        description: A set of instructions that will be executed within\n                          the Container to retrieve or process role information. This\n                          field is required.\n                        items:\n                          type: string\n                        type: array\n                      image:\n                        description: Refers to the utility image that contains the\n                          command which can be utilized to retrieve or process role\n                          information.\n                        type: string\n                    required:\n                    - command\n                    type: object\n                  switchoverAction:\n                    description: |-\n                      Specifies the environment variables that can be used in all following Actions:\n                      - KB_ITS_USERNAME: Represents the username part of the credential\n                      - KB_ITS_PASSWORD: Represents the password part of the credential\n                      - KB_ITS_LEADER_HOST: Represents the leader host\n                      - KB_ITS_TARGET_HOST: Represents the target host\n                      - KB_ITS_SERVICE_PORT: Represents the service port\n\n\n                      Defines the action to perform a switchover.\n                      If the Image is not configured, the latest [BusyBox](https://busybox.net/) image will be used.\n                    properties:\n                      args:\n                        description: Additional parameters used to perform specific\n                          statements. This field is optional.\n                        items:\n                          type: string\n                        type: array\n                      command:\n                        description: A set of instructions that will be executed within\n                          the Container to retrieve or process role information. This\n                          field is required.\n                        items:\n                          type: string\n                        type: array\n                      image:\n                        description: Refers to the utility image that contains the\n                          command which can be utilized to retrieve or process role\n                          information.\n                        type: string\n                    required:\n                    - command\n                    type: object\n                type: object\n              minReadySeconds:\n                default: 0\n                description: |-\n                  Defines the minimum number of seconds a newly created pod should be ready\n                  without any of its container crashing to be considered available.\n                  Defaults to 0, meaning the pod will be considered available as soon as it is ready.\n                format: int32\n                minimum: 0\n                type: integer\n              offlineInstances:\n                description: |-\n                  Specifies the names of instances to be transitioned to offline status.\n\n\n                  Marking an instance as offline results in the following:\n\n\n                  1. The associated pod is stopped, and its PersistentVolumeClaim (PVC) is retained for potential\n                     future reuse or data recovery, but it is no longer actively used.\n                  2. The ordinal number assigned to this instance is preserved, ensuring it remains unique\n                     and avoiding conflicts with new instances.\n\n\n                  Setting instances to offline allows for a controlled scale-in process, preserving their data and maintaining\n                  ordinal consistency within the cluster.\n                  Note that offline instances and their associated resources, such as PVCs, are not automatically deleted.\n                  The cluster administrator must manually manage the cleanup and removal of these resources when they are no longer needed.\n                items:\n                  type: string\n                type: array\n              parallelPodManagementConcurrency:\n                anyOf:\n                - type: integer\n                - type: string\n                description: |-\n                  Controls the concurrency of pods during initial scale up, when replacing pods on nodes,\n                  or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.\n                  The default Concurrency is 100%.\n                x-kubernetes-int-or-string: true\n              paused:\n                description: Indicates that the InstanceSet is paused, meaning the\n                  reconciliation of this InstanceSet object will be paused.\n                type: boolean\n              podManagementPolicy:\n                description: |-\n                  Controls how pods are created during initial scale up,\n                  when replacing pods on nodes, or when scaling down.\n\n\n                  The default policy is `OrderedReady`, where pods are created in increasing order and the controller waits until each pod is ready before\n                  continuing. When scaling down, the pods are removed in the opposite order.\n                  The alternative policy is `Parallel` which will create pods in parallel\n                  to match the desired scale without waiting, and on scale down will delete\n                  all pods at once.\n\n\n                  Note: This field will be removed in future version.\n                type: string\n              podUpdatePolicy:\n                description: |-\n                  PodUpdatePolicy indicates how pods should be updated\n\n\n                  - `StrictInPlace` indicates that only allows in-place upgrades.\n                  Any attempt to modify other fields will be rejected.\n                  - `PreferInPlace` indicates that we will first attempt an in-place upgrade of the Pod.\n                  If that fails, it will fall back to the ReCreate, where pod will be recreated.\n                  Default value is \"PreferInPlace\"\n                type: string\n              replicas:\n                default: 1\n                description: |-\n                  Specifies the desired number of replicas of the given Template.\n                  These replicas are instantiations of the same Template, with each having a consistent identity.\n                  Defaults to 1 if unspecified.\n                format: int32\n                minimum: 0\n                type: integer\n              roleProbe:\n                description: Provides method to probe role.\n                properties:\n                  builtinHandlerName:\n                    description: |-\n                      Specifies the builtin handler name to use to probe the role of the main container.\n                      Available handlers include: mysql, postgres, mongodb, redis, etcd, kafka.\n                      Use CustomHandler to define a custom role probe function if none of the built-in handlers meet the requirement.\n                    type: string\n                  customHandler:\n                    description: |-\n                      Defines a custom method for role probing.\n                      Actions defined here are executed in series.\n                      Upon completion of all actions, the final output should be a single string representing the role name defined in spec.Roles.\n                      The latest [BusyBox](https://busybox.net/) image will be used if Image is not configured.\n                      Environment variables can be used in Command:\n                      - v_KB_ITS_LAST_STDOUT: stdout from the last action, watch for 'v_' prefix\n                      - KB_ITS_USERNAME: username part of the credential\n                      - KB_ITS_PASSWORD: password part of the credential\n                    items:\n                      properties:\n                        args:\n                          description: Additional parameters used to perform specific\n                            statements. This field is optional.\n                          items:\n                            type: string\n                          type: array\n                        command:\n                          description: A set of instructions that will be executed\n                            within the Container to retrieve or process role information.\n                            This field is required.\n                          items:\n                            type: string\n                          type: array\n                        image:\n                          description: Refers to the utility image that contains the\n                            command which can be utilized to retrieve or process role\n                            information.\n                          type: string\n                      required:\n                      - command\n                      type: object\n                    type: array\n                  failureThreshold:\n                    default: 3\n                    description: Specifies the minimum number of consecutive failures\n                      for the probe to be considered failed after having succeeded.\n                    format: int32\n                    minimum: 1\n                    type: integer\n                  initialDelaySeconds:\n                    default: 0\n                    description: Specifies the number of seconds to wait after the\n                      container has started before initiating role probing.\n                    format: int32\n                    minimum: 0\n                    type: integer\n                  periodSeconds:\n                    default: 2\n                    description: Specifies the frequency (in seconds) of probe execution.\n                    format: int32\n                    minimum: 1\n                    type: integer\n                  roleUpdateMechanism:\n                    default: ReadinessProbeEventUpdate\n                    description: Specifies the method for updating the pod role label.\n                    enum:\n                    - ReadinessProbeEventUpdate\n                    - DirectAPIServerEventUpdate\n                    type: string\n                  successThreshold:\n                    default: 1\n                    description: Specifies the minimum number of consecutive successes\n                      for the probe to be considered successful after having failed.\n                    format: int32\n                    minimum: 1\n                    type: integer\n                  timeoutSeconds:\n                    default: 1\n                    description: Specifies the number of seconds after which the probe\n                      times out.\n                    format: int32\n                    minimum: 1\n                    type: integer\n                type: object\n              roles:\n                description: A list of roles defined in the system.\n                items:\n                  properties:\n                    accessMode:\n                      default: ReadWrite\n                      description: Specifies the service capabilities of this member.\n                      enum:\n                      - None\n                      - Readonly\n                      - ReadWrite\n                      type: string\n                    canVote:\n                      default: true\n                      description: Indicates if this member has voting rights.\n                      type: boolean\n                    isLeader:\n                      default: false\n                      description: Determines if this member is the leader.\n                      type: boolean\n                    name:\n                      default: leader\n                      description: Defines the role name of the replica.\n                      type: string\n                  required:\n                  - accessMode\n                  - name\n                  type: object\n                type: array\n              selector:\n                description: |-\n                  Represents a label query over pods that should match the desired replica count indicated by the `replica` field.\n                  It must match the labels defined in the pod template.\n                  More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors\n                properties:\n                  matchExpressions:\n                    description: matchExpressions is a list of label selector requirements.\n                      The requirements are ANDed.\n                    items:\n                      description: |-\n                        A label selector requirement is a selector that contains values, a key, and an operator that\n                        relates the key and values.\n                      properties:\n                        key:\n                          description: key is the label key that the selector applies\n                            to.\n                          type: string\n                        operator:\n                          description: |-\n                            operator represents a key's relationship to a set of values.\n                            Valid operators are In, NotIn, Exists and DoesNotExist.\n                          type: string\n                        values:\n                          description: |-\n                            values is an array of string values. If the operator is In or NotIn,\n                            the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                            the values array must be empty. This array is replaced during a strategic\n                            merge patch.\n                          items:\n                            type: string\n                          type: array\n                      required:\n                      - key\n                      - operator\n                      type: object\n                    type: array\n                  matchLabels:\n                    additionalProperties:\n                      type: string\n                    description: |-\n                      matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                      map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                      operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                    type: object\n                type: object\n                x-kubernetes-map-type: atomic\n              service:\n                description: |-\n                  Defines the behavior of a service spec.\n                  Provides read-write service.\n                  https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n\n\n                  Note: This field will be removed in future version.\n                properties:\n                  apiVersion:\n                    description: |-\n                      APIVersion defines the versioned schema of this representation of an object.\n                      Servers should convert recognized schemas to the latest internal value, and\n                      may reject unrecognized values.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n                    type: string\n                  kind:\n                    description: |-\n                      Kind is a string value representing the REST resource this object represents.\n                      Servers may infer this from the endpoint the client submits requests to.\n                      Cannot be updated.\n                      In CamelCase.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                    type: string\n                  metadata:\n                    description: |-\n                      Standard object's metadata.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata\n                    properties:\n                      annotations:\n                        additionalProperties:\n                          type: string\n                        type: object\n                      finalizers:\n                        items:\n                          type: string\n                        type: array\n                      labels:\n                        additionalProperties:\n                          type: string\n                        type: object\n                      name:\n                        type: string\n                      namespace:\n                        type: string\n                    type: object\n                  spec:\n                    description: |-\n                      Spec defines the behavior of a service.\n                      https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                    properties:\n                      allocateLoadBalancerNodePorts:\n                        description: |-\n                          allocateLoadBalancerNodePorts defines if NodePorts will be automatically\n                          allocated for services with type LoadBalancer.  Default is \"true\". It\n                          may be set to \"false\" if the cluster load-balancer does not rely on\n                          NodePorts.  If the caller requests specific NodePorts (by specifying a\n                          value), those requests will be respected, regardless of this field.\n                          This field may only be set for services with type LoadBalancer and will\n                          be cleared if the type is changed to any other type.\n                        type: boolean\n                      clusterIP:\n                        description: |-\n                          clusterIP is the IP address of the service and is usually assigned\n                          randomly. If an address is specified manually, is in-range (as per\n                          system configuration), and is not in use, it will be allocated to the\n                          service; otherwise creation of the service will fail. This field may not\n                          be changed through updates unless the type field is also being changed\n                          to ExternalName (which requires this field to be blank) or the type\n                          field is being changed from ExternalName (in which case this field may\n                          optionally be specified, as describe above).  Valid values are \"None\",\n                          empty string (\"\"), or a valid IP address. Setting this to \"None\" makes a\n                          \"headless service\" (no virtual IP), which is useful when direct endpoint\n                          connections are preferred and proxying is not required.  Only applies to\n                          types ClusterIP, NodePort, and LoadBalancer. If this field is specified\n                          when creating a Service of type ExternalName, creation will fail. This\n                          field will be wiped when updating a Service to type ExternalName.\n                          More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                        type: string\n                      clusterIPs:\n                        description: |-\n                          ClusterIPs is a list of IP addresses assigned to this service, and are\n                          usually assigned randomly.  If an address is specified manually, is\n                          in-range (as per system configuration), and is not in use, it will be\n                          allocated to the service; otherwise creation of the service will fail.\n                          This field may not be changed through updates unless the type field is\n                          also being changed to ExternalName (which requires this field to be\n                          empty) or the type field is being changed from ExternalName (in which\n                          case this field may optionally be specified, as describe above).  Valid\n                          values are \"None\", empty string (\"\"), or a valid IP address.  Setting\n                          this to \"None\" makes a \"headless service\" (no virtual IP), which is\n                          useful when direct endpoint connections are preferred and proxying is\n                          not required.  Only applies to types ClusterIP, NodePort, and\n                          LoadBalancer. If this field is specified when creating a Service of type\n                          ExternalName, creation will fail. This field will be wiped when updating\n                          a Service to type ExternalName.  If this field is not specified, it will\n                          be initialized from the clusterIP field.  If this field is specified,\n                          clients must ensure that clusterIPs[0] and clusterIP have the same\n                          value.\n\n\n                          This field may hold a maximum of two entries (dual-stack IPs, in either order).\n                          These IPs must correspond to the values of the ipFamilies field. Both\n                          clusterIPs and ipFamilies are governed by the ipFamilyPolicy field.\n                          More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                        items:\n                          type: string\n                        type: array\n                        x-kubernetes-list-type: atomic\n                      externalIPs:\n                        description: |-\n                          externalIPs is a list of IP addresses for which nodes in the cluster\n                          will also accept traffic for this service.  These IPs are not managed by\n                          Kubernetes.  The user is responsible for ensuring that traffic arrives\n                          at a node with this IP.  A common example is external load-balancers\n                          that are not part of the Kubernetes system.\n                        items:\n                          type: string\n                        type: array\n                      externalName:\n                        description: |-\n                          externalName is the external reference that discovery mechanisms will\n                          return as an alias for this service (e.g. a DNS CNAME record). No\n                          proxying will be involved.  Must be a lowercase RFC-1123 hostname\n                          (https://tools.ietf.org/html/rfc1123) and requires `type` to be \"ExternalName\".\n                        type: string\n                      externalTrafficPolicy:\n                        description: |-\n                          externalTrafficPolicy describes how nodes distribute service traffic they\n                          receive on one of the Service's \"externally-facing\" addresses (NodePorts,\n                          ExternalIPs, and LoadBalancer IPs). If set to \"Local\", the proxy will configure\n                          the service in a way that assumes that external load balancers will take care\n                          of balancing the service traffic between nodes, and so each node will deliver\n                          traffic only to the node-local endpoints of the service, without masquerading\n                          the client source IP. (Traffic mistakenly sent to a node with no endpoints will\n                          be dropped.) The default value, \"Cluster\", uses the standard behavior of\n                          routing to all endpoints evenly (possibly modified by topology and other\n                          features). Note that traffic sent to an External IP or LoadBalancer IP from\n                          within the cluster will always get \"Cluster\" semantics, but clients sending to\n                          a NodePort from within the cluster may need to take traffic policy into account\n                          when picking a node.\n                        type: string\n                      healthCheckNodePort:\n                        description: |-\n                          healthCheckNodePort specifies the healthcheck nodePort for the service.\n                          This only applies when type is set to LoadBalancer and\n                          externalTrafficPolicy is set to Local. If a value is specified, is\n                          in-range, and is not in use, it will be used.  If not specified, a value\n                          will be automatically allocated.  External systems (e.g. load-balancers)\n                          can use this port to determine if a given node holds endpoints for this\n                          service or not.  If this field is specified when creating a Service\n                          which does not need it, creation will fail. This field will be wiped\n                          when updating a Service to no longer need it (e.g. changing type).\n                          This field cannot be updated once set.\n                        format: int32\n                        type: integer\n                      internalTrafficPolicy:\n                        description: |-\n                          InternalTrafficPolicy describes how nodes distribute service traffic they\n                          receive on the ClusterIP. If set to \"Local\", the proxy will assume that pods\n                          only want to talk to endpoints of the service on the same node as the pod,\n                          dropping the traffic if there are no local endpoints. The default value,\n                          \"Cluster\", uses the standard behavior of routing to all endpoints evenly\n                          (possibly modified by topology and other features).\n                        type: string\n                      ipFamilies:\n                        description: |-\n                          IPFamilies is a list of IP families (e.g. IPv4, IPv6) assigned to this\n                          service. This field is usually assigned automatically based on cluster\n                          configuration and the ipFamilyPolicy field. If this field is specified\n                          manually, the requested family is available in the cluster,\n                          and ipFamilyPolicy allows it, it will be used; otherwise creation of\n                          the service will fail. This field is conditionally mutable: it allows\n                          for adding or removing a secondary IP family, but it does not allow\n                          changing the primary IP family of the Service. Valid values are \"IPv4\"\n                          and \"IPv6\".  This field only applies to Services of types ClusterIP,\n                          NodePort, and LoadBalancer, and does apply to \"headless\" services.\n                          This field will be wiped when updating a Service to type ExternalName.\n\n\n                          This field may hold a maximum of two entries (dual-stack families, in\n                          either order).  These families must correspond to the values of the\n                          clusterIPs field, if specified. Both clusterIPs and ipFamilies are\n                          governed by the ipFamilyPolicy field.\n                        items:\n                          description: |-\n                            IPFamily represents the IP Family (IPv4 or IPv6). This type is used\n                            to express the family of an IP expressed by a type (e.g. service.spec.ipFamilies).\n                          type: string\n                        type: array\n                        x-kubernetes-list-type: atomic\n                      ipFamilyPolicy:\n                        description: |-\n                          IPFamilyPolicy represents the dual-stack-ness requested or required by\n                          this Service. If there is no value provided, then this field will be set\n                          to SingleStack. Services can be \"SingleStack\" (a single IP family),\n                          \"PreferDualStack\" (two IP families on dual-stack configured clusters or\n                          a single IP family on single-stack clusters), or \"RequireDualStack\"\n                          (two IP families on dual-stack configured clusters, otherwise fail). The\n                          ipFamilies and clusterIPs fields depend on the value of this field. This\n                          field will be wiped when updating a service to type ExternalName.\n                        type: string\n                      loadBalancerClass:\n                        description: |-\n                          loadBalancerClass is the class of the load balancer implementation this Service belongs to.\n                          If specified, the value of this field must be a label-style identifier, with an optional prefix,\n                          e.g. \"internal-vip\" or \"example.com/internal-vip\". Unprefixed names are reserved for end-users.\n                          This field can only be set when the Service type is 'LoadBalancer'. If not set, the default load\n                          balancer implementation is used, today this is typically done through the cloud provider integration,\n                          but should apply for any default implementation. If set, it is assumed that a load balancer\n                          implementation is watching for Services with a matching class. Any default load balancer\n                          implementation (e.g. cloud providers) should ignore Services that set this field.\n                          This field can only be set when creating or updating a Service to type 'LoadBalancer'.\n                          Once set, it can not be changed. This field will be wiped when a service is updated to a non 'LoadBalancer' type.\n                        type: string\n                      loadBalancerIP:\n                        description: |-\n                          Only applies to Service Type: LoadBalancer.\n                          This feature depends on whether the underlying cloud-provider supports specifying\n                          the loadBalancerIP when a load balancer is created.\n                          This field will be ignored if the cloud-provider does not support the feature.\n                          Deprecated: This field was under-specified and its meaning varies across implementations.\n                          Using it is non-portable and it may not support dual-stack.\n                          Users are encouraged to use implementation-specific annotations when available.\n                        type: string\n                      loadBalancerSourceRanges:\n                        description: |-\n                          If specified and supported by the platform, this will restrict traffic through the cloud-provider\n                          load-balancer will be restricted to the specified client IPs. This field will be ignored if the\n                          cloud-provider does not support the feature.\"\n                          More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/\n                        items:\n                          type: string\n                        type: array\n                      ports:\n                        description: |-\n                          The list of ports that are exposed by this service.\n                          More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                        items:\n                          description: ServicePort contains information on service's\n                            port.\n                          properties:\n                            appProtocol:\n                              description: |-\n                                The application protocol for this port.\n                                This is used as a hint for implementations to offer richer behavior for protocols that they understand.\n                                This field follows standard Kubernetes label syntax.\n                                Valid values are either:\n\n\n                                * Un-prefixed protocol names - reserved for IANA standard service names (as per\n                                RFC-6335 and https://www.iana.org/assignments/service-names).\n\n\n                                * Kubernetes-defined prefixed names:\n                                  * 'kubernetes.io/h2c' - HTTP/2 prior knowledge over cleartext as described in https://www.rfc-editor.org/rfc/rfc9113.html#name-starting-http-2-with-prior-\n                                  * 'kubernetes.io/ws'  - WebSocket over cleartext as described in https://www.rfc-editor.org/rfc/rfc6455\n                                  * 'kubernetes.io/wss' - WebSocket over TLS as described in https://www.rfc-editor.org/rfc/rfc6455\n\n\n                                * Other protocols should use implementation-defined prefixed names such as\n                                mycompany.com/my-custom-protocol.\n                              type: string\n                            name:\n                              description: |-\n                                The name of this port within the service. This must be a DNS_LABEL.\n                                All ports within a ServiceSpec must have unique names. When considering\n                                the endpoints for a Service, this must match the 'name' field in the\n                                EndpointPort.\n                                Optional if only one ServicePort is defined on this service.\n                              type: string\n                            nodePort:\n                              description: |-\n                                The port on each node on which this service is exposed when type is\n                                NodePort or LoadBalancer.  Usually assigned by the system. If a value is\n                                specified, in-range, and not in use it will be used, otherwise the\n                                operation will fail.  If not specified, a port will be allocated if this\n                                Service requires one.  If this field is specified when creating a\n                                Service which does not need it, creation will fail. This field will be\n                                wiped when updating a Service to no longer need it (e.g. changing type\n                                from NodePort to ClusterIP).\n                                More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n                              format: int32\n                              type: integer\n                            port:\n                              description: The port that will be exposed by this service.\n                              format: int32\n                              type: integer\n                            protocol:\n                              default: TCP\n                              description: |-\n                                The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\".\n                                Default is TCP.\n                              type: string\n                            targetPort:\n                              anyOf:\n                              - type: integer\n                              - type: string\n                              description: |-\n                                Number or name of the port to access on the pods targeted by the service.\n                                Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME.\n                                If this is a string, it will be looked up as a named port in the\n                                target Pod's container ports. If this is not specified, the value\n                                of the 'port' field is used (an identity map).\n                                This field is ignored for services with clusterIP=None, and should be\n                                omitted or set equal to the 'port' field.\n                                More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service\n                              x-kubernetes-int-or-string: true\n                          required:\n                          - port\n                          type: object\n                        type: array\n                        x-kubernetes-list-map-keys:\n                        - port\n                        - protocol\n                        x-kubernetes-list-type: map\n                      publishNotReadyAddresses:\n                        description: |-\n                          publishNotReadyAddresses indicates that any agent which deals with endpoints for this\n                          Service should disregard any indications of ready/not-ready.\n                          The primary use case for setting this field is for a StatefulSet's Headless Service to\n                          propagate SRV DNS records for its Pods for the purpose of peer discovery.\n                          The Kubernetes controllers that generate Endpoints and EndpointSlice resources for\n                          Services interpret this to mean that all endpoints are considered \"ready\" even if the\n                          Pods themselves are not. Agents which consume only Kubernetes generated endpoints\n                          through the Endpoints or EndpointSlice resources can safely assume this behavior.\n                        type: boolean\n                      selector:\n                        additionalProperties:\n                          type: string\n                        description: |-\n                          Route service traffic to pods with label keys and values matching this\n                          selector. If empty or not present, the service is assumed to have an\n                          external process managing its endpoints, which Kubernetes will not\n                          modify. Only applies to types ClusterIP, NodePort, and LoadBalancer.\n                          Ignored if type is ExternalName.\n                          More info: https://kubernetes.io/docs/concepts/services-networking/service/\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      sessionAffinity:\n                        description: |-\n                          Supports \"ClientIP\" and \"None\". Used to maintain session affinity.\n                          Enable client IP based session affinity.\n                          Must be ClientIP or None.\n                          Defaults to None.\n                          More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies\n                        type: string\n                      sessionAffinityConfig:\n                        description: sessionAffinityConfig contains the configurations\n                          of session affinity.\n                        properties:\n                          clientIP:\n                            description: clientIP contains the configurations of Client\n                              IP based session affinity.\n                            properties:\n                              timeoutSeconds:\n                                description: |-\n                                  timeoutSeconds specifies the seconds of ClientIP type session sticky time.\n                                  The value must be >0 && <=86400(for 1 day) if ServiceAffinity == \"ClientIP\".\n                                  Default value is 10800(for 3 hours).\n                                format: int32\n                                type: integer\n                            type: object\n                        type: object\n                      type:\n                        description: |-\n                          type determines how the Service is exposed. Defaults to ClusterIP. Valid\n                          options are ExternalName, ClusterIP, NodePort, and LoadBalancer.\n                          \"ClusterIP\" allocates a cluster-internal IP address for load-balancing\n                          to endpoints. Endpoints are determined by the selector or if that is not\n                          specified, by manual construction of an Endpoints object or\n                          EndpointSlice objects. If clusterIP is \"None\", no virtual IP is\n                          allocated and the endpoints are published as a set of endpoints rather\n                          than a virtual IP.\n                          \"NodePort\" builds on ClusterIP and allocates a port on every node which\n                          routes to the same endpoints as the clusterIP.\n                          \"LoadBalancer\" builds on NodePort and creates an external load-balancer\n                          (if supported in the current cloud) which routes to the same endpoints\n                          as the clusterIP.\n                          \"ExternalName\" aliases this service to the specified externalName.\n                          Several other fields do not apply to ExternalName services.\n                          More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types\n                        type: string\n                    type: object\n                  status:\n                    description: |-\n                      Most recently observed status of the service.\n                      Populated by the system.\n                      Read-only.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                    properties:\n                      conditions:\n                        description: Current service state\n                        items:\n                          description: \"Condition contains details for one aspect\n                            of the current state of this API Resource.\\n---\\nThis\n                            struct is intended for direct use as an array at the field\n                            path .status.conditions.  For example,\\n\\n\\n\\ttype FooStatus\n                            struct{\\n\\t    // Represents the observations of a foo's\n                            current state.\\n\\t    // Known .status.conditions.type\n                            are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t\n                            \\   // +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t\n                            \\   // +listType=map\\n\\t    // +listMapKey=type\\n\\t    Conditions\n                            []metav1.Condition `json:\\\"conditions,omitempty\\\" patchStrategy:\\\"merge\\\"\n                            patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                            \\   // other fields\\n\\t}\"\n                          properties:\n                            lastTransitionTime:\n                              description: |-\n                                lastTransitionTime is the last time the condition transitioned from one status to another.\n                                This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                              format: date-time\n                              type: string\n                            message:\n                              description: |-\n                                message is a human readable message indicating details about the transition.\n                                This may be an empty string.\n                              maxLength: 32768\n                              type: string\n                            observedGeneration:\n                              description: |-\n                                observedGeneration represents the .metadata.generation that the condition was set based upon.\n                                For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                                with respect to the current state of the instance.\n                              format: int64\n                              minimum: 0\n                              type: integer\n                            reason:\n                              description: |-\n                                reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                                Producers of specific condition types may define expected values and meanings for this field,\n                                and whether the values are considered a guaranteed API.\n                                The value should be a CamelCase string.\n                                This field may not be empty.\n                              maxLength: 1024\n                              minLength: 1\n                              pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                              type: string\n                            status:\n                              description: status of the condition, one of True, False,\n                                Unknown.\n                              enum:\n                              - \"True\"\n                              - \"False\"\n                              - Unknown\n                              type: string\n                            type:\n                              description: |-\n                                type of condition in CamelCase or in foo.example.com/CamelCase.\n                                ---\n                                Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                                useful (see .node.status.conditions), the ability to deconflict is important.\n                                The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                              maxLength: 316\n                              pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                              type: string\n                          required:\n                          - lastTransitionTime\n                          - message\n                          - reason\n                          - status\n                          - type\n                          type: object\n                        type: array\n                        x-kubernetes-list-map-keys:\n                        - type\n                        x-kubernetes-list-type: map\n                      loadBalancer:\n                        description: |-\n                          LoadBalancer contains the current status of the load-balancer,\n                          if one is present.\n                        properties:\n                          ingress:\n                            description: |-\n                              Ingress is a list containing ingress points for the load-balancer.\n                              Traffic intended for the service should be sent to these ingress points.\n                            items:\n                              description: |-\n                                LoadBalancerIngress represents the status of a load-balancer ingress point:\n                                traffic intended for the service should be sent to an ingress point.\n                              properties:\n                                hostname:\n                                  description: |-\n                                    Hostname is set for load-balancer ingress points that are DNS based\n                                    (typically AWS load-balancers)\n                                  type: string\n                                ip:\n                                  description: |-\n                                    IP is set for load-balancer ingress points that are IP based\n                                    (typically GCE or OpenStack load-balancers)\n                                  type: string\n                                ipMode:\n                                  description: |-\n                                    IPMode specifies how the load-balancer IP behaves, and may only be specified when the ip field is specified.\n                                    Setting this to \"VIP\" indicates that traffic is delivered to the node with\n                                    the destination set to the load-balancer's IP and port.\n                                    Setting this to \"Proxy\" indicates that traffic is delivered to the node or pod with\n                                    the destination set to the node's IP and node port or the pod's IP and port.\n                                    Service implementations may use this information to adjust traffic routing.\n                                  type: string\n                                ports:\n                                  description: |-\n                                    Ports is a list of records of service ports\n                                    If used, every port defined in the service should have an entry in it\n                                  items:\n                                    properties:\n                                      error:\n                                        description: |-\n                                          Error is to record the problem with the service port\n                                          The format of the error shall comply with the following rules:\n                                          - built-in error values shall be specified in this file and those shall use\n                                            CamelCase names\n                                          - cloud provider specific error values must have names that comply with the\n                                            format foo.example.com/CamelCase.\n                                          ---\n                                          The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                                        maxLength: 316\n                                        pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                                        type: string\n                                      port:\n                                        description: Port is the port number of the\n                                          service port of which status is recorded\n                                          here\n                                        format: int32\n                                        type: integer\n                                      protocol:\n                                        default: TCP\n                                        description: |-\n                                          Protocol is the protocol of the service port of which status is recorded here\n                                          The supported values are: \"TCP\", \"UDP\", \"SCTP\"\n                                        type: string\n                                    required:\n                                    - port\n                                    - protocol\n                                    type: object\n                                  type: array\n                                  x-kubernetes-list-type: atomic\n                              type: object\n                            type: array\n                        type: object\n                    type: object\n                type: object\n                x-kubernetes-preserve-unknown-fields: true\n              template:\n                description: PodTemplateSpec describes the data a pod should have\n                  when created from a template\n                properties:\n                  metadata:\n                    description: |-\n                      Standard object's metadata.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata\n                    properties:\n                      annotations:\n                        additionalProperties:\n                          type: string\n                        type: object\n                      finalizers:\n                        items:\n                          type: string\n                        type: array\n                      labels:\n                        additionalProperties:\n                          type: string\n                        type: object\n                      name:\n                        type: string\n                      namespace:\n                        type: string\n                    type: object\n                  spec:\n                    description: |-\n                      Specification of the desired behavior of the pod.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status\n                    properties:\n                      activeDeadlineSeconds:\n                        description: |-\n                          Optional duration in seconds the pod may be active on the node relative to\n                          StartTime before the system will actively try to mark it failed and kill associated containers.\n                          Value must be a positive integer.\n                        format: int64\n                        type: integer\n                      affinity:\n                        description: If specified, the pod's scheduling constraints\n                        properties:\n                          nodeAffinity:\n                            description: Describes node affinity scheduling rules\n                              for the pod.\n                            properties:\n                              preferredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  The scheduler will prefer to schedule pods to nodes that satisfy\n                                  the affinity expressions specified by this field, but it may choose\n                                  a node that violates one or more of the expressions. The node that is\n                                  most preferred is the one with the greatest sum of weights, i.e.\n                                  for each node that meets all of the scheduling requirements (resource\n                                  request, requiredDuringScheduling affinity expressions, etc.),\n                                  compute a sum by iterating through the elements of this field and adding\n                                  \"weight\" to the sum if the node matches the corresponding matchExpressions; the\n                                  node(s) with the highest sum are the most preferred.\n                                items:\n                                  description: |-\n                                    An empty preferred scheduling term matches all objects with implicit weight 0\n                                    (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\n                                  properties:\n                                    preference:\n                                      description: A node selector term, associated\n                                        with the corresponding weight.\n                                      properties:\n                                        matchExpressions:\n                                          description: A list of node selector requirements\n                                            by node's labels.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchFields:\n                                          description: A list of node selector requirements\n                                            by node's fields.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    weight:\n                                      description: Weight associated with matching\n                                        the corresponding nodeSelectorTerm, in the\n                                        range 1-100.\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - preference\n                                  - weight\n                                  type: object\n                                type: array\n                              requiredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  If the affinity requirements specified by this field are not met at\n                                  scheduling time, the pod will not be scheduled onto the node.\n                                  If the affinity requirements specified by this field cease to be met\n                                  at some point during pod execution (e.g. due to an update), the system\n                                  may or may not try to eventually evict the pod from its node.\n                                properties:\n                                  nodeSelectorTerms:\n                                    description: Required. A list of node selector\n                                      terms. The terms are ORed.\n                                    items:\n                                      description: |-\n                                        A null or empty node selector term matches no objects. The requirements of\n                                        them are ANDed.\n                                        The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\n                                      properties:\n                                        matchExpressions:\n                                          description: A list of node selector requirements\n                                            by node's labels.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchFields:\n                                          description: A list of node selector requirements\n                                            by node's fields.\n                                          items:\n                                            description: |-\n                                              A node selector requirement is a selector that contains values, a key, and an operator\n                                              that relates the key and values.\n                                            properties:\n                                              key:\n                                                description: The label key that the\n                                                  selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  Represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  An array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. If the operator is Gt or Lt, the values\n                                                  array must have a single element, which will be interpreted as an integer.\n                                                  This array is replaced during a strategic merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    type: array\n                                required:\n                                - nodeSelectorTerms\n                                type: object\n                                x-kubernetes-map-type: atomic\n                            type: object\n                          podAffinity:\n                            description: Describes pod affinity scheduling rules (e.g.\n                              co-locate this pod in the same node, zone, etc. as some\n                              other pod(s)).\n                            properties:\n                              preferredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  The scheduler will prefer to schedule pods to nodes that satisfy\n                                  the affinity expressions specified by this field, but it may choose\n                                  a node that violates one or more of the expressions. The node that is\n                                  most preferred is the one with the greatest sum of weights, i.e.\n                                  for each node that meets all of the scheduling requirements (resource\n                                  request, requiredDuringScheduling affinity expressions, etc.),\n                                  compute a sum by iterating through the elements of this field and adding\n                                  \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                  node(s) with the highest sum are the most preferred.\n                                items:\n                                  description: The weights of all of the matched WeightedPodAffinityTerm\n                                    fields are added per-node to find the most preferred\n                                    node(s)\n                                  properties:\n                                    podAffinityTerm:\n                                      description: Required. A pod affinity term,\n                                        associated with the corresponding weight.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            A label query over a set of resources, in this case pods.\n                                            If it's null, this PodAffinityTerm matches with no Pods.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        mismatchLabelKeys:\n                                          description: |-\n                                            MismatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                            Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        namespaceSelector:\n                                          description: |-\n                                            A label query over the set of namespaces that the term applies to.\n                                            The term is applied to the union of the namespaces selected by this field\n                                            and the ones listed in the namespaces field.\n                                            null selector and null or empty namespaces list means \"this pod's namespace\".\n                                            An empty selector ({}) matches all namespaces.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        namespaces:\n                                          description: |-\n                                            namespaces specifies a static list of namespace names that the term applies to.\n                                            The term is applied to the union of the namespaces listed in this field\n                                            and the ones selected by namespaceSelector.\n                                            null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                          items:\n                                            type: string\n                                          type: array\n                                        topologyKey:\n                                          description: |-\n                                            This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                            the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                            whose value of the label with key topologyKey matches that of any node on which any of the\n                                            selected pods is running.\n                                            Empty topologyKey is not allowed.\n                                          type: string\n                                      required:\n                                      - topologyKey\n                                      type: object\n                                    weight:\n                                      description: |-\n                                        weight associated with matching the corresponding podAffinityTerm,\n                                        in the range 1-100.\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - podAffinityTerm\n                                  - weight\n                                  type: object\n                                type: array\n                              requiredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  If the affinity requirements specified by this field are not met at\n                                  scheduling time, the pod will not be scheduled onto the node.\n                                  If the affinity requirements specified by this field cease to be met\n                                  at some point during pod execution (e.g. due to a pod label update), the\n                                  system may or may not try to eventually evict the pod from its node.\n                                  When there are multiple elements, the lists of nodes corresponding to each\n                                  podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                items:\n                                  description: |-\n                                    Defines a set of pods (namely those matching the labelSelector\n                                    relative to the given namespace(s)) that this pod should be\n                                    co-located (affinity) or not co-located (anti-affinity) with,\n                                    where co-located is defined as running on a node whose value of\n                                    the label with key <topologyKey> matches that of any node on which\n                                    a pod of the set of pods is running\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                type: array\n                            type: object\n                          podAntiAffinity:\n                            description: Describes pod anti-affinity scheduling rules\n                              (e.g. avoid putting this pod in the same node, zone,\n                              etc. as some other pod(s)).\n                            properties:\n                              preferredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  The scheduler will prefer to schedule pods to nodes that satisfy\n                                  the anti-affinity expressions specified by this field, but it may choose\n                                  a node that violates one or more of the expressions. The node that is\n                                  most preferred is the one with the greatest sum of weights, i.e.\n                                  for each node that meets all of the scheduling requirements (resource\n                                  request, requiredDuringScheduling anti-affinity expressions, etc.),\n                                  compute a sum by iterating through the elements of this field and adding\n                                  \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the\n                                  node(s) with the highest sum are the most preferred.\n                                items:\n                                  description: The weights of all of the matched WeightedPodAffinityTerm\n                                    fields are added per-node to find the most preferred\n                                    node(s)\n                                  properties:\n                                    podAffinityTerm:\n                                      description: Required. A pod affinity term,\n                                        associated with the corresponding weight.\n                                      properties:\n                                        labelSelector:\n                                          description: |-\n                                            A label query over a set of resources, in this case pods.\n                                            If it's null, this PodAffinityTerm matches with no Pods.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        matchLabelKeys:\n                                          description: |-\n                                            MatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                            Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        mismatchLabelKeys:\n                                          description: |-\n                                            MismatchLabelKeys is a set of pod label keys to select which pods will\n                                            be taken into consideration. The keys are used to lookup values from the\n                                            incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                            to select the group of existing pods which pods will be taken into consideration\n                                            for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                            pod labels will be ignored. The default value is empty.\n                                            The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                            Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                            This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                          items:\n                                            type: string\n                                          type: array\n                                          x-kubernetes-list-type: atomic\n                                        namespaceSelector:\n                                          description: |-\n                                            A label query over the set of namespaces that the term applies to.\n                                            The term is applied to the union of the namespaces selected by this field\n                                            and the ones listed in the namespaces field.\n                                            null selector and null or empty namespaces list means \"this pod's namespace\".\n                                            An empty selector ({}) matches all namespaces.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        namespaces:\n                                          description: |-\n                                            namespaces specifies a static list of namespace names that the term applies to.\n                                            The term is applied to the union of the namespaces listed in this field\n                                            and the ones selected by namespaceSelector.\n                                            null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                          items:\n                                            type: string\n                                          type: array\n                                        topologyKey:\n                                          description: |-\n                                            This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                            the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                            whose value of the label with key topologyKey matches that of any node on which any of the\n                                            selected pods is running.\n                                            Empty topologyKey is not allowed.\n                                          type: string\n                                      required:\n                                      - topologyKey\n                                      type: object\n                                    weight:\n                                      description: |-\n                                        weight associated with matching the corresponding podAffinityTerm,\n                                        in the range 1-100.\n                                      format: int32\n                                      type: integer\n                                  required:\n                                  - podAffinityTerm\n                                  - weight\n                                  type: object\n                                type: array\n                              requiredDuringSchedulingIgnoredDuringExecution:\n                                description: |-\n                                  If the anti-affinity requirements specified by this field are not met at\n                                  scheduling time, the pod will not be scheduled onto the node.\n                                  If the anti-affinity requirements specified by this field cease to be met\n                                  at some point during pod execution (e.g. due to a pod label update), the\n                                  system may or may not try to eventually evict the pod from its node.\n                                  When there are multiple elements, the lists of nodes corresponding to each\n                                  podAffinityTerm are intersected, i.e. all terms must be satisfied.\n                                items:\n                                  description: |-\n                                    Defines a set of pods (namely those matching the labelSelector\n                                    relative to the given namespace(s)) that this pod should be\n                                    co-located (affinity) or not co-located (anti-affinity) with,\n                                    where co-located is defined as running on a node whose value of\n                                    the label with key <topologyKey> matches that of any node on which\n                                    a pod of the set of pods is running\n                                  properties:\n                                    labelSelector:\n                                      description: |-\n                                        A label query over a set of resources, in this case pods.\n                                        If it's null, this PodAffinityTerm matches with no Pods.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    matchLabelKeys:\n                                      description: |-\n                                        MatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                        Also, MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    mismatchLabelKeys:\n                                      description: |-\n                                        MismatchLabelKeys is a set of pod label keys to select which pods will\n                                        be taken into consideration. The keys are used to lookup values from the\n                                        incoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\n                                        to select the group of existing pods which pods will be taken into consideration\n                                        for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\n                                        pod labels will be ignored. The default value is empty.\n                                        The same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\n                                        Also, MismatchLabelKeys cannot be set when LabelSelector isn't set.\n                                        This is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n                                      items:\n                                        type: string\n                                      type: array\n                                      x-kubernetes-list-type: atomic\n                                    namespaceSelector:\n                                      description: |-\n                                        A label query over the set of namespaces that the term applies to.\n                                        The term is applied to the union of the namespaces selected by this field\n                                        and the ones listed in the namespaces field.\n                                        null selector and null or empty namespaces list means \"this pod's namespace\".\n                                        An empty selector ({}) matches all namespaces.\n                                      properties:\n                                        matchExpressions:\n                                          description: matchExpressions is a list\n                                            of label selector requirements. The requirements\n                                            are ANDed.\n                                          items:\n                                            description: |-\n                                              A label selector requirement is a selector that contains values, a key, and an operator that\n                                              relates the key and values.\n                                            properties:\n                                              key:\n                                                description: key is the label key\n                                                  that the selector applies to.\n                                                type: string\n                                              operator:\n                                                description: |-\n                                                  operator represents a key's relationship to a set of values.\n                                                  Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                type: string\n                                              values:\n                                                description: |-\n                                                  values is an array of string values. If the operator is In or NotIn,\n                                                  the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                  the values array must be empty. This array is replaced during a strategic\n                                                  merge patch.\n                                                items:\n                                                  type: string\n                                                type: array\n                                            required:\n                                            - key\n                                            - operator\n                                            type: object\n                                          type: array\n                                        matchLabels:\n                                          additionalProperties:\n                                            type: string\n                                          description: |-\n                                            matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                            map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                            operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                          type: object\n                                      type: object\n                                      x-kubernetes-map-type: atomic\n                                    namespaces:\n                                      description: |-\n                                        namespaces specifies a static list of namespace names that the term applies to.\n                                        The term is applied to the union of the namespaces listed in this field\n                                        and the ones selected by namespaceSelector.\n                                        null or empty namespaces list and null namespaceSelector means \"this pod's namespace\".\n                                      items:\n                                        type: string\n                                      type: array\n                                    topologyKey:\n                                      description: |-\n                                        This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching\n                                        the labelSelector in the specified namespaces, where co-located is defined as running on a node\n                                        whose value of the label with key topologyKey matches that of any node on which any of the\n                                        selected pods is running.\n                                        Empty topologyKey is not allowed.\n                                      type: string\n                                  required:\n                                  - topologyKey\n                                  type: object\n                                type: array\n                            type: object\n                        type: object\n                      automountServiceAccountToken:\n                        description: AutomountServiceAccountToken indicates whether\n                          a service account token should be automatically mounted.\n                        type: boolean\n                      containers:\n                        description: |-\n                          List of containers belonging to the pod.\n                          Containers cannot currently be added or removed.\n                          There must be at least one container in a Pod.\n                          Cannot be updated.\n                        items:\n                          description: A single application container that you want\n                            to run within a pod.\n                          properties:\n                            args:\n                              description: |-\n                                Arguments to the entrypoint.\n                                The container image's CMD is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: |-\n                                Entrypoint array. Not executed within a shell.\n                                The container image's ENTRYPOINT is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            env:\n                              description: |-\n                                List of environment variables to set in the container.\n                                Cannot be updated.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            envFrom:\n                              description: |-\n                                List of sources to populate environment variables in the container.\n                                The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                will be reported as an event when the container is starting. When a key exists in multiple\n                                sources, the value associated with the last source will take precedence.\n                                Values defined by an Env with a duplicate key will take precedence.\n                                Cannot be updated.\n                              items:\n                                description: EnvFromSource represents the source of\n                                  a set of ConfigMaps\n                                properties:\n                                  configMapRef:\n                                    description: The ConfigMap to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  prefix:\n                                    description: An optional identifier to prepend\n                                      to each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                    type: string\n                                  secretRef:\n                                    description: The Secret to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret must\n                                          be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                              type: array\n                            image:\n                              description: |-\n                                Container image name.\n                                More info: https://kubernetes.io/docs/concepts/containers/images\n                                This field is optional to allow higher level config management to default or override\n                                container images in workload controllers like Deployments and StatefulSets.\n                              type: string\n                            imagePullPolicy:\n                              description: |-\n                                Image pull policy.\n                                One of Always, Never, IfNotPresent.\n                                Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                              type: string\n                            lifecycle:\n                              description: |-\n                                Actions that the management system should take in response to container lifecycle events.\n                                Cannot be updated.\n                              properties:\n                                postStart:\n                                  description: |-\n                                    PostStart is called immediately after a container is created. If the handler fails,\n                                    the container is terminated and restarted according to its restart policy.\n                                    Other management of the container blocks until the hook completes.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                                preStop:\n                                  description: |-\n                                    PreStop is called immediately before a container is terminated due to an\n                                    API request or management event such as liveness/startup probe failure,\n                                    preemption, resource contention, etc. The handler is not called if the\n                                    container crashes or exits. The Pod's termination grace period countdown begins before the\n                                    PreStop hook is executed. Regardless of the outcome of the handler, the\n                                    container will eventually terminate within the Pod's termination grace\n                                    period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                    or until the termination grace period is reached.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                              type: object\n                            livenessProbe:\n                              description: |-\n                                Periodic probe of container liveness.\n                                Container will be restarted if the probe fails.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            name:\n                              description: |-\n                                Name of the container specified as a DNS_LABEL.\n                                Each container in a pod must have a unique name (DNS_LABEL).\n                                Cannot be updated.\n                              type: string\n                            ports:\n                              description: |-\n                                List of ports to expose from the container. Not specifying a port here\n                                DOES NOT prevent that port from being exposed. Any port which is\n                                listening on the default \"0.0.0.0\" address inside a container will be\n                                accessible from the network.\n                                Modifying this array with strategic merge patch may corrupt the data.\n                                For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                                Cannot be updated.\n                              items:\n                                description: ContainerPort represents a network port\n                                  in a single container.\n                                properties:\n                                  containerPort:\n                                    description: |-\n                                      Number of port to expose on the pod's IP address.\n                                      This must be a valid port number, 0 < x < 65536.\n                                    format: int32\n                                    type: integer\n                                  hostIP:\n                                    description: What host IP to bind the external\n                                      port to.\n                                    type: string\n                                  hostPort:\n                                    description: |-\n                                      Number of port to expose on the host.\n                                      If specified, this must be a valid port number, 0 < x < 65536.\n                                      If HostNetwork is specified, this must match ContainerPort.\n                                      Most containers do not need this.\n                                    format: int32\n                                    type: integer\n                                  name:\n                                    description: |-\n                                      If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                      named port in a pod must have a unique name. Name for the port that can be\n                                      referred to by services.\n                                    type: string\n                                  protocol:\n                                    default: TCP\n                                    description: |-\n                                      Protocol for port. Must be UDP, TCP, or SCTP.\n                                      Defaults to \"TCP\".\n                                    type: string\n                                required:\n                                - containerPort\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - containerPort\n                              - protocol\n                              x-kubernetes-list-type: map\n                            readinessProbe:\n                              description: |-\n                                Periodic probe of container service readiness.\n                                Container will be removed from service endpoints if the probe fails.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            resizePolicy:\n                              description: Resources resize policy for the container.\n                              items:\n                                description: ContainerResizePolicy represents resource\n                                  resize policy for the container.\n                                properties:\n                                  resourceName:\n                                    description: |-\n                                      Name of the resource to which this resource resize policy applies.\n                                      Supported values: cpu, memory.\n                                    type: string\n                                  restartPolicy:\n                                    description: |-\n                                      Restart policy to apply when specified resource is resized.\n                                      If not specified, it defaults to NotRequired.\n                                    type: string\n                                required:\n                                - resourceName\n                                - restartPolicy\n                                type: object\n                              type: array\n                              x-kubernetes-list-type: atomic\n                            resources:\n                              description: |-\n                                Compute Resources required by this container.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              properties:\n                                claims:\n                                  description: |-\n                                    Claims lists the names of resources, defined in spec.resourceClaims,\n                                    that are used by this container.\n\n\n                                    This is an alpha field and requires enabling the\n                                    DynamicResourceAllocation feature gate.\n\n\n                                    This field is immutable. It can only be set for containers.\n                                  items:\n                                    description: ResourceClaim references one entry\n                                      in PodSpec.ResourceClaims.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name must match the name of one entry in pod.spec.resourceClaims of\n                                          the Pod where this field is used. It makes that resource available\n                                          inside a container.\n                                        type: string\n                                    required:\n                                    - name\n                                    type: object\n                                  type: array\n                                  x-kubernetes-list-map-keys:\n                                  - name\n                                  x-kubernetes-list-type: map\n                                limits:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Limits describes the maximum amount of compute resources allowed.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                                requests:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Requests describes the minimum amount of compute resources required.\n                                    If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                    otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                              type: object\n                            restartPolicy:\n                              description: |-\n                                RestartPolicy defines the restart behavior of individual containers in a pod.\n                                This field may only be set for init containers, and the only allowed value is \"Always\".\n                                For non-init containers or when this field is not specified,\n                                the restart behavior is defined by the Pod's restart policy and the container type.\n                                Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                                this init container will be continually restarted on\n                                exit until all regular containers have terminated. Once all regular\n                                containers have completed, all init containers with restartPolicy \"Always\"\n                                will be shut down. This lifecycle differs from normal init containers and\n                                is often referred to as a \"sidecar\" container. Although this init\n                                container still starts in the init container sequence, it does not wait\n                                for the container to complete before proceeding to the next init\n                                container. Instead, the next init container starts immediately after this\n                                init container is started, or after any startupProbe has successfully\n                                completed.\n                              type: string\n                            securityContext:\n                              description: |-\n                                SecurityContext defines the security options the container should be run with.\n                                If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                              properties:\n                                allowPrivilegeEscalation:\n                                  description: |-\n                                    AllowPrivilegeEscalation controls whether a process can gain more\n                                    privileges than its parent process. This bool directly controls if\n                                    the no_new_privs flag will be set on the container process.\n                                    AllowPrivilegeEscalation is true always when the container is:\n                                    1) run as Privileged\n                                    2) has CAP_SYS_ADMIN\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                capabilities:\n                                  description: |-\n                                    The capabilities to add/drop when running containers.\n                                    Defaults to the default set of capabilities granted by the container runtime.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    add:\n                                      description: Added capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                    drop:\n                                      description: Removed capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                  type: object\n                                privileged:\n                                  description: |-\n                                    Run container in privileged mode.\n                                    Processes in privileged containers are essentially equivalent to root on the host.\n                                    Defaults to false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                procMount:\n                                  description: |-\n                                    procMount denotes the type of proc mount to use for the containers.\n                                    The default is DefaultProcMount which uses the container runtime defaults for\n                                    readonly paths and masked paths.\n                                    This requires the ProcMountType feature flag to be enabled.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: string\n                                readOnlyRootFilesystem:\n                                  description: |-\n                                    Whether this container has a read-only root filesystem.\n                                    Default is false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                runAsGroup:\n                                  description: |-\n                                    The GID to run the entrypoint of the container process.\n                                    Uses runtime default if unset.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                runAsNonRoot:\n                                  description: |-\n                                    Indicates that the container must run as a non-root user.\n                                    If true, the Kubelet will validate the image at runtime to ensure that it\n                                    does not run as UID 0 (root) and fail to start the container if it does.\n                                    If unset or false, no such validation will be performed.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: boolean\n                                runAsUser:\n                                  description: |-\n                                    The UID to run the entrypoint of the container process.\n                                    Defaults to user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                seLinuxOptions:\n                                  description: |-\n                                    The SELinux context to be applied to the container.\n                                    If unspecified, the container runtime will allocate a random SELinux context for each\n                                    container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    level:\n                                      description: Level is SELinux level label that\n                                        applies to the container.\n                                      type: string\n                                    role:\n                                      description: Role is a SELinux role label that\n                                        applies to the container.\n                                      type: string\n                                    type:\n                                      description: Type is a SELinux type label that\n                                        applies to the container.\n                                      type: string\n                                    user:\n                                      description: User is a SELinux user label that\n                                        applies to the container.\n                                      type: string\n                                  type: object\n                                seccompProfile:\n                                  description: |-\n                                    The seccomp options to use by this container. If seccomp options are\n                                    provided at both the pod & container level, the container options\n                                    override the pod options.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    localhostProfile:\n                                      description: |-\n                                        localhostProfile indicates a profile defined in a file on the node should be used.\n                                        The profile must be preconfigured on the node to work.\n                                        Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                        Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                      type: string\n                                    type:\n                                      description: |-\n                                        type indicates which kind of seccomp profile will be applied.\n                                        Valid options are:\n\n\n                                        Localhost - a profile defined in a file on the node should be used.\n                                        RuntimeDefault - the container runtime default profile should be used.\n                                        Unconfined - no profile should be applied.\n                                      type: string\n                                  required:\n                                  - type\n                                  type: object\n                                windowsOptions:\n                                  description: |-\n                                    The Windows specific settings applied to all containers.\n                                    If unspecified, the options from the PodSecurityContext will be used.\n                                    If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is linux.\n                                  properties:\n                                    gmsaCredentialSpec:\n                                      description: |-\n                                        GMSACredentialSpec is where the GMSA admission webhook\n                                        (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                        GMSA credential spec named by the GMSACredentialSpecName field.\n                                      type: string\n                                    gmsaCredentialSpecName:\n                                      description: GMSACredentialSpecName is the name\n                                        of the GMSA credential spec to use.\n                                      type: string\n                                    hostProcess:\n                                      description: |-\n                                        HostProcess determines if a container should be run as a 'Host Process' container.\n                                        All of a Pod's containers must have the same effective HostProcess value\n                                        (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                        In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                      type: boolean\n                                    runAsUserName:\n                                      description: |-\n                                        The UserName in Windows to run the entrypoint of the container process.\n                                        Defaults to the user specified in image metadata if unspecified.\n                                        May also be set in PodSecurityContext. If set in both SecurityContext and\n                                        PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      type: string\n                                  type: object\n                              type: object\n                            startupProbe:\n                              description: |-\n                                StartupProbe indicates that the Pod has successfully initialized.\n                                If specified, no other probes are executed until this completes successfully.\n                                If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                                This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                                when it might take a long time to load data or warm a cache, than during steady-state operation.\n                                This cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            stdin:\n                              description: |-\n                                Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                is not set, reads from stdin in the container will always result in EOF.\n                                Default is false.\n                              type: boolean\n                            stdinOnce:\n                              description: |-\n                                Whether the container runtime should close the stdin channel after it has been opened by\n                                a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                at which time stdin is closed and remains closed until the container is restarted. If this\n                                flag is false, a container processes that reads from stdin will never receive an EOF.\n                                Default is false\n                              type: boolean\n                            terminationMessagePath:\n                              description: |-\n                                Optional: Path at which the file to which the container's termination message\n                                will be written is mounted into the container's filesystem.\n                                Message written is intended to be brief final status, such as an assertion failure message.\n                                Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                all containers will be limited to 12kb.\n                                Defaults to /dev/termination-log.\n                                Cannot be updated.\n                              type: string\n                            terminationMessagePolicy:\n                              description: |-\n                                Indicate how the termination message should be populated. File will use the contents of\n                                terminationMessagePath to populate the container status message on both success and failure.\n                                FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                message file is empty and the container exited with an error.\n                                The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                Defaults to File.\n                                Cannot be updated.\n                              type: string\n                            tty:\n                              description: |-\n                                Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                Default is false.\n                              type: boolean\n                            volumeDevices:\n                              description: volumeDevices is the list of block devices\n                                to be used by the container.\n                              items:\n                                description: volumeDevice describes a mapping of a\n                                  raw block device within a container.\n                                properties:\n                                  devicePath:\n                                    description: devicePath is the path inside of\n                                      the container that the device will be mapped\n                                      to.\n                                    type: string\n                                  name:\n                                    description: name must match the name of a persistentVolumeClaim\n                                      in the pod\n                                    type: string\n                                required:\n                                - devicePath\n                                - name\n                                type: object\n                              type: array\n                            volumeMounts:\n                              description: |-\n                                Pod volumes to mount into the container's filesystem.\n                                Cannot be updated.\n                              items:\n                                description: VolumeMount describes a mounting of a\n                                  Volume within a container.\n                                properties:\n                                  mountPath:\n                                    description: |-\n                                      Path within the container at which the volume should be mounted.  Must\n                                      not contain ':'.\n                                    type: string\n                                  mountPropagation:\n                                    description: |-\n                                      mountPropagation determines how mounts are propagated from the host\n                                      to container and the other way around.\n                                      When not set, MountPropagationNone is used.\n                                      This field is beta in 1.10.\n                                    type: string\n                                  name:\n                                    description: This must match the Name of a Volume.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      Mounted read-only if true, read-write otherwise (false or unspecified).\n                                      Defaults to false.\n                                    type: boolean\n                                  subPath:\n                                    description: |-\n                                      Path within the volume from which the container's volume should be mounted.\n                                      Defaults to \"\" (volume's root).\n                                    type: string\n                                  subPathExpr:\n                                    description: |-\n                                      Expanded path within the volume from which the container's volume should be mounted.\n                                      Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                      Defaults to \"\" (volume's root).\n                                      SubPathExpr and SubPath are mutually exclusive.\n                                    type: string\n                                required:\n                                - mountPath\n                                - name\n                                type: object\n                              type: array\n                            workingDir:\n                              description: |-\n                                Container's working directory.\n                                If not specified, the container runtime's default will be used, which\n                                might be configured in the container image.\n                                Cannot be updated.\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        type: array\n                      dnsConfig:\n                        description: |-\n                          Specifies the DNS parameters of a pod.\n                          Parameters specified here will be merged to the generated DNS\n                          configuration based on DNSPolicy.\n                        properties:\n                          nameservers:\n                            description: |-\n                              A list of DNS name server IP addresses.\n                              This will be appended to the base nameservers generated from DNSPolicy.\n                              Duplicated nameservers will be removed.\n                            items:\n                              type: string\n                            type: array\n                          options:\n                            description: |-\n                              A list of DNS resolver options.\n                              This will be merged with the base options generated from DNSPolicy.\n                              Duplicated entries will be removed. Resolution options given in Options\n                              will override those that appear in the base DNSPolicy.\n                            items:\n                              description: PodDNSConfigOption defines DNS resolver\n                                options of a pod.\n                              properties:\n                                name:\n                                  description: Required.\n                                  type: string\n                                value:\n                                  type: string\n                              type: object\n                            type: array\n                          searches:\n                            description: |-\n                              A list of DNS search domains for host-name lookup.\n                              This will be appended to the base search paths generated from DNSPolicy.\n                              Duplicated search paths will be removed.\n                            items:\n                              type: string\n                            type: array\n                        type: object\n                      dnsPolicy:\n                        description: |-\n                          Set DNS policy for the pod.\n                          Defaults to \"ClusterFirst\".\n                          Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'.\n                          DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy.\n                          To have DNS options set along with hostNetwork, you have to specify DNS policy\n                          explicitly to 'ClusterFirstWithHostNet'.\n                        type: string\n                      enableServiceLinks:\n                        description: |-\n                          EnableServiceLinks indicates whether information about services should be injected into pod's\n                          environment variables, matching the syntax of Docker links.\n                          Optional: Defaults to true.\n                        type: boolean\n                      ephemeralContainers:\n                        description: |-\n                          List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing\n                          pod to perform user-initiated actions such as debugging. This list cannot be specified when\n                          creating a pod, and it cannot be modified by updating the pod spec. In order to add an\n                          ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.\n                        items:\n                          description: |-\n                            An EphemeralContainer is a temporary container that you may add to an existing Pod for\n                            user-initiated activities such as debugging. Ephemeral containers have no resource or\n                            scheduling guarantees, and they will not be restarted when they exit or when a Pod is\n                            removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the\n                            Pod to exceed its resource allocation.\n\n\n                            To add an ephemeral container, use the ephemeralcontainers subresource of an existing\n                            Pod. Ephemeral containers may not be removed or restarted.\n                          properties:\n                            args:\n                              description: |-\n                                Arguments to the entrypoint.\n                                The image's CMD is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: |-\n                                Entrypoint array. Not executed within a shell.\n                                The image's ENTRYPOINT is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            env:\n                              description: |-\n                                List of environment variables to set in the container.\n                                Cannot be updated.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            envFrom:\n                              description: |-\n                                List of sources to populate environment variables in the container.\n                                The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                will be reported as an event when the container is starting. When a key exists in multiple\n                                sources, the value associated with the last source will take precedence.\n                                Values defined by an Env with a duplicate key will take precedence.\n                                Cannot be updated.\n                              items:\n                                description: EnvFromSource represents the source of\n                                  a set of ConfigMaps\n                                properties:\n                                  configMapRef:\n                                    description: The ConfigMap to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  prefix:\n                                    description: An optional identifier to prepend\n                                      to each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                    type: string\n                                  secretRef:\n                                    description: The Secret to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret must\n                                          be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                              type: array\n                            image:\n                              description: |-\n                                Container image name.\n                                More info: https://kubernetes.io/docs/concepts/containers/images\n                              type: string\n                            imagePullPolicy:\n                              description: |-\n                                Image pull policy.\n                                One of Always, Never, IfNotPresent.\n                                Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                              type: string\n                            lifecycle:\n                              description: Lifecycle is not allowed for ephemeral\n                                containers.\n                              properties:\n                                postStart:\n                                  description: |-\n                                    PostStart is called immediately after a container is created. If the handler fails,\n                                    the container is terminated and restarted according to its restart policy.\n                                    Other management of the container blocks until the hook completes.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                                preStop:\n                                  description: |-\n                                    PreStop is called immediately before a container is terminated due to an\n                                    API request or management event such as liveness/startup probe failure,\n                                    preemption, resource contention, etc. The handler is not called if the\n                                    container crashes or exits. The Pod's termination grace period countdown begins before the\n                                    PreStop hook is executed. Regardless of the outcome of the handler, the\n                                    container will eventually terminate within the Pod's termination grace\n                                    period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                    or until the termination grace period is reached.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                              type: object\n                            livenessProbe:\n                              description: Probes are not allowed for ephemeral containers.\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            name:\n                              description: |-\n                                Name of the ephemeral container specified as a DNS_LABEL.\n                                This name must be unique among all containers, init containers and ephemeral containers.\n                              type: string\n                            ports:\n                              description: Ports are not allowed for ephemeral containers.\n                              items:\n                                description: ContainerPort represents a network port\n                                  in a single container.\n                                properties:\n                                  containerPort:\n                                    description: |-\n                                      Number of port to expose on the pod's IP address.\n                                      This must be a valid port number, 0 < x < 65536.\n                                    format: int32\n                                    type: integer\n                                  hostIP:\n                                    description: What host IP to bind the external\n                                      port to.\n                                    type: string\n                                  hostPort:\n                                    description: |-\n                                      Number of port to expose on the host.\n                                      If specified, this must be a valid port number, 0 < x < 65536.\n                                      If HostNetwork is specified, this must match ContainerPort.\n                                      Most containers do not need this.\n                                    format: int32\n                                    type: integer\n                                  name:\n                                    description: |-\n                                      If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                      named port in a pod must have a unique name. Name for the port that can be\n                                      referred to by services.\n                                    type: string\n                                  protocol:\n                                    default: TCP\n                                    description: |-\n                                      Protocol for port. Must be UDP, TCP, or SCTP.\n                                      Defaults to \"TCP\".\n                                    type: string\n                                required:\n                                - containerPort\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - containerPort\n                              - protocol\n                              x-kubernetes-list-type: map\n                            readinessProbe:\n                              description: Probes are not allowed for ephemeral containers.\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            resizePolicy:\n                              description: Resources resize policy for the container.\n                              items:\n                                description: ContainerResizePolicy represents resource\n                                  resize policy for the container.\n                                properties:\n                                  resourceName:\n                                    description: |-\n                                      Name of the resource to which this resource resize policy applies.\n                                      Supported values: cpu, memory.\n                                    type: string\n                                  restartPolicy:\n                                    description: |-\n                                      Restart policy to apply when specified resource is resized.\n                                      If not specified, it defaults to NotRequired.\n                                    type: string\n                                required:\n                                - resourceName\n                                - restartPolicy\n                                type: object\n                              type: array\n                              x-kubernetes-list-type: atomic\n                            resources:\n                              description: |-\n                                Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources\n                                already allocated to the pod.\n                              properties:\n                                claims:\n                                  description: |-\n                                    Claims lists the names of resources, defined in spec.resourceClaims,\n                                    that are used by this container.\n\n\n                                    This is an alpha field and requires enabling the\n                                    DynamicResourceAllocation feature gate.\n\n\n                                    This field is immutable. It can only be set for containers.\n                                  items:\n                                    description: ResourceClaim references one entry\n                                      in PodSpec.ResourceClaims.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name must match the name of one entry in pod.spec.resourceClaims of\n                                          the Pod where this field is used. It makes that resource available\n                                          inside a container.\n                                        type: string\n                                    required:\n                                    - name\n                                    type: object\n                                  type: array\n                                  x-kubernetes-list-map-keys:\n                                  - name\n                                  x-kubernetes-list-type: map\n                                limits:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Limits describes the maximum amount of compute resources allowed.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                                requests:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Requests describes the minimum amount of compute resources required.\n                                    If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                    otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                              type: object\n                            restartPolicy:\n                              description: |-\n                                Restart policy for the container to manage the restart behavior of each\n                                container within a pod.\n                                This may only be set for init containers. You cannot set this field on\n                                ephemeral containers.\n                              type: string\n                            securityContext:\n                              description: |-\n                                Optional: SecurityContext defines the security options the ephemeral container should be run with.\n                                If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                              properties:\n                                allowPrivilegeEscalation:\n                                  description: |-\n                                    AllowPrivilegeEscalation controls whether a process can gain more\n                                    privileges than its parent process. This bool directly controls if\n                                    the no_new_privs flag will be set on the container process.\n                                    AllowPrivilegeEscalation is true always when the container is:\n                                    1) run as Privileged\n                                    2) has CAP_SYS_ADMIN\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                capabilities:\n                                  description: |-\n                                    The capabilities to add/drop when running containers.\n                                    Defaults to the default set of capabilities granted by the container runtime.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    add:\n                                      description: Added capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                    drop:\n                                      description: Removed capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                  type: object\n                                privileged:\n                                  description: |-\n                                    Run container in privileged mode.\n                                    Processes in privileged containers are essentially equivalent to root on the host.\n                                    Defaults to false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                procMount:\n                                  description: |-\n                                    procMount denotes the type of proc mount to use for the containers.\n                                    The default is DefaultProcMount which uses the container runtime defaults for\n                                    readonly paths and masked paths.\n                                    This requires the ProcMountType feature flag to be enabled.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: string\n                                readOnlyRootFilesystem:\n                                  description: |-\n                                    Whether this container has a read-only root filesystem.\n                                    Default is false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                runAsGroup:\n                                  description: |-\n                                    The GID to run the entrypoint of the container process.\n                                    Uses runtime default if unset.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                runAsNonRoot:\n                                  description: |-\n                                    Indicates that the container must run as a non-root user.\n                                    If true, the Kubelet will validate the image at runtime to ensure that it\n                                    does not run as UID 0 (root) and fail to start the container if it does.\n                                    If unset or false, no such validation will be performed.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: boolean\n                                runAsUser:\n                                  description: |-\n                                    The UID to run the entrypoint of the container process.\n                                    Defaults to user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                seLinuxOptions:\n                                  description: |-\n                                    The SELinux context to be applied to the container.\n                                    If unspecified, the container runtime will allocate a random SELinux context for each\n                                    container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    level:\n                                      description: Level is SELinux level label that\n                                        applies to the container.\n                                      type: string\n                                    role:\n                                      description: Role is a SELinux role label that\n                                        applies to the container.\n                                      type: string\n                                    type:\n                                      description: Type is a SELinux type label that\n                                        applies to the container.\n                                      type: string\n                                    user:\n                                      description: User is a SELinux user label that\n                                        applies to the container.\n                                      type: string\n                                  type: object\n                                seccompProfile:\n                                  description: |-\n                                    The seccomp options to use by this container. If seccomp options are\n                                    provided at both the pod & container level, the container options\n                                    override the pod options.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    localhostProfile:\n                                      description: |-\n                                        localhostProfile indicates a profile defined in a file on the node should be used.\n                                        The profile must be preconfigured on the node to work.\n                                        Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                        Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                      type: string\n                                    type:\n                                      description: |-\n                                        type indicates which kind of seccomp profile will be applied.\n                                        Valid options are:\n\n\n                                        Localhost - a profile defined in a file on the node should be used.\n                                        RuntimeDefault - the container runtime default profile should be used.\n                                        Unconfined - no profile should be applied.\n                                      type: string\n                                  required:\n                                  - type\n                                  type: object\n                                windowsOptions:\n                                  description: |-\n                                    The Windows specific settings applied to all containers.\n                                    If unspecified, the options from the PodSecurityContext will be used.\n                                    If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is linux.\n                                  properties:\n                                    gmsaCredentialSpec:\n                                      description: |-\n                                        GMSACredentialSpec is where the GMSA admission webhook\n                                        (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                        GMSA credential spec named by the GMSACredentialSpecName field.\n                                      type: string\n                                    gmsaCredentialSpecName:\n                                      description: GMSACredentialSpecName is the name\n                                        of the GMSA credential spec to use.\n                                      type: string\n                                    hostProcess:\n                                      description: |-\n                                        HostProcess determines if a container should be run as a 'Host Process' container.\n                                        All of a Pod's containers must have the same effective HostProcess value\n                                        (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                        In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                      type: boolean\n                                    runAsUserName:\n                                      description: |-\n                                        The UserName in Windows to run the entrypoint of the container process.\n                                        Defaults to the user specified in image metadata if unspecified.\n                                        May also be set in PodSecurityContext. If set in both SecurityContext and\n                                        PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      type: string\n                                  type: object\n                              type: object\n                            startupProbe:\n                              description: Probes are not allowed for ephemeral containers.\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            stdin:\n                              description: |-\n                                Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                is not set, reads from stdin in the container will always result in EOF.\n                                Default is false.\n                              type: boolean\n                            stdinOnce:\n                              description: |-\n                                Whether the container runtime should close the stdin channel after it has been opened by\n                                a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                at which time stdin is closed and remains closed until the container is restarted. If this\n                                flag is false, a container processes that reads from stdin will never receive an EOF.\n                                Default is false\n                              type: boolean\n                            targetContainerName:\n                              description: |-\n                                If set, the name of the container from PodSpec that this ephemeral container targets.\n                                The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container.\n                                If not set then the ephemeral container uses the namespaces configured in the Pod spec.\n\n\n                                The container runtime must implement support for this feature. If the runtime does not\n                                support namespace targeting then the result of setting this field is undefined.\n                              type: string\n                            terminationMessagePath:\n                              description: |-\n                                Optional: Path at which the file to which the container's termination message\n                                will be written is mounted into the container's filesystem.\n                                Message written is intended to be brief final status, such as an assertion failure message.\n                                Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                all containers will be limited to 12kb.\n                                Defaults to /dev/termination-log.\n                                Cannot be updated.\n                              type: string\n                            terminationMessagePolicy:\n                              description: |-\n                                Indicate how the termination message should be populated. File will use the contents of\n                                terminationMessagePath to populate the container status message on both success and failure.\n                                FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                message file is empty and the container exited with an error.\n                                The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                Defaults to File.\n                                Cannot be updated.\n                              type: string\n                            tty:\n                              description: |-\n                                Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                Default is false.\n                              type: boolean\n                            volumeDevices:\n                              description: volumeDevices is the list of block devices\n                                to be used by the container.\n                              items:\n                                description: volumeDevice describes a mapping of a\n                                  raw block device within a container.\n                                properties:\n                                  devicePath:\n                                    description: devicePath is the path inside of\n                                      the container that the device will be mapped\n                                      to.\n                                    type: string\n                                  name:\n                                    description: name must match the name of a persistentVolumeClaim\n                                      in the pod\n                                    type: string\n                                required:\n                                - devicePath\n                                - name\n                                type: object\n                              type: array\n                            volumeMounts:\n                              description: |-\n                                Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers.\n                                Cannot be updated.\n                              items:\n                                description: VolumeMount describes a mounting of a\n                                  Volume within a container.\n                                properties:\n                                  mountPath:\n                                    description: |-\n                                      Path within the container at which the volume should be mounted.  Must\n                                      not contain ':'.\n                                    type: string\n                                  mountPropagation:\n                                    description: |-\n                                      mountPropagation determines how mounts are propagated from the host\n                                      to container and the other way around.\n                                      When not set, MountPropagationNone is used.\n                                      This field is beta in 1.10.\n                                    type: string\n                                  name:\n                                    description: This must match the Name of a Volume.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      Mounted read-only if true, read-write otherwise (false or unspecified).\n                                      Defaults to false.\n                                    type: boolean\n                                  subPath:\n                                    description: |-\n                                      Path within the volume from which the container's volume should be mounted.\n                                      Defaults to \"\" (volume's root).\n                                    type: string\n                                  subPathExpr:\n                                    description: |-\n                                      Expanded path within the volume from which the container's volume should be mounted.\n                                      Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                      Defaults to \"\" (volume's root).\n                                      SubPathExpr and SubPath are mutually exclusive.\n                                    type: string\n                                required:\n                                - mountPath\n                                - name\n                                type: object\n                              type: array\n                            workingDir:\n                              description: |-\n                                Container's working directory.\n                                If not specified, the container runtime's default will be used, which\n                                might be configured in the container image.\n                                Cannot be updated.\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        type: array\n                      hostAliases:\n                        description: |-\n                          HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts\n                          file if specified. This is only valid for non-hostNetwork pods.\n                        items:\n                          description: |-\n                            HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the\n                            pod's hosts file.\n                          properties:\n                            hostnames:\n                              description: Hostnames for the above IP address.\n                              items:\n                                type: string\n                              type: array\n                            ip:\n                              description: IP address of the host file entry.\n                              type: string\n                          type: object\n                        type: array\n                      hostIPC:\n                        description: |-\n                          Use the host's ipc namespace.\n                          Optional: Default to false.\n                        type: boolean\n                      hostNetwork:\n                        description: |-\n                          Host networking requested for this pod. Use the host's network namespace.\n                          If this option is set, the ports that will be used must be specified.\n                          Default to false.\n                        type: boolean\n                      hostPID:\n                        description: |-\n                          Use the host's pid namespace.\n                          Optional: Default to false.\n                        type: boolean\n                      hostUsers:\n                        description: |-\n                          Use the host's user namespace.\n                          Optional: Default to true.\n                          If set to true or not present, the pod will be run in the host user namespace, useful\n                          for when the pod needs a feature only available to the host user namespace, such as\n                          loading a kernel module with CAP_SYS_MODULE.\n                          When set to false, a new userns is created for the pod. Setting false is useful for\n                          mitigating container breakout vulnerabilities even allowing users to run their\n                          containers as root without actually having root privileges on the host.\n                          This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.\n                        type: boolean\n                      hostname:\n                        description: |-\n                          Specifies the hostname of the Pod\n                          If not specified, the pod's hostname will be set to a system-defined value.\n                        type: string\n                      imagePullSecrets:\n                        description: |-\n                          ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec.\n                          If specified, these secrets will be passed to individual puller implementations for them to use.\n                          More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod\n                        items:\n                          description: |-\n                            LocalObjectReference contains enough information to let you locate the\n                            referenced object inside the same namespace.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the referent.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                TODO: Add other useful fields. apiVersion, kind, uid?\n                              type: string\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        type: array\n                      initContainers:\n                        description: |-\n                          List of initialization containers belonging to the pod.\n                          Init containers are executed in order prior to containers being started. If any\n                          init container fails, the pod is considered to have failed and is handled according\n                          to its restartPolicy. The name for an init container or normal container must be\n                          unique among all containers.\n                          Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes.\n                          The resourceRequirements of an init container are taken into account during scheduling\n                          by finding the highest request/limit for each resource type, and then using the max of\n                          of that value or the sum of the normal containers. Limits are applied to init containers\n                          in a similar fashion.\n                          Init containers cannot currently be added or removed.\n                          Cannot be updated.\n                          More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n                        items:\n                          description: A single application container that you want\n                            to run within a pod.\n                          properties:\n                            args:\n                              description: |-\n                                Arguments to the entrypoint.\n                                The container image's CMD is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            command:\n                              description: |-\n                                Entrypoint array. Not executed within a shell.\n                                The container image's ENTRYPOINT is used if this is not provided.\n                                Variable references $(VAR_NAME) are expanded using the container's environment. If a variable\n                                cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced\n                                to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will\n                                produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless\n                                of whether the variable exists or not. Cannot be updated.\n                                More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell\n                              items:\n                                type: string\n                              type: array\n                            env:\n                              description: |-\n                                List of environment variables to set in the container.\n                                Cannot be updated.\n                              items:\n                                description: EnvVar represents an environment variable\n                                  present in a Container.\n                                properties:\n                                  name:\n                                    description: Name of the environment variable.\n                                      Must be a C_IDENTIFIER.\n                                    type: string\n                                  value:\n                                    description: |-\n                                      Variable references $(VAR_NAME) are expanded\n                                      using the previously defined environment variables in the container and\n                                      any service environment variables. If a variable cannot be resolved,\n                                      the reference in the input string will be unchanged. Double $$ are reduced\n                                      to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n                                      \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\n                                      Escaped references will never be expanded, regardless of whether the variable\n                                      exists or not.\n                                      Defaults to \"\".\n                                    type: string\n                                  valueFrom:\n                                    description: Source for the environment variable's\n                                      value. Cannot be used if value is not empty.\n                                    properties:\n                                      configMapKeyRef:\n                                        description: Selects a key of a ConfigMap.\n                                        properties:\n                                          key:\n                                            description: The key to select.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the ConfigMap\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      fieldRef:\n                                        description: |-\n                                          Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\n                                          spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      secretKeyRef:\n                                        description: Selects a key of a secret in\n                                          the pod's namespace\n                                        properties:\n                                          key:\n                                            description: The key of the secret to\n                                              select from.  Must be a valid secret\n                                              key.\n                                            type: string\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: Specify whether the Secret\n                                              or its key must be defined\n                                            type: boolean\n                                        required:\n                                        - key\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    type: object\n                                required:\n                                - name\n                                type: object\n                              type: array\n                            envFrom:\n                              description: |-\n                                List of sources to populate environment variables in the container.\n                                The keys defined within a source must be a C_IDENTIFIER. All invalid keys\n                                will be reported as an event when the container is starting. When a key exists in multiple\n                                sources, the value associated with the last source will take precedence.\n                                Values defined by an Env with a duplicate key will take precedence.\n                                Cannot be updated.\n                              items:\n                                description: EnvFromSource represents the source of\n                                  a set of ConfigMaps\n                                properties:\n                                  configMapRef:\n                                    description: The ConfigMap to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the ConfigMap\n                                          must be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                  prefix:\n                                    description: An optional identifier to prepend\n                                      to each key in the ConfigMap. Must be a C_IDENTIFIER.\n                                    type: string\n                                  secretRef:\n                                    description: The Secret to select from\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name of the referent.\n                                          More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                          TODO: Add other useful fields. apiVersion, kind, uid?\n                                        type: string\n                                      optional:\n                                        description: Specify whether the Secret must\n                                          be defined\n                                        type: boolean\n                                    type: object\n                                    x-kubernetes-map-type: atomic\n                                type: object\n                              type: array\n                            image:\n                              description: |-\n                                Container image name.\n                                More info: https://kubernetes.io/docs/concepts/containers/images\n                                This field is optional to allow higher level config management to default or override\n                                container images in workload controllers like Deployments and StatefulSets.\n                              type: string\n                            imagePullPolicy:\n                              description: |-\n                                Image pull policy.\n                                One of Always, Never, IfNotPresent.\n                                Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/containers/images#updating-images\n                              type: string\n                            lifecycle:\n                              description: |-\n                                Actions that the management system should take in response to container lifecycle events.\n                                Cannot be updated.\n                              properties:\n                                postStart:\n                                  description: |-\n                                    PostStart is called immediately after a container is created. If the handler fails,\n                                    the container is terminated and restarted according to its restart policy.\n                                    Other management of the container blocks until the hook completes.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                                preStop:\n                                  description: |-\n                                    PreStop is called immediately before a container is terminated due to an\n                                    API request or management event such as liveness/startup probe failure,\n                                    preemption, resource contention, etc. The handler is not called if the\n                                    container crashes or exits. The Pod's termination grace period countdown begins before the\n                                    PreStop hook is executed. Regardless of the outcome of the handler, the\n                                    container will eventually terminate within the Pod's termination grace\n                                    period (unless delayed by finalizers). Other management of the container blocks until the hook completes\n                                    or until the termination grace period is reached.\n                                    More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks\n                                  properties:\n                                    exec:\n                                      description: Exec specifies the action to take.\n                                      properties:\n                                        command:\n                                          description: |-\n                                            Command is the command line to execute inside the container, the working directory for the\n                                            command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                            not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                            a shell, you need to explicitly call out to that shell.\n                                            Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                          items:\n                                            type: string\n                                          type: array\n                                      type: object\n                                    httpGet:\n                                      description: HTTPGet specifies the http request\n                                        to perform.\n                                      properties:\n                                        host:\n                                          description: |-\n                                            Host name to connect to, defaults to the pod IP. You probably want to set\n                                            \"Host\" in httpHeaders instead.\n                                          type: string\n                                        httpHeaders:\n                                          description: Custom headers to set in the\n                                            request. HTTP allows repeated headers.\n                                          items:\n                                            description: HTTPHeader describes a custom\n                                              header to be used in HTTP probes\n                                            properties:\n                                              name:\n                                                description: |-\n                                                  The header field name.\n                                                  This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                                type: string\n                                              value:\n                                                description: The header field value\n                                                type: string\n                                            required:\n                                            - name\n                                            - value\n                                            type: object\n                                          type: array\n                                        path:\n                                          description: Path to access on the HTTP\n                                            server.\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Name or number of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                        scheme:\n                                          description: |-\n                                            Scheme to use for connecting to the host.\n                                            Defaults to HTTP.\n                                          type: string\n                                      required:\n                                      - port\n                                      type: object\n                                    sleep:\n                                      description: Sleep represents the duration that\n                                        the container should sleep before being terminated.\n                                      properties:\n                                        seconds:\n                                          description: Seconds is the number of seconds\n                                            to sleep.\n                                          format: int64\n                                          type: integer\n                                      required:\n                                      - seconds\n                                      type: object\n                                    tcpSocket:\n                                      description: |-\n                                        Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\n                                        for the backward compatibility. There are no validation of this field and\n                                        lifecycle hooks will fail in runtime when tcp handler is specified.\n                                      properties:\n                                        host:\n                                          description: 'Optional: Host name to connect\n                                            to, defaults to the pod IP.'\n                                          type: string\n                                        port:\n                                          anyOf:\n                                          - type: integer\n                                          - type: string\n                                          description: |-\n                                            Number or name of the port to access on the container.\n                                            Number must be in the range 1 to 65535.\n                                            Name must be an IANA_SVC_NAME.\n                                          x-kubernetes-int-or-string: true\n                                      required:\n                                      - port\n                                      type: object\n                                  type: object\n                              type: object\n                            livenessProbe:\n                              description: |-\n                                Periodic probe of container liveness.\n                                Container will be restarted if the probe fails.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            name:\n                              description: |-\n                                Name of the container specified as a DNS_LABEL.\n                                Each container in a pod must have a unique name (DNS_LABEL).\n                                Cannot be updated.\n                              type: string\n                            ports:\n                              description: |-\n                                List of ports to expose from the container. Not specifying a port here\n                                DOES NOT prevent that port from being exposed. Any port which is\n                                listening on the default \"0.0.0.0\" address inside a container will be\n                                accessible from the network.\n                                Modifying this array with strategic merge patch may corrupt the data.\n                                For more information See https://github.com/kubernetes/kubernetes/issues/108255.\n                                Cannot be updated.\n                              items:\n                                description: ContainerPort represents a network port\n                                  in a single container.\n                                properties:\n                                  containerPort:\n                                    description: |-\n                                      Number of port to expose on the pod's IP address.\n                                      This must be a valid port number, 0 < x < 65536.\n                                    format: int32\n                                    type: integer\n                                  hostIP:\n                                    description: What host IP to bind the external\n                                      port to.\n                                    type: string\n                                  hostPort:\n                                    description: |-\n                                      Number of port to expose on the host.\n                                      If specified, this must be a valid port number, 0 < x < 65536.\n                                      If HostNetwork is specified, this must match ContainerPort.\n                                      Most containers do not need this.\n                                    format: int32\n                                    type: integer\n                                  name:\n                                    description: |-\n                                      If specified, this must be an IANA_SVC_NAME and unique within the pod. Each\n                                      named port in a pod must have a unique name. Name for the port that can be\n                                      referred to by services.\n                                    type: string\n                                  protocol:\n                                    default: TCP\n                                    description: |-\n                                      Protocol for port. Must be UDP, TCP, or SCTP.\n                                      Defaults to \"TCP\".\n                                    type: string\n                                required:\n                                - containerPort\n                                type: object\n                              type: array\n                              x-kubernetes-list-map-keys:\n                              - containerPort\n                              - protocol\n                              x-kubernetes-list-type: map\n                            readinessProbe:\n                              description: |-\n                                Periodic probe of container service readiness.\n                                Container will be removed from service endpoints if the probe fails.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            resizePolicy:\n                              description: Resources resize policy for the container.\n                              items:\n                                description: ContainerResizePolicy represents resource\n                                  resize policy for the container.\n                                properties:\n                                  resourceName:\n                                    description: |-\n                                      Name of the resource to which this resource resize policy applies.\n                                      Supported values: cpu, memory.\n                                    type: string\n                                  restartPolicy:\n                                    description: |-\n                                      Restart policy to apply when specified resource is resized.\n                                      If not specified, it defaults to NotRequired.\n                                    type: string\n                                required:\n                                - resourceName\n                                - restartPolicy\n                                type: object\n                              type: array\n                              x-kubernetes-list-type: atomic\n                            resources:\n                              description: |-\n                                Compute Resources required by this container.\n                                Cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              properties:\n                                claims:\n                                  description: |-\n                                    Claims lists the names of resources, defined in spec.resourceClaims,\n                                    that are used by this container.\n\n\n                                    This is an alpha field and requires enabling the\n                                    DynamicResourceAllocation feature gate.\n\n\n                                    This field is immutable. It can only be set for containers.\n                                  items:\n                                    description: ResourceClaim references one entry\n                                      in PodSpec.ResourceClaims.\n                                    properties:\n                                      name:\n                                        description: |-\n                                          Name must match the name of one entry in pod.spec.resourceClaims of\n                                          the Pod where this field is used. It makes that resource available\n                                          inside a container.\n                                        type: string\n                                    required:\n                                    - name\n                                    type: object\n                                  type: array\n                                  x-kubernetes-list-map-keys:\n                                  - name\n                                  x-kubernetes-list-type: map\n                                limits:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Limits describes the maximum amount of compute resources allowed.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                                requests:\n                                  additionalProperties:\n                                    anyOf:\n                                    - type: integer\n                                    - type: string\n                                    pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                    x-kubernetes-int-or-string: true\n                                  description: |-\n                                    Requests describes the minimum amount of compute resources required.\n                                    If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                    otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                    More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                  type: object\n                              type: object\n                            restartPolicy:\n                              description: |-\n                                RestartPolicy defines the restart behavior of individual containers in a pod.\n                                This field may only be set for init containers, and the only allowed value is \"Always\".\n                                For non-init containers or when this field is not specified,\n                                the restart behavior is defined by the Pod's restart policy and the container type.\n                                Setting the RestartPolicy as \"Always\" for the init container will have the following effect:\n                                this init container will be continually restarted on\n                                exit until all regular containers have terminated. Once all regular\n                                containers have completed, all init containers with restartPolicy \"Always\"\n                                will be shut down. This lifecycle differs from normal init containers and\n                                is often referred to as a \"sidecar\" container. Although this init\n                                container still starts in the init container sequence, it does not wait\n                                for the container to complete before proceeding to the next init\n                                container. Instead, the next init container starts immediately after this\n                                init container is started, or after any startupProbe has successfully\n                                completed.\n                              type: string\n                            securityContext:\n                              description: |-\n                                SecurityContext defines the security options the container should be run with.\n                                If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext.\n                                More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n                              properties:\n                                allowPrivilegeEscalation:\n                                  description: |-\n                                    AllowPrivilegeEscalation controls whether a process can gain more\n                                    privileges than its parent process. This bool directly controls if\n                                    the no_new_privs flag will be set on the container process.\n                                    AllowPrivilegeEscalation is true always when the container is:\n                                    1) run as Privileged\n                                    2) has CAP_SYS_ADMIN\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                capabilities:\n                                  description: |-\n                                    The capabilities to add/drop when running containers.\n                                    Defaults to the default set of capabilities granted by the container runtime.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    add:\n                                      description: Added capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                    drop:\n                                      description: Removed capabilities\n                                      items:\n                                        description: Capability represent POSIX capabilities\n                                          type\n                                        type: string\n                                      type: array\n                                  type: object\n                                privileged:\n                                  description: |-\n                                    Run container in privileged mode.\n                                    Processes in privileged containers are essentially equivalent to root on the host.\n                                    Defaults to false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                procMount:\n                                  description: |-\n                                    procMount denotes the type of proc mount to use for the containers.\n                                    The default is DefaultProcMount which uses the container runtime defaults for\n                                    readonly paths and masked paths.\n                                    This requires the ProcMountType feature flag to be enabled.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: string\n                                readOnlyRootFilesystem:\n                                  description: |-\n                                    Whether this container has a read-only root filesystem.\n                                    Default is false.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  type: boolean\n                                runAsGroup:\n                                  description: |-\n                                    The GID to run the entrypoint of the container process.\n                                    Uses runtime default if unset.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                runAsNonRoot:\n                                  description: |-\n                                    Indicates that the container must run as a non-root user.\n                                    If true, the Kubelet will validate the image at runtime to ensure that it\n                                    does not run as UID 0 (root) and fail to start the container if it does.\n                                    If unset or false, no such validation will be performed.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                  type: boolean\n                                runAsUser:\n                                  description: |-\n                                    The UID to run the entrypoint of the container process.\n                                    Defaults to user specified in image metadata if unspecified.\n                                    May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  format: int64\n                                  type: integer\n                                seLinuxOptions:\n                                  description: |-\n                                    The SELinux context to be applied to the container.\n                                    If unspecified, the container runtime will allocate a random SELinux context for each\n                                    container.  May also be set in PodSecurityContext.  If set in both SecurityContext and\n                                    PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    level:\n                                      description: Level is SELinux level label that\n                                        applies to the container.\n                                      type: string\n                                    role:\n                                      description: Role is a SELinux role label that\n                                        applies to the container.\n                                      type: string\n                                    type:\n                                      description: Type is a SELinux type label that\n                                        applies to the container.\n                                      type: string\n                                    user:\n                                      description: User is a SELinux user label that\n                                        applies to the container.\n                                      type: string\n                                  type: object\n                                seccompProfile:\n                                  description: |-\n                                    The seccomp options to use by this container. If seccomp options are\n                                    provided at both the pod & container level, the container options\n                                    override the pod options.\n                                    Note that this field cannot be set when spec.os.name is windows.\n                                  properties:\n                                    localhostProfile:\n                                      description: |-\n                                        localhostProfile indicates a profile defined in a file on the node should be used.\n                                        The profile must be preconfigured on the node to work.\n                                        Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                        Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                      type: string\n                                    type:\n                                      description: |-\n                                        type indicates which kind of seccomp profile will be applied.\n                                        Valid options are:\n\n\n                                        Localhost - a profile defined in a file on the node should be used.\n                                        RuntimeDefault - the container runtime default profile should be used.\n                                        Unconfined - no profile should be applied.\n                                      type: string\n                                  required:\n                                  - type\n                                  type: object\n                                windowsOptions:\n                                  description: |-\n                                    The Windows specific settings applied to all containers.\n                                    If unspecified, the options from the PodSecurityContext will be used.\n                                    If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                    Note that this field cannot be set when spec.os.name is linux.\n                                  properties:\n                                    gmsaCredentialSpec:\n                                      description: |-\n                                        GMSACredentialSpec is where the GMSA admission webhook\n                                        (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                        GMSA credential spec named by the GMSACredentialSpecName field.\n                                      type: string\n                                    gmsaCredentialSpecName:\n                                      description: GMSACredentialSpecName is the name\n                                        of the GMSA credential spec to use.\n                                      type: string\n                                    hostProcess:\n                                      description: |-\n                                        HostProcess determines if a container should be run as a 'Host Process' container.\n                                        All of a Pod's containers must have the same effective HostProcess value\n                                        (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                        In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                      type: boolean\n                                    runAsUserName:\n                                      description: |-\n                                        The UserName in Windows to run the entrypoint of the container process.\n                                        Defaults to the user specified in image metadata if unspecified.\n                                        May also be set in PodSecurityContext. If set in both SecurityContext and\n                                        PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                      type: string\n                                  type: object\n                              type: object\n                            startupProbe:\n                              description: |-\n                                StartupProbe indicates that the Pod has successfully initialized.\n                                If specified, no other probes are executed until this completes successfully.\n                                If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.\n                                This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,\n                                when it might take a long time to load data or warm a cache, than during steady-state operation.\n                                This cannot be updated.\n                                More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                              properties:\n                                exec:\n                                  description: Exec specifies the action to take.\n                                  properties:\n                                    command:\n                                      description: |-\n                                        Command is the command line to execute inside the container, the working directory for the\n                                        command  is root ('/') in the container's filesystem. The command is simply exec'd, it is\n                                        not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use\n                                        a shell, you need to explicitly call out to that shell.\n                                        Exit status of 0 is treated as live/healthy and non-zero is unhealthy.\n                                      items:\n                                        type: string\n                                      type: array\n                                  type: object\n                                failureThreshold:\n                                  description: |-\n                                    Minimum consecutive failures for the probe to be considered failed after having succeeded.\n                                    Defaults to 3. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                grpc:\n                                  description: GRPC specifies an action involving\n                                    a GRPC port.\n                                  properties:\n                                    port:\n                                      description: Port number of the gRPC service.\n                                        Number must be in the range 1 to 65535.\n                                      format: int32\n                                      type: integer\n                                    service:\n                                      description: |-\n                                        Service is the name of the service to place in the gRPC HealthCheckRequest\n                                        (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).\n\n\n                                        If this is not specified, the default behavior is defined by gRPC.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                httpGet:\n                                  description: HTTPGet specifies the http request\n                                    to perform.\n                                  properties:\n                                    host:\n                                      description: |-\n                                        Host name to connect to, defaults to the pod IP. You probably want to set\n                                        \"Host\" in httpHeaders instead.\n                                      type: string\n                                    httpHeaders:\n                                      description: Custom headers to set in the request.\n                                        HTTP allows repeated headers.\n                                      items:\n                                        description: HTTPHeader describes a custom\n                                          header to be used in HTTP probes\n                                        properties:\n                                          name:\n                                            description: |-\n                                              The header field name.\n                                              This will be canonicalized upon output, so case-variant names will be understood as the same header.\n                                            type: string\n                                          value:\n                                            description: The header field value\n                                            type: string\n                                        required:\n                                        - name\n                                        - value\n                                        type: object\n                                      type: array\n                                    path:\n                                      description: Path to access on the HTTP server.\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Name or number of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                    scheme:\n                                      description: |-\n                                        Scheme to use for connecting to the host.\n                                        Defaults to HTTP.\n                                      type: string\n                                  required:\n                                  - port\n                                  type: object\n                                initialDelaySeconds:\n                                  description: |-\n                                    Number of seconds after the container has started before liveness probes are initiated.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                                periodSeconds:\n                                  description: |-\n                                    How often (in seconds) to perform the probe.\n                                    Default to 10 seconds. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                successThreshold:\n                                  description: |-\n                                    Minimum consecutive successes for the probe to be considered successful after having failed.\n                                    Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.\n                                  format: int32\n                                  type: integer\n                                tcpSocket:\n                                  description: TCPSocket specifies an action involving\n                                    a TCP port.\n                                  properties:\n                                    host:\n                                      description: 'Optional: Host name to connect\n                                        to, defaults to the pod IP.'\n                                      type: string\n                                    port:\n                                      anyOf:\n                                      - type: integer\n                                      - type: string\n                                      description: |-\n                                        Number or name of the port to access on the container.\n                                        Number must be in the range 1 to 65535.\n                                        Name must be an IANA_SVC_NAME.\n                                      x-kubernetes-int-or-string: true\n                                  required:\n                                  - port\n                                  type: object\n                                terminationGracePeriodSeconds:\n                                  description: |-\n                                    Optional duration in seconds the pod needs to terminate gracefully upon probe failure.\n                                    The grace period is the duration in seconds after the processes running in the pod are sent\n                                    a termination signal and the time when the processes are forcibly halted with a kill signal.\n                                    Set this value longer than the expected cleanup time for your process.\n                                    If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this\n                                    value overrides the value provided by the pod spec.\n                                    Value must be non-negative integer. The value zero indicates stop immediately via\n                                    the kill signal (no opportunity to shut down).\n                                    This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.\n                                    Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.\n                                  format: int64\n                                  type: integer\n                                timeoutSeconds:\n                                  description: |-\n                                    Number of seconds after which the probe times out.\n                                    Defaults to 1 second. Minimum value is 1.\n                                    More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes\n                                  format: int32\n                                  type: integer\n                              type: object\n                            stdin:\n                              description: |-\n                                Whether this container should allocate a buffer for stdin in the container runtime. If this\n                                is not set, reads from stdin in the container will always result in EOF.\n                                Default is false.\n                              type: boolean\n                            stdinOnce:\n                              description: |-\n                                Whether the container runtime should close the stdin channel after it has been opened by\n                                a single attach. When stdin is true the stdin stream will remain open across multiple attach\n                                sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the\n                                first client attaches to stdin, and then remains open and accepts data until the client disconnects,\n                                at which time stdin is closed and remains closed until the container is restarted. If this\n                                flag is false, a container processes that reads from stdin will never receive an EOF.\n                                Default is false\n                              type: boolean\n                            terminationMessagePath:\n                              description: |-\n                                Optional: Path at which the file to which the container's termination message\n                                will be written is mounted into the container's filesystem.\n                                Message written is intended to be brief final status, such as an assertion failure message.\n                                Will be truncated by the node if greater than 4096 bytes. The total message length across\n                                all containers will be limited to 12kb.\n                                Defaults to /dev/termination-log.\n                                Cannot be updated.\n                              type: string\n                            terminationMessagePolicy:\n                              description: |-\n                                Indicate how the termination message should be populated. File will use the contents of\n                                terminationMessagePath to populate the container status message on both success and failure.\n                                FallbackToLogsOnError will use the last chunk of container log output if the termination\n                                message file is empty and the container exited with an error.\n                                The log output is limited to 2048 bytes or 80 lines, whichever is smaller.\n                                Defaults to File.\n                                Cannot be updated.\n                              type: string\n                            tty:\n                              description: |-\n                                Whether this container should allocate a TTY for itself, also requires 'stdin' to be true.\n                                Default is false.\n                              type: boolean\n                            volumeDevices:\n                              description: volumeDevices is the list of block devices\n                                to be used by the container.\n                              items:\n                                description: volumeDevice describes a mapping of a\n                                  raw block device within a container.\n                                properties:\n                                  devicePath:\n                                    description: devicePath is the path inside of\n                                      the container that the device will be mapped\n                                      to.\n                                    type: string\n                                  name:\n                                    description: name must match the name of a persistentVolumeClaim\n                                      in the pod\n                                    type: string\n                                required:\n                                - devicePath\n                                - name\n                                type: object\n                              type: array\n                            volumeMounts:\n                              description: |-\n                                Pod volumes to mount into the container's filesystem.\n                                Cannot be updated.\n                              items:\n                                description: VolumeMount describes a mounting of a\n                                  Volume within a container.\n                                properties:\n                                  mountPath:\n                                    description: |-\n                                      Path within the container at which the volume should be mounted.  Must\n                                      not contain ':'.\n                                    type: string\n                                  mountPropagation:\n                                    description: |-\n                                      mountPropagation determines how mounts are propagated from the host\n                                      to container and the other way around.\n                                      When not set, MountPropagationNone is used.\n                                      This field is beta in 1.10.\n                                    type: string\n                                  name:\n                                    description: This must match the Name of a Volume.\n                                    type: string\n                                  readOnly:\n                                    description: |-\n                                      Mounted read-only if true, read-write otherwise (false or unspecified).\n                                      Defaults to false.\n                                    type: boolean\n                                  subPath:\n                                    description: |-\n                                      Path within the volume from which the container's volume should be mounted.\n                                      Defaults to \"\" (volume's root).\n                                    type: string\n                                  subPathExpr:\n                                    description: |-\n                                      Expanded path within the volume from which the container's volume should be mounted.\n                                      Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment.\n                                      Defaults to \"\" (volume's root).\n                                      SubPathExpr and SubPath are mutually exclusive.\n                                    type: string\n                                required:\n                                - mountPath\n                                - name\n                                type: object\n                              type: array\n                            workingDir:\n                              description: |-\n                                Container's working directory.\n                                If not specified, the container runtime's default will be used, which\n                                might be configured in the container image.\n                                Cannot be updated.\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        type: array\n                      nodeName:\n                        description: |-\n                          NodeName is a request to schedule this pod onto a specific node. If it is non-empty,\n                          the scheduler simply schedules this pod onto that node, assuming that it fits resource\n                          requirements.\n                        type: string\n                      nodeSelector:\n                        additionalProperties:\n                          type: string\n                        description: |-\n                          NodeSelector is a selector which must be true for the pod to fit on a node.\n                          Selector which must match a node's labels for the pod to be scheduled on that node.\n                          More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/\n                        type: object\n                        x-kubernetes-map-type: atomic\n                      os:\n                        description: |-\n                          Specifies the OS of the containers in the pod.\n                          Some pod and container fields are restricted if this is set.\n\n\n                          If the OS field is set to linux, the following fields must be unset:\n                          -securityContext.windowsOptions\n\n\n                          If the OS field is set to windows, following fields must be unset:\n                          - spec.hostPID\n                          - spec.hostIPC\n                          - spec.hostUsers\n                          - spec.securityContext.seLinuxOptions\n                          - spec.securityContext.seccompProfile\n                          - spec.securityContext.fsGroup\n                          - spec.securityContext.fsGroupChangePolicy\n                          - spec.securityContext.sysctls\n                          - spec.shareProcessNamespace\n                          - spec.securityContext.runAsUser\n                          - spec.securityContext.runAsGroup\n                          - spec.securityContext.supplementalGroups\n                          - spec.containers[*].securityContext.seLinuxOptions\n                          - spec.containers[*].securityContext.seccompProfile\n                          - spec.containers[*].securityContext.capabilities\n                          - spec.containers[*].securityContext.readOnlyRootFilesystem\n                          - spec.containers[*].securityContext.privileged\n                          - spec.containers[*].securityContext.allowPrivilegeEscalation\n                          - spec.containers[*].securityContext.procMount\n                          - spec.containers[*].securityContext.runAsUser\n                          - spec.containers[*].securityContext.runAsGroup\n                        properties:\n                          name:\n                            description: |-\n                              Name is the name of the operating system. The currently supported values are linux and windows.\n                              Additional value may be defined in future and can be one of:\n                              https://github.com/opencontainers/runtime-spec/blob/master/config.md#platform-specific-configuration\n                              Clients should expect to handle additional values and treat unrecognized values in this field as os: null\n                            type: string\n                        required:\n                        - name\n                        type: object\n                      overhead:\n                        additionalProperties:\n                          anyOf:\n                          - type: integer\n                          - type: string\n                          pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                          x-kubernetes-int-or-string: true\n                        description: |-\n                          Overhead represents the resource overhead associated with running a pod for a given RuntimeClass.\n                          This field will be autopopulated at admission time by the RuntimeClass admission controller. If\n                          the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests.\n                          The RuntimeClass admission controller will reject Pod create requests which have the overhead already\n                          set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value\n                          defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero.\n                          More info: https://git.k8s.io/enhancements/keps/sig-node/688-pod-overhead/README.md\n                        type: object\n                      preemptionPolicy:\n                        description: |-\n                          PreemptionPolicy is the Policy for preempting pods with lower priority.\n                          One of Never, PreemptLowerPriority.\n                          Defaults to PreemptLowerPriority if unset.\n                        type: string\n                      priority:\n                        description: |-\n                          The priority value. Various system components use this field to find the\n                          priority of the pod. When Priority Admission Controller is enabled, it\n                          prevents users from setting this field. The admission controller populates\n                          this field from PriorityClassName.\n                          The higher the value, the higher the priority.\n                        format: int32\n                        type: integer\n                      priorityClassName:\n                        description: |-\n                          If specified, indicates the pod's priority. \"system-node-critical\" and\n                          \"system-cluster-critical\" are two special keywords which indicate the\n                          highest priorities with the former being the highest priority. Any other\n                          name must be defined by creating a PriorityClass object with that name.\n                          If not specified, the pod priority will be default or zero if there is no\n                          default.\n                        type: string\n                      readinessGates:\n                        description: |-\n                          If specified, all readiness gates will be evaluated for pod readiness.\n                          A pod is ready when all its containers are ready AND\n                          all conditions specified in the readiness gates have status equal to \"True\"\n                          More info: https://git.k8s.io/enhancements/keps/sig-network/580-pod-readiness-gates\n                        items:\n                          description: PodReadinessGate contains the reference to\n                            a pod condition\n                          properties:\n                            conditionType:\n                              description: ConditionType refers to a condition in\n                                the pod's condition list with matching type.\n                              type: string\n                          required:\n                          - conditionType\n                          type: object\n                        type: array\n                      resourceClaims:\n                        description: |-\n                          ResourceClaims defines which ResourceClaims must be allocated\n                          and reserved before the Pod is allowed to start. The resources\n                          will be made available to those containers which consume them\n                          by name.\n\n\n                          This is an alpha field and requires enabling the\n                          DynamicResourceAllocation feature gate.\n\n\n                          This field is immutable.\n                        items:\n                          description: |-\n                            PodResourceClaim references exactly one ResourceClaim through a ClaimSource.\n                            It adds a name to it that uniquely identifies the ResourceClaim inside the Pod.\n                            Containers that need access to the ResourceClaim reference it with this name.\n                          properties:\n                            name:\n                              description: |-\n                                Name uniquely identifies this resource claim inside the pod.\n                                This must be a DNS_LABEL.\n                              type: string\n                            source:\n                              description: Source describes where to find the ResourceClaim.\n                              properties:\n                                resourceClaimName:\n                                  description: |-\n                                    ResourceClaimName is the name of a ResourceClaim object in the same\n                                    namespace as this pod.\n                                  type: string\n                                resourceClaimTemplateName:\n                                  description: |-\n                                    ResourceClaimTemplateName is the name of a ResourceClaimTemplate\n                                    object in the same namespace as this pod.\n\n\n                                    The template will be used to create a new ResourceClaim, which will\n                                    be bound to this pod. When this pod is deleted, the ResourceClaim\n                                    will also be deleted. The pod name and resource name, along with a\n                                    generated component, will be used to form a unique name for the\n                                    ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses.\n\n\n                                    This field is immutable and no changes will be made to the\n                                    corresponding ResourceClaim by the control plane after creating the\n                                    ResourceClaim.\n                                  type: string\n                              type: object\n                          required:\n                          - name\n                          type: object\n                        type: array\n                        x-kubernetes-list-map-keys:\n                        - name\n                        x-kubernetes-list-type: map\n                      restartPolicy:\n                        description: |-\n                          Restart policy for all containers within the pod.\n                          One of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted.\n                          Default to Always.\n                          More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy\n                        type: string\n                      runtimeClassName:\n                        description: |-\n                          RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used\n                          to run this pod.  If no RuntimeClass resource matches the named class, the pod will not be run.\n                          If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an\n                          empty definition that uses the default runtime handler.\n                          More info: https://git.k8s.io/enhancements/keps/sig-node/585-runtime-class\n                        type: string\n                      schedulerName:\n                        description: |-\n                          If specified, the pod will be dispatched by specified scheduler.\n                          If not specified, the pod will be dispatched by default scheduler.\n                        type: string\n                      schedulingGates:\n                        description: |-\n                          SchedulingGates is an opaque list of values that if specified will block scheduling the pod.\n                          If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the\n                          scheduler will not attempt to schedule the pod.\n\n\n                          SchedulingGates can only be set at pod creation time, and be removed only afterwards.\n\n\n                          This is a beta feature enabled by the PodSchedulingReadiness feature gate.\n                        items:\n                          description: PodSchedulingGate is associated to a Pod to\n                            guard its scheduling.\n                          properties:\n                            name:\n                              description: |-\n                                Name of the scheduling gate.\n                                Each scheduling gate must have a unique name field.\n                              type: string\n                          required:\n                          - name\n                          type: object\n                        type: array\n                        x-kubernetes-list-map-keys:\n                        - name\n                        x-kubernetes-list-type: map\n                      securityContext:\n                        description: |-\n                          SecurityContext holds pod-level security attributes and common container settings.\n                          Optional: Defaults to empty.  See type description for default values of each field.\n                        properties:\n                          fsGroup:\n                            description: |-\n                              A special supplemental group that applies to all containers in a pod.\n                              Some volume types allow the Kubelet to change the ownership of that volume\n                              to be owned by the pod:\n\n\n                              1. The owning GID will be the FSGroup\n                              2. The setgid bit is set (new files created in the volume will be owned by FSGroup)\n                              3. The permission bits are OR'd with rw-rw----\n\n\n                              If unset, the Kubelet will not modify the ownership and permissions of any volume.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            format: int64\n                            type: integer\n                          fsGroupChangePolicy:\n                            description: |-\n                              fsGroupChangePolicy defines behavior of changing ownership and permission of the volume\n                              before being exposed inside Pod. This field will only apply to\n                              volume types which support fsGroup based ownership(and permissions).\n                              It will have no effect on ephemeral volume types such as: secret, configmaps\n                              and emptydir.\n                              Valid values are \"OnRootMismatch\" and \"Always\". If not specified, \"Always\" is used.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            type: string\n                          runAsGroup:\n                            description: |-\n                              The GID to run the entrypoint of the container process.\n                              Uses runtime default if unset.\n                              May also be set in SecurityContext.  If set in both SecurityContext and\n                              PodSecurityContext, the value specified in SecurityContext takes precedence\n                              for that container.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            format: int64\n                            type: integer\n                          runAsNonRoot:\n                            description: |-\n                              Indicates that the container must run as a non-root user.\n                              If true, the Kubelet will validate the image at runtime to ensure that it\n                              does not run as UID 0 (root) and fail to start the container if it does.\n                              If unset or false, no such validation will be performed.\n                              May also be set in SecurityContext.  If set in both SecurityContext and\n                              PodSecurityContext, the value specified in SecurityContext takes precedence.\n                            type: boolean\n                          runAsUser:\n                            description: |-\n                              The UID to run the entrypoint of the container process.\n                              Defaults to user specified in image metadata if unspecified.\n                              May also be set in SecurityContext.  If set in both SecurityContext and\n                              PodSecurityContext, the value specified in SecurityContext takes precedence\n                              for that container.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            format: int64\n                            type: integer\n                          seLinuxOptions:\n                            description: |-\n                              The SELinux context to be applied to all containers.\n                              If unspecified, the container runtime will allocate a random SELinux context for each\n                              container.  May also be set in SecurityContext.  If set in\n                              both SecurityContext and PodSecurityContext, the value specified in SecurityContext\n                              takes precedence for that container.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            properties:\n                              level:\n                                description: Level is SELinux level label that applies\n                                  to the container.\n                                type: string\n                              role:\n                                description: Role is a SELinux role label that applies\n                                  to the container.\n                                type: string\n                              type:\n                                description: Type is a SELinux type label that applies\n                                  to the container.\n                                type: string\n                              user:\n                                description: User is a SELinux user label that applies\n                                  to the container.\n                                type: string\n                            type: object\n                          seccompProfile:\n                            description: |-\n                              The seccomp options to use by the containers in this pod.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            properties:\n                              localhostProfile:\n                                description: |-\n                                  localhostProfile indicates a profile defined in a file on the node should be used.\n                                  The profile must be preconfigured on the node to work.\n                                  Must be a descending path, relative to the kubelet's configured seccomp profile location.\n                                  Must be set if type is \"Localhost\". Must NOT be set for any other type.\n                                type: string\n                              type:\n                                description: |-\n                                  type indicates which kind of seccomp profile will be applied.\n                                  Valid options are:\n\n\n                                  Localhost - a profile defined in a file on the node should be used.\n                                  RuntimeDefault - the container runtime default profile should be used.\n                                  Unconfined - no profile should be applied.\n                                type: string\n                            required:\n                            - type\n                            type: object\n                          supplementalGroups:\n                            description: |-\n                              A list of groups applied to the first process run in each container, in addition\n                              to the container's primary GID, the fsGroup (if specified), and group memberships\n                              defined in the container image for the uid of the container process. If unspecified,\n                              no additional groups are added to any container. Note that group memberships\n                              defined in the container image for the uid of the container process are still effective,\n                              even if they are not included in this list.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            items:\n                              format: int64\n                              type: integer\n                            type: array\n                          sysctls:\n                            description: |-\n                              Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported\n                              sysctls (by the container runtime) might fail to launch.\n                              Note that this field cannot be set when spec.os.name is windows.\n                            items:\n                              description: Sysctl defines a kernel parameter to be\n                                set\n                              properties:\n                                name:\n                                  description: Name of a property to set\n                                  type: string\n                                value:\n                                  description: Value of a property to set\n                                  type: string\n                              required:\n                              - name\n                              - value\n                              type: object\n                            type: array\n                          windowsOptions:\n                            description: |-\n                              The Windows specific settings applied to all containers.\n                              If unspecified, the options within a container's SecurityContext will be used.\n                              If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\n                              Note that this field cannot be set when spec.os.name is linux.\n                            properties:\n                              gmsaCredentialSpec:\n                                description: |-\n                                  GMSACredentialSpec is where the GMSA admission webhook\n                                  (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\n                                  GMSA credential spec named by the GMSACredentialSpecName field.\n                                type: string\n                              gmsaCredentialSpecName:\n                                description: GMSACredentialSpecName is the name of\n                                  the GMSA credential spec to use.\n                                type: string\n                              hostProcess:\n                                description: |-\n                                  HostProcess determines if a container should be run as a 'Host Process' container.\n                                  All of a Pod's containers must have the same effective HostProcess value\n                                  (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\n                                  In addition, if HostProcess is true then HostNetwork must also be set to true.\n                                type: boolean\n                              runAsUserName:\n                                description: |-\n                                  The UserName in Windows to run the entrypoint of the container process.\n                                  Defaults to the user specified in image metadata if unspecified.\n                                  May also be set in PodSecurityContext. If set in both SecurityContext and\n                                  PodSecurityContext, the value specified in SecurityContext takes precedence.\n                                type: string\n                            type: object\n                        type: object\n                      serviceAccount:\n                        description: |-\n                          DeprecatedServiceAccount is a depreciated alias for ServiceAccountName.\n                          Deprecated: Use serviceAccountName instead.\n                        type: string\n                      serviceAccountName:\n                        description: |-\n                          ServiceAccountName is the name of the ServiceAccount to use to run this pod.\n                          More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n                        type: string\n                      setHostnameAsFQDN:\n                        description: |-\n                          If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default).\n                          In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname).\n                          In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip\\\\Parameters to FQDN.\n                          If a pod does not have FQDN, this has no effect.\n                          Default to false.\n                        type: boolean\n                      shareProcessNamespace:\n                        description: |-\n                          Share a single process namespace between all of the containers in a pod.\n                          When this is set containers will be able to view and signal processes from other containers\n                          in the same pod, and the first process in each container will not be assigned PID 1.\n                          HostPID and ShareProcessNamespace cannot both be set.\n                          Optional: Default to false.\n                        type: boolean\n                      subdomain:\n                        description: |-\n                          If specified, the fully qualified Pod hostname will be \"<hostname>.<subdomain>.<pod namespace>.svc.<cluster domain>\".\n                          If not specified, the pod will not have a domainname at all.\n                        type: string\n                      terminationGracePeriodSeconds:\n                        description: |-\n                          Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request.\n                          Value must be non-negative integer. The value zero indicates stop immediately via\n                          the kill signal (no opportunity to shut down).\n                          If this value is nil, the default grace period will be used instead.\n                          The grace period is the duration in seconds after the processes running in the pod are sent\n                          a termination signal and the time when the processes are forcibly halted with a kill signal.\n                          Set this value longer than the expected cleanup time for your process.\n                          Defaults to 30 seconds.\n                        format: int64\n                        type: integer\n                      tolerations:\n                        description: If specified, the pod's tolerations.\n                        items:\n                          description: |-\n                            The pod this Toleration is attached to tolerates any taint that matches\n                            the triple <key,value,effect> using the matching operator <operator>.\n                          properties:\n                            effect:\n                              description: |-\n                                Effect indicates the taint effect to match. Empty means match all taint effects.\n                                When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\n                              type: string\n                            key:\n                              description: |-\n                                Key is the taint key that the toleration applies to. Empty means match all taint keys.\n                                If the key is empty, operator must be Exists; this combination means to match all values and all keys.\n                              type: string\n                            operator:\n                              description: |-\n                                Operator represents a key's relationship to the value.\n                                Valid operators are Exists and Equal. Defaults to Equal.\n                                Exists is equivalent to wildcard for value, so that a pod can\n                                tolerate all taints of a particular category.\n                              type: string\n                            tolerationSeconds:\n                              description: |-\n                                TolerationSeconds represents the period of time the toleration (which must be\n                                of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\n                                it is not set, which means tolerate the taint forever (do not evict). Zero and\n                                negative values will be treated as 0 (evict immediately) by the system.\n                              format: int64\n                              type: integer\n                            value:\n                              description: |-\n                                Value is the taint value the toleration matches to.\n                                If the operator is Exists, the value should be empty, otherwise just a regular string.\n                              type: string\n                          type: object\n                        type: array\n                      topologySpreadConstraints:\n                        description: |-\n                          TopologySpreadConstraints describes how a group of pods ought to spread across topology\n                          domains. Scheduler will schedule pods in a way which abides by the constraints.\n                          All topologySpreadConstraints are ANDed.\n                        items:\n                          description: TopologySpreadConstraint specifies how to spread\n                            matching pods among the given topology.\n                          properties:\n                            labelSelector:\n                              description: |-\n                                LabelSelector is used to find matching pods.\n                                Pods that match this label selector are counted to determine the number of pods\n                                in their corresponding topology domain.\n                              properties:\n                                matchExpressions:\n                                  description: matchExpressions is a list of label\n                                    selector requirements. The requirements are ANDed.\n                                  items:\n                                    description: |-\n                                      A label selector requirement is a selector that contains values, a key, and an operator that\n                                      relates the key and values.\n                                    properties:\n                                      key:\n                                        description: key is the label key that the\n                                          selector applies to.\n                                        type: string\n                                      operator:\n                                        description: |-\n                                          operator represents a key's relationship to a set of values.\n                                          Valid operators are In, NotIn, Exists and DoesNotExist.\n                                        type: string\n                                      values:\n                                        description: |-\n                                          values is an array of string values. If the operator is In or NotIn,\n                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                          the values array must be empty. This array is replaced during a strategic\n                                          merge patch.\n                                        items:\n                                          type: string\n                                        type: array\n                                    required:\n                                    - key\n                                    - operator\n                                    type: object\n                                  type: array\n                                matchLabels:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                    map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                    operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                  type: object\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            matchLabelKeys:\n                              description: |-\n                                MatchLabelKeys is a set of pod label keys to select the pods over which\n                                spreading will be calculated. The keys are used to lookup values from the\n                                incoming pod labels, those key-value labels are ANDed with labelSelector\n                                to select the group of existing pods over which spreading will be calculated\n                                for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\n                                MatchLabelKeys cannot be set when LabelSelector isn't set.\n                                Keys that don't exist in the incoming pod labels will\n                                be ignored. A null or empty list means only match against labelSelector.\n\n\n                                This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n                              items:\n                                type: string\n                              type: array\n                              x-kubernetes-list-type: atomic\n                            maxSkew:\n                              description: |-\n                                MaxSkew describes the degree to which pods may be unevenly distributed.\n                                When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference\n                                between the number of matching pods in the target topology and the global minimum.\n                                The global minimum is the minimum number of matching pods in an eligible domain\n                                or zero if the number of eligible domains is less than MinDomains.\n                                For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                labelSelector spread as 2/2/1:\n                                In this case, the global minimum is 1.\n                                | zone1 | zone2 | zone3 |\n                                |  P P  |  P P  |   P   |\n                                - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2;\n                                scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2)\n                                violate MaxSkew(1).\n                                - if MaxSkew is 2, incoming pod can be scheduled onto any zone.\n                                When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence\n                                to topologies that satisfy it.\n                                It's a required field. Default value is 1 and 0 is not allowed.\n                              format: int32\n                              type: integer\n                            minDomains:\n                              description: |-\n                                MinDomains indicates a minimum number of eligible domains.\n                                When the number of eligible domains with matching topology keys is less than minDomains,\n                                Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed.\n                                And when the number of eligible domains with matching topology keys equals or greater than minDomains,\n                                this value has no effect on scheduling.\n                                As a result, when the number of eligible domains is less than minDomains,\n                                scheduler won't schedule more than maxSkew Pods to those domains.\n                                If value is nil, the constraint behaves as if MinDomains is equal to 1.\n                                Valid values are integers greater than 0.\n                                When value is not nil, WhenUnsatisfiable must be DoNotSchedule.\n\n\n                                For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same\n                                labelSelector spread as 2/2/2:\n                                | zone1 | zone2 | zone3 |\n                                |  P P  |  P P  |  P P  |\n                                The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0.\n                                In this situation, new pod with the same labelSelector cannot be scheduled,\n                                because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones,\n                                it will violate MaxSkew.\n\n\n                                This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default).\n                              format: int32\n                              type: integer\n                            nodeAffinityPolicy:\n                              description: |-\n                                NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\n                                when calculating pod topology spread skew. Options are:\n                                - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n                                - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\n\n                                If this value is nil, the behavior is equivalent to the Honor policy.\n                                This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                              type: string\n                            nodeTaintsPolicy:\n                              description: |-\n                                NodeTaintsPolicy indicates how we will treat node taints when calculating\n                                pod topology spread skew. Options are:\n                                - Honor: nodes without taints, along with tainted nodes for which the incoming pod\n                                has a toleration, are included.\n                                - Ignore: node taints are ignored. All nodes are included.\n\n\n                                If this value is nil, the behavior is equivalent to the Ignore policy.\n                                This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n                              type: string\n                            topologyKey:\n                              description: |-\n                                TopologyKey is the key of node labels. Nodes that have a label with this key\n                                and identical values are considered to be in the same topology.\n                                We consider each <key, value> as a \"bucket\", and try to put balanced number\n                                of pods into each bucket.\n                                We define a domain as a particular instance of a topology.\n                                Also, we define an eligible domain as a domain whose nodes meet the requirements of\n                                nodeAffinityPolicy and nodeTaintsPolicy.\n                                e.g. If TopologyKey is \"kubernetes.io/hostname\", each Node is a domain of that topology.\n                                And, if TopologyKey is \"topology.kubernetes.io/zone\", each zone is a domain of that topology.\n                                It's a required field.\n                              type: string\n                            whenUnsatisfiable:\n                              description: |-\n                                WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy\n                                the spread constraint.\n                                - DoNotSchedule (default) tells the scheduler not to schedule it.\n                                - ScheduleAnyway tells the scheduler to schedule the pod in any location,\n                                  but giving higher precedence to topologies that would help reduce the\n                                  skew.\n                                A constraint is considered \"Unsatisfiable\" for an incoming pod\n                                if and only if every possible node assignment for that pod would violate\n                                \"MaxSkew\" on some topology.\n                                For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same\n                                labelSelector spread as 3/1/1:\n                                | zone1 | zone2 | zone3 |\n                                | P P P |   P   |   P   |\n                                If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled\n                                to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies\n                                MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler\n                                won't make it *more* imbalanced.\n                                It's a required field.\n                              type: string\n                          required:\n                          - maxSkew\n                          - topologyKey\n                          - whenUnsatisfiable\n                          type: object\n                        type: array\n                        x-kubernetes-list-map-keys:\n                        - topologyKey\n                        - whenUnsatisfiable\n                        x-kubernetes-list-type: map\n                      volumes:\n                        description: |-\n                          List of volumes that can be mounted by containers belonging to the pod.\n                          More info: https://kubernetes.io/docs/concepts/storage/volumes\n                        items:\n                          description: Volume represents a named volume in a pod that\n                            may be accessed by any container in the pod.\n                          properties:\n                            awsElasticBlockStore:\n                              description: |-\n                                awsElasticBlockStore represents an AWS Disk resource that is attached to a\n                                kubelet's host machine and then exposed to the pod.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type of the volume that you want to mount.\n                                    Tip: Ensure that the filesystem type is supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                partition:\n                                  description: |-\n                                    partition is the partition in the volume that you want to mount.\n                                    If omitted, the default is to mount by volume name.\n                                    Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                    Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                  format: int32\n                                  type: integer\n                                readOnly:\n                                  description: |-\n                                    readOnly value true will force the readOnly setting in VolumeMounts.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                  type: boolean\n                                volumeID:\n                                  description: |-\n                                    volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume).\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore\n                                  type: string\n                              required:\n                              - volumeID\n                              type: object\n                            azureDisk:\n                              description: azureDisk represents an Azure Data Disk\n                                mount on the host and bind mount to the pod.\n                              properties:\n                                cachingMode:\n                                  description: 'cachingMode is the Host Caching mode:\n                                    None, Read Only, Read Write.'\n                                  type: string\n                                diskName:\n                                  description: diskName is the Name of the data disk\n                                    in the blob storage\n                                  type: string\n                                diskURI:\n                                  description: diskURI is the URI of data disk in\n                                    the blob storage\n                                  type: string\n                                fsType:\n                                  description: |-\n                                    fsType is Filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                kind:\n                                  description: 'kind expected values are Shared: multiple\n                                    blob disks per storage account  Dedicated: single\n                                    blob disk per storage account  Managed: azure\n                                    managed data disk (only in managed availability\n                                    set). defaults to shared'\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly Defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                              required:\n                              - diskName\n                              - diskURI\n                              type: object\n                            azureFile:\n                              description: azureFile represents an Azure File Service\n                                mount on the host and bind mount to the pod.\n                              properties:\n                                readOnly:\n                                  description: |-\n                                    readOnly defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                secretName:\n                                  description: secretName is the  name of secret that\n                                    contains Azure Storage Account Name and Key\n                                  type: string\n                                shareName:\n                                  description: shareName is the azure share Name\n                                  type: string\n                              required:\n                              - secretName\n                              - shareName\n                              type: object\n                            cephfs:\n                              description: cephFS represents a Ceph FS mount on the\n                                host that shares a pod's lifetime\n                              properties:\n                                monitors:\n                                  description: |-\n                                    monitors is Required: Monitors is a collection of Ceph monitors\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  items:\n                                    type: string\n                                  type: array\n                                path:\n                                  description: 'path is Optional: Used as the mounted\n                                    root, rather than the full Ceph tree, default\n                                    is /'\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  type: boolean\n                                secretFile:\n                                  description: |-\n                                    secretFile is Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  type: string\n                                secretRef:\n                                  description: |-\n                                    secretRef is Optional: SecretRef is reference to the authentication secret for User, default is empty.\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                user:\n                                  description: |-\n                                    user is optional: User is the rados user name, default is admin\n                                    More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it\n                                  type: string\n                              required:\n                              - monitors\n                              type: object\n                            cinder:\n                              description: |-\n                                cinder represents a cinder volume attached and mounted on kubelets host machine.\n                                More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                    More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef is optional: points to a secret object containing parameters used to connect\n                                    to OpenStack.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                volumeID:\n                                  description: |-\n                                    volumeID used to identify the volume in cinder.\n                                    More info: https://examples.k8s.io/mysql-cinder-pd/README.md\n                                  type: string\n                              required:\n                              - volumeID\n                              type: object\n                            configMap:\n                              description: configMap represents a configMap that should\n                                populate this volume\n                              properties:\n                                defaultMode:\n                                  description: |-\n                                    defaultMode is optional: mode bits used to set permissions on created files by default.\n                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                    Defaults to 0644.\n                                    Directories within the path are not affected by this setting.\n                                    This might be in conflict with other options that affect the file\n                                    mode, like fsGroup, and the result can be other mode bits set.\n                                  format: int32\n                                  type: integer\n                                items:\n                                  description: |-\n                                    items if unspecified, each key-value pair in the Data field of the referenced\n                                    ConfigMap will be projected into the volume as a file whose name is the\n                                    key and content is the value. If specified, the listed keys will be\n                                    projected into the specified paths, and unlisted keys will not be\n                                    present. If a key is specified which is not present in the ConfigMap,\n                                    the volume setup will error unless it is marked optional. Paths must be\n                                    relative and may not contain the '..' path or start with '..'.\n                                  items:\n                                    description: Maps a string key to a path within\n                                      a volume.\n                                    properties:\n                                      key:\n                                        description: key is the key to project.\n                                        type: string\n                                      mode:\n                                        description: |-\n                                          mode is Optional: mode bits used to set permissions on this file.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          If not specified, the volume defaultMode will be used.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      path:\n                                        description: |-\n                                          path is the relative path of the file to map the key to.\n                                          May not be an absolute path.\n                                          May not contain the path element '..'.\n                                          May not start with the string '..'.\n                                        type: string\n                                    required:\n                                    - key\n                                    - path\n                                    type: object\n                                  type: array\n                                name:\n                                  description: |-\n                                    Name of the referent.\n                                    More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                    TODO: Add other useful fields. apiVersion, kind, uid?\n                                  type: string\n                                optional:\n                                  description: optional specify whether the ConfigMap\n                                    or its keys must be defined\n                                  type: boolean\n                              type: object\n                              x-kubernetes-map-type: atomic\n                            csi:\n                              description: csi (Container Storage Interface) represents\n                                ephemeral storage that is handled by certain external\n                                CSI drivers (Beta feature).\n                              properties:\n                                driver:\n                                  description: |-\n                                    driver is the name of the CSI driver that handles this volume.\n                                    Consult with your admin for the correct name as registered in the cluster.\n                                  type: string\n                                fsType:\n                                  description: |-\n                                    fsType to mount. Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                    If not provided, the empty value is passed to the associated CSI driver\n                                    which will determine the default filesystem to apply.\n                                  type: string\n                                nodePublishSecretRef:\n                                  description: |-\n                                    nodePublishSecretRef is a reference to the secret object containing\n                                    sensitive information to pass to the CSI driver to complete the CSI\n                                    NodePublishVolume and NodeUnpublishVolume calls.\n                                    This field is optional, and  may be empty if no secret is required. If the\n                                    secret object contains more than one secret, all secret references are passed.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                readOnly:\n                                  description: |-\n                                    readOnly specifies a read-only configuration for the volume.\n                                    Defaults to false (read/write).\n                                  type: boolean\n                                volumeAttributes:\n                                  additionalProperties:\n                                    type: string\n                                  description: |-\n                                    volumeAttributes stores driver-specific properties that are passed to the CSI\n                                    driver. Consult your driver's documentation for supported values.\n                                  type: object\n                              required:\n                              - driver\n                              type: object\n                            downwardAPI:\n                              description: downwardAPI represents downward API about\n                                the pod that should populate this volume\n                              properties:\n                                defaultMode:\n                                  description: |-\n                                    Optional: mode bits to use on created files by default. Must be a\n                                    Optional: mode bits used to set permissions on created files by default.\n                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                    Defaults to 0644.\n                                    Directories within the path are not affected by this setting.\n                                    This might be in conflict with other options that affect the file\n                                    mode, like fsGroup, and the result can be other mode bits set.\n                                  format: int32\n                                  type: integer\n                                items:\n                                  description: Items is a list of downward API volume\n                                    file\n                                  items:\n                                    description: DownwardAPIVolumeFile represents\n                                      information to create the file containing the\n                                      pod field\n                                    properties:\n                                      fieldRef:\n                                        description: 'Required: Selects a field of\n                                          the pod: only annotations, labels, name\n                                          and namespace are supported.'\n                                        properties:\n                                          apiVersion:\n                                            description: Version of the schema the\n                                              FieldPath is written in terms of, defaults\n                                              to \"v1\".\n                                            type: string\n                                          fieldPath:\n                                            description: Path of the field to select\n                                              in the specified API version.\n                                            type: string\n                                        required:\n                                        - fieldPath\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      mode:\n                                        description: |-\n                                          Optional: mode bits used to set permissions on this file, must be an octal value\n                                          between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          If not specified, the volume defaultMode will be used.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      path:\n                                        description: 'Required: Path is  the relative\n                                          path name of the file to be created. Must\n                                          not be absolute or contain the ''..'' path.\n                                          Must be utf-8 encoded. The first item of\n                                          the relative path must not start with ''..'''\n                                        type: string\n                                      resourceFieldRef:\n                                        description: |-\n                                          Selects a resource of the container: only resources limits and requests\n                                          (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                        properties:\n                                          containerName:\n                                            description: 'Container name: required\n                                              for volumes, optional for env vars'\n                                            type: string\n                                          divisor:\n                                            anyOf:\n                                            - type: integer\n                                            - type: string\n                                            description: Specifies the output format\n                                              of the exposed resources, defaults to\n                                              \"1\"\n                                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                            x-kubernetes-int-or-string: true\n                                          resource:\n                                            description: 'Required: resource to select'\n                                            type: string\n                                        required:\n                                        - resource\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                    required:\n                                    - path\n                                    type: object\n                                  type: array\n                              type: object\n                            emptyDir:\n                              description: |-\n                                emptyDir represents a temporary directory that shares a pod's lifetime.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                              properties:\n                                medium:\n                                  description: |-\n                                    medium represents what type of storage medium should back this directory.\n                                    The default is \"\" which means to use the node's default medium.\n                                    Must be an empty string (default) or Memory.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                  type: string\n                                sizeLimit:\n                                  anyOf:\n                                  - type: integer\n                                  - type: string\n                                  description: |-\n                                    sizeLimit is the total amount of local storage required for this EmptyDir volume.\n                                    The size limit is also applicable for memory medium.\n                                    The maximum usage on memory medium EmptyDir would be the minimum value between\n                                    the SizeLimit specified here and the sum of memory limits of all containers in a pod.\n                                    The default is nil which means that the limit is undefined.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n                                  pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                  x-kubernetes-int-or-string: true\n                              type: object\n                            ephemeral:\n                              description: |-\n                                ephemeral represents a volume that is handled by a cluster storage driver.\n                                The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts,\n                                and deleted when the pod is removed.\n\n\n                                Use this if:\n                                a) the volume is only needed while the pod runs,\n                                b) features of normal volumes like restoring from snapshot or capacity\n                                   tracking are needed,\n                                c) the storage driver is specified through a storage class, and\n                                d) the storage driver supports dynamic volume provisioning through\n                                   a PersistentVolumeClaim (see EphemeralVolumeSource for more\n                                   information on the connection between this volume type\n                                   and PersistentVolumeClaim).\n\n\n                                Use PersistentVolumeClaim or one of the vendor-specific\n                                APIs for volumes that persist for longer than the lifecycle\n                                of an individual pod.\n\n\n                                Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to\n                                be used that way - see the documentation of the driver for\n                                more information.\n\n\n                                A pod can use both types of ephemeral volumes and\n                                persistent volumes at the same time.\n                              properties:\n                                volumeClaimTemplate:\n                                  description: |-\n                                    Will be used to create a stand-alone PVC to provision the volume.\n                                    The pod in which this EphemeralVolumeSource is embedded will be the\n                                    owner of the PVC, i.e. the PVC will be deleted together with the\n                                    pod.  The name of the PVC will be `<pod name>-<volume name>` where\n                                    `<volume name>` is the name from the `PodSpec.Volumes` array\n                                    entry. Pod validation will reject the pod if the concatenated name\n                                    is not valid for a PVC (for example, too long).\n\n\n                                    An existing PVC with that name that is not owned by the pod\n                                    will *not* be used for the pod to avoid using an unrelated\n                                    volume by mistake. Starting the pod is then blocked until\n                                    the unrelated PVC is removed. If such a pre-created PVC is\n                                    meant to be used by the pod, the PVC has to updated with an\n                                    owner reference to the pod once the pod exists. Normally\n                                    this should not be necessary, but it may be useful when\n                                    manually reconstructing a broken cluster.\n\n\n                                    This field is read-only and no changes will be made by Kubernetes\n                                    to the PVC after it has been created.\n\n\n                                    Required, must not be nil.\n                                  properties:\n                                    metadata:\n                                      description: |-\n                                        May contain labels and annotations that will be copied into the PVC\n                                        when creating it. No other fields are allowed and will be rejected during\n                                        validation.\n                                      properties:\n                                        annotations:\n                                          additionalProperties:\n                                            type: string\n                                          type: object\n                                        finalizers:\n                                          items:\n                                            type: string\n                                          type: array\n                                        labels:\n                                          additionalProperties:\n                                            type: string\n                                          type: object\n                                        name:\n                                          type: string\n                                        namespace:\n                                          type: string\n                                      type: object\n                                    spec:\n                                      description: |-\n                                        The specification for the PersistentVolumeClaim. The entire content is\n                                        copied unchanged into the PVC that gets created from this\n                                        template. The same fields as in a PersistentVolumeClaim\n                                        are also valid here.\n                                      properties:\n                                        accessModes:\n                                          description: |-\n                                            accessModes contains the desired access modes the volume should have.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                                          items:\n                                            type: string\n                                          type: array\n                                        dataSource:\n                                          description: |-\n                                            dataSource field can be used to specify either:\n                                            * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                                            * An existing PVC (PersistentVolumeClaim)\n                                            If the provisioner or an external controller can support the specified data source,\n                                            it will create a new volume based on the contents of the specified data source.\n                                            When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                                            and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                                            If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                                          properties:\n                                            apiGroup:\n                                              description: |-\n                                                APIGroup is the group for the resource being referenced.\n                                                If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                For any other third-party types, APIGroup is required.\n                                              type: string\n                                            kind:\n                                              description: Kind is the type of resource\n                                                being referenced\n                                              type: string\n                                            name:\n                                              description: Name is the name of resource\n                                                being referenced\n                                              type: string\n                                          required:\n                                          - kind\n                                          - name\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        dataSourceRef:\n                                          description: |-\n                                            dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                                            volume is desired. This may be any object from a non-empty API group (non\n                                            core object) or a PersistentVolumeClaim object.\n                                            When this field is specified, volume binding will only succeed if the type of\n                                            the specified object matches some installed volume populator or dynamic\n                                            provisioner.\n                                            This field will replace the functionality of the dataSource field and as such\n                                            if both fields are non-empty, they must have the same value. For backwards\n                                            compatibility, when namespace isn't specified in dataSourceRef,\n                                            both fields (dataSource and dataSourceRef) will be set to the same\n                                            value automatically if one of them is empty and the other is non-empty.\n                                            When namespace is specified in dataSourceRef,\n                                            dataSource isn't set to the same value and must be empty.\n                                            There are three important differences between dataSource and dataSourceRef:\n                                            * While dataSource only allows two specific types of objects, dataSourceRef\n                                              allows any non-core object, as well as PersistentVolumeClaim objects.\n                                            * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                                              preserves all values, and generates an error if a disallowed value is\n                                              specified.\n                                            * While dataSource only allows local objects, dataSourceRef allows objects\n                                              in any namespaces.\n                                            (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                                            (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                          properties:\n                                            apiGroup:\n                                              description: |-\n                                                APIGroup is the group for the resource being referenced.\n                                                If APIGroup is not specified, the specified Kind must be in the core API group.\n                                                For any other third-party types, APIGroup is required.\n                                              type: string\n                                            kind:\n                                              description: Kind is the type of resource\n                                                being referenced\n                                              type: string\n                                            name:\n                                              description: Name is the name of resource\n                                                being referenced\n                                              type: string\n                                            namespace:\n                                              description: |-\n                                                Namespace is the namespace of resource being referenced\n                                                Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                                (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                                              type: string\n                                          required:\n                                          - kind\n                                          - name\n                                          type: object\n                                        resources:\n                                          description: |-\n                                            resources represents the minimum resources the volume should have.\n                                            If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                                            that are lower than previous value but must still be higher than capacity recorded in the\n                                            status field of the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                                          properties:\n                                            limits:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Limits describes the maximum amount of compute resources allowed.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                            requests:\n                                              additionalProperties:\n                                                anyOf:\n                                                - type: integer\n                                                - type: string\n                                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                x-kubernetes-int-or-string: true\n                                              description: |-\n                                                Requests describes the minimum amount of compute resources required.\n                                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                                              type: object\n                                          type: object\n                                        selector:\n                                          description: selector is a label query over\n                                            volumes to consider for binding.\n                                          properties:\n                                            matchExpressions:\n                                              description: matchExpressions is a list\n                                                of label selector requirements. The\n                                                requirements are ANDed.\n                                              items:\n                                                description: |-\n                                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                                  relates the key and values.\n                                                properties:\n                                                  key:\n                                                    description: key is the label\n                                                      key that the selector applies\n                                                      to.\n                                                    type: string\n                                                  operator:\n                                                    description: |-\n                                                      operator represents a key's relationship to a set of values.\n                                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                    type: string\n                                                  values:\n                                                    description: |-\n                                                      values is an array of string values. If the operator is In or NotIn,\n                                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                      the values array must be empty. This array is replaced during a strategic\n                                                      merge patch.\n                                                    items:\n                                                      type: string\n                                                    type: array\n                                                required:\n                                                - key\n                                                - operator\n                                                type: object\n                                              type: array\n                                            matchLabels:\n                                              additionalProperties:\n                                                type: string\n                                              description: |-\n                                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                              type: object\n                                          type: object\n                                          x-kubernetes-map-type: atomic\n                                        storageClassName:\n                                          description: |-\n                                            storageClassName is the name of the StorageClass required by the claim.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                                          type: string\n                                        volumeAttributesClassName:\n                                          description: |-\n                                            volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                                            If specified, the CSI driver will create or update the volume with the attributes defined\n                                            in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                                            it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                                            will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                                            If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                                            will be set by the persistentvolume controller if it exists.\n                                            If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                                            set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                                            exists.\n                                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                                            (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                                          type: string\n                                        volumeMode:\n                                          description: |-\n                                            volumeMode defines what type of volume is required by the claim.\n                                            Value of Filesystem is implied when not included in claim spec.\n                                          type: string\n                                        volumeName:\n                                          description: volumeName is the binding reference\n                                            to the PersistentVolume backing this claim.\n                                          type: string\n                                      type: object\n                                  required:\n                                  - spec\n                                  type: object\n                              type: object\n                            fc:\n                              description: fc represents a Fibre Channel resource\n                                that is attached to a kubelet's host machine and then\n                                exposed to the pod.\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                lun:\n                                  description: 'lun is Optional: FC target lun number'\n                                  format: int32\n                                  type: integer\n                                readOnly:\n                                  description: |-\n                                    readOnly is Optional: Defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                targetWWNs:\n                                  description: 'targetWWNs is Optional: FC target\n                                    worldwide names (WWNs)'\n                                  items:\n                                    type: string\n                                  type: array\n                                wwids:\n                                  description: |-\n                                    wwids Optional: FC volume world wide identifiers (wwids)\n                                    Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.\n                                  items:\n                                    type: string\n                                  type: array\n                              type: object\n                            flexVolume:\n                              description: |-\n                                flexVolume represents a generic volume resource that is\n                                provisioned/attached using an exec based plugin.\n                              properties:\n                                driver:\n                                  description: driver is the name of the driver to\n                                    use for this volume.\n                                  type: string\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". The default filesystem depends on FlexVolume script.\n                                  type: string\n                                options:\n                                  additionalProperties:\n                                    type: string\n                                  description: 'options is Optional: this field holds\n                                    extra command options if any.'\n                                  type: object\n                                readOnly:\n                                  description: |-\n                                    readOnly is Optional: defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef is Optional: secretRef is reference to the secret object containing\n                                    sensitive information to pass to the plugin scripts. This may be\n                                    empty if no secret object is specified. If the secret object\n                                    contains more than one secret, all secrets are passed to the plugin\n                                    scripts.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                              required:\n                              - driver\n                              type: object\n                            flocker:\n                              description: flocker represents a Flocker volume attached\n                                to a kubelet's host machine. This depends on the Flocker\n                                control service being running\n                              properties:\n                                datasetName:\n                                  description: |-\n                                    datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker\n                                    should be considered as deprecated\n                                  type: string\n                                datasetUUID:\n                                  description: datasetUUID is the UUID of the dataset.\n                                    This is unique identifier of a Flocker dataset\n                                  type: string\n                              type: object\n                            gcePersistentDisk:\n                              description: |-\n                                gcePersistentDisk represents a GCE Disk resource that is attached to a\n                                kubelet's host machine and then exposed to the pod.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is filesystem type of the volume that you want to mount.\n                                    Tip: Ensure that the filesystem type is supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                partition:\n                                  description: |-\n                                    partition is the partition in the volume that you want to mount.\n                                    If omitted, the default is to mount by volume name.\n                                    Examples: For volume /dev/sda1, you specify the partition as \"1\".\n                                    Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  format: int32\n                                  type: integer\n                                pdName:\n                                  description: |-\n                                    pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the ReadOnly setting in VolumeMounts.\n                                    Defaults to false.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk\n                                  type: boolean\n                              required:\n                              - pdName\n                              type: object\n                            gitRepo:\n                              description: |-\n                                gitRepo represents a git repository at a particular revision.\n                                DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an\n                                EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir\n                                into the Pod's container.\n                              properties:\n                                directory:\n                                  description: |-\n                                    directory is the target directory name.\n                                    Must not contain or start with '..'.  If '.' is supplied, the volume directory will be the\n                                    git repository.  Otherwise, if specified, the volume will contain the git repository in\n                                    the subdirectory with the given name.\n                                  type: string\n                                repository:\n                                  description: repository is the URL\n                                  type: string\n                                revision:\n                                  description: revision is the commit hash for the\n                                    specified revision.\n                                  type: string\n                              required:\n                              - repository\n                              type: object\n                            glusterfs:\n                              description: |-\n                                glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime.\n                                More info: https://examples.k8s.io/volumes/glusterfs/README.md\n                              properties:\n                                endpoints:\n                                  description: |-\n                                    endpoints is the endpoint name that details Glusterfs topology.\n                                    More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                  type: string\n                                path:\n                                  description: |-\n                                    path is the Glusterfs volume path.\n                                    More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the Glusterfs volume to be mounted with read-only permissions.\n                                    Defaults to false.\n                                    More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod\n                                  type: boolean\n                              required:\n                              - endpoints\n                              - path\n                              type: object\n                            hostPath:\n                              description: |-\n                                hostPath represents a pre-existing file or directory on the host\n                                machine that is directly exposed to the container. This is generally\n                                used for system agents or other privileged things that are allowed\n                                to see the host machine. Most containers will NOT need this.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                ---\n                                TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not\n                                mount host directories as read/write.\n                              properties:\n                                path:\n                                  description: |-\n                                    path of the directory on the host.\n                                    If the path is a symlink, it will follow the link to the real path.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                  type: string\n                                type:\n                                  description: |-\n                                    type for HostPath Volume\n                                    Defaults to \"\"\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath\n                                  type: string\n                              required:\n                              - path\n                              type: object\n                            iscsi:\n                              description: |-\n                                iscsi represents an ISCSI Disk resource that is attached to a\n                                kubelet's host machine and then exposed to the pod.\n                                More info: https://examples.k8s.io/volumes/iscsi/README.md\n                              properties:\n                                chapAuthDiscovery:\n                                  description: chapAuthDiscovery defines whether support\n                                    iSCSI Discovery CHAP authentication\n                                  type: boolean\n                                chapAuthSession:\n                                  description: chapAuthSession defines whether support\n                                    iSCSI Session CHAP authentication\n                                  type: boolean\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type of the volume that you want to mount.\n                                    Tip: Ensure that the filesystem type is supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                initiatorName:\n                                  description: |-\n                                    initiatorName is the custom iSCSI Initiator Name.\n                                    If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface\n                                    <target portal>:<volume name> will be created for the connection.\n                                  type: string\n                                iqn:\n                                  description: iqn is the target iSCSI Qualified Name.\n                                  type: string\n                                iscsiInterface:\n                                  description: |-\n                                    iscsiInterface is the interface Name that uses an iSCSI transport.\n                                    Defaults to 'default' (tcp).\n                                  type: string\n                                lun:\n                                  description: lun represents iSCSI Target Lun number.\n                                  format: int32\n                                  type: integer\n                                portals:\n                                  description: |-\n                                    portals is the iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port\n                                    is other than default (typically TCP ports 860 and 3260).\n                                  items:\n                                    type: string\n                                  type: array\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the ReadOnly setting in VolumeMounts.\n                                    Defaults to false.\n                                  type: boolean\n                                secretRef:\n                                  description: secretRef is the CHAP Secret for iSCSI\n                                    target and initiator authentication\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                targetPortal:\n                                  description: |-\n                                    targetPortal is iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port\n                                    is other than default (typically TCP ports 860 and 3260).\n                                  type: string\n                              required:\n                              - iqn\n                              - lun\n                              - targetPortal\n                              type: object\n                            name:\n                              description: |-\n                                name of the volume.\n                                Must be a DNS_LABEL and unique within the pod.\n                                More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                              type: string\n                            nfs:\n                              description: |-\n                                nfs represents an NFS mount on the host that shares a pod's lifetime\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                              properties:\n                                path:\n                                  description: |-\n                                    path that is exported by the NFS server.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the NFS export to be mounted with read-only permissions.\n                                    Defaults to false.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                  type: boolean\n                                server:\n                                  description: |-\n                                    server is the hostname or IP address of the NFS server.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs\n                                  type: string\n                              required:\n                              - path\n                              - server\n                              type: object\n                            persistentVolumeClaim:\n                              description: |-\n                                persistentVolumeClaimVolumeSource represents a reference to a\n                                PersistentVolumeClaim in the same namespace.\n                                More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                              properties:\n                                claimName:\n                                  description: |-\n                                    claimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume.\n                                    More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly Will force the ReadOnly setting in VolumeMounts.\n                                    Default false.\n                                  type: boolean\n                              required:\n                              - claimName\n                              type: object\n                            photonPersistentDisk:\n                              description: photonPersistentDisk represents a PhotonController\n                                persistent disk attached and mounted on kubelets host\n                                machine\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                pdID:\n                                  description: pdID is the ID that identifies Photon\n                                    Controller persistent disk\n                                  type: string\n                              required:\n                              - pdID\n                              type: object\n                            portworxVolume:\n                              description: portworxVolume represents a portworx volume\n                                attached and mounted on kubelets host machine\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fSType represents the filesystem type to mount\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                volumeID:\n                                  description: volumeID uniquely identifies a Portworx\n                                    volume\n                                  type: string\n                              required:\n                              - volumeID\n                              type: object\n                            projected:\n                              description: projected items for all in one resources\n                                secrets, configmaps, and downward API\n                              properties:\n                                defaultMode:\n                                  description: |-\n                                    defaultMode are the mode bits used to set permissions on created files by default.\n                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                    Directories within the path are not affected by this setting.\n                                    This might be in conflict with other options that affect the file\n                                    mode, like fsGroup, and the result can be other mode bits set.\n                                  format: int32\n                                  type: integer\n                                sources:\n                                  description: sources is the list of volume projections\n                                  items:\n                                    description: Projection that may be projected\n                                      along with other supported volume types\n                                    properties:\n                                      clusterTrustBundle:\n                                        description: |-\n                                          ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\n                                          of ClusterTrustBundle objects in an auto-updating file.\n\n\n                                          Alpha, gated by the ClusterTrustBundleProjection feature gate.\n\n\n                                          ClusterTrustBundle objects can either be selected by name, or by the\n                                          combination of signer name and a label selector.\n\n\n                                          Kubelet performs aggressive normalization of the PEM contents written\n                                          into the pod filesystem.  Esoteric PEM features such as inter-block\n                                          comments and block headers are stripped.  Certificates are deduplicated.\n                                          The ordering of certificates within the file is arbitrary, and Kubelet\n                                          may change the order over time.\n                                        properties:\n                                          labelSelector:\n                                            description: |-\n                                              Select all ClusterTrustBundles that match this label selector.  Only has\n                                              effect if signerName is set.  Mutually-exclusive with name.  If unset,\n                                              interpreted as \"match nothing\".  If set but empty, interpreted as \"match\n                                              everything\".\n                                            properties:\n                                              matchExpressions:\n                                                description: matchExpressions is a\n                                                  list of label selector requirements.\n                                                  The requirements are ANDed.\n                                                items:\n                                                  description: |-\n                                                    A label selector requirement is a selector that contains values, a key, and an operator that\n                                                    relates the key and values.\n                                                  properties:\n                                                    key:\n                                                      description: key is the label\n                                                        key that the selector applies\n                                                        to.\n                                                      type: string\n                                                    operator:\n                                                      description: |-\n                                                        operator represents a key's relationship to a set of values.\n                                                        Valid operators are In, NotIn, Exists and DoesNotExist.\n                                                      type: string\n                                                    values:\n                                                      description: |-\n                                                        values is an array of string values. If the operator is In or NotIn,\n                                                        the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                                        the values array must be empty. This array is replaced during a strategic\n                                                        merge patch.\n                                                      items:\n                                                        type: string\n                                                      type: array\n                                                  required:\n                                                  - key\n                                                  - operator\n                                                  type: object\n                                                type: array\n                                              matchLabels:\n                                                additionalProperties:\n                                                  type: string\n                                                description: |-\n                                                  matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                                  map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                                  operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                                                type: object\n                                            type: object\n                                            x-kubernetes-map-type: atomic\n                                          name:\n                                            description: |-\n                                              Select a single ClusterTrustBundle by object name.  Mutually-exclusive\n                                              with signerName and labelSelector.\n                                            type: string\n                                          optional:\n                                            description: |-\n                                              If true, don't block pod startup if the referenced ClusterTrustBundle(s)\n                                              aren't available.  If using name, then the named ClusterTrustBundle is\n                                              allowed not to exist.  If using signerName, then the combination of\n                                              signerName and labelSelector is allowed to match zero\n                                              ClusterTrustBundles.\n                                            type: boolean\n                                          path:\n                                            description: Relative path from the volume\n                                              root to write the bundle.\n                                            type: string\n                                          signerName:\n                                            description: |-\n                                              Select all ClusterTrustBundles that match this signer name.\n                                              Mutually-exclusive with name.  The contents of all selected\n                                              ClusterTrustBundles will be unified and deduplicated.\n                                            type: string\n                                        required:\n                                        - path\n                                        type: object\n                                      configMap:\n                                        description: configMap information about the\n                                          configMap data to project\n                                        properties:\n                                          items:\n                                            description: |-\n                                              items if unspecified, each key-value pair in the Data field of the referenced\n                                              ConfigMap will be projected into the volume as a file whose name is the\n                                              key and content is the value. If specified, the listed keys will be\n                                              projected into the specified paths, and unlisted keys will not be\n                                              present. If a key is specified which is not present in the ConfigMap,\n                                              the volume setup will error unless it is marked optional. Paths must be\n                                              relative and may not contain the '..' path or start with '..'.\n                                            items:\n                                              description: Maps a string key to a\n                                                path within a volume.\n                                              properties:\n                                                key:\n                                                  description: key is the key to project.\n                                                  type: string\n                                                mode:\n                                                  description: |-\n                                                    mode is Optional: mode bits used to set permissions on this file.\n                                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                    If not specified, the volume defaultMode will be used.\n                                                    This might be in conflict with other options that affect the file\n                                                    mode, like fsGroup, and the result can be other mode bits set.\n                                                  format: int32\n                                                  type: integer\n                                                path:\n                                                  description: |-\n                                                    path is the relative path of the file to map the key to.\n                                                    May not be an absolute path.\n                                                    May not contain the path element '..'.\n                                                    May not start with the string '..'.\n                                                  type: string\n                                              required:\n                                              - key\n                                              - path\n                                              type: object\n                                            type: array\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: optional specify whether\n                                              the ConfigMap or its keys must be defined\n                                            type: boolean\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      downwardAPI:\n                                        description: downwardAPI information about\n                                          the downwardAPI data to project\n                                        properties:\n                                          items:\n                                            description: Items is a list of DownwardAPIVolume\n                                              file\n                                            items:\n                                              description: DownwardAPIVolumeFile represents\n                                                information to create the file containing\n                                                the pod field\n                                              properties:\n                                                fieldRef:\n                                                  description: 'Required: Selects\n                                                    a field of the pod: only annotations,\n                                                    labels, name and namespace are\n                                                    supported.'\n                                                  properties:\n                                                    apiVersion:\n                                                      description: Version of the\n                                                        schema the FieldPath is written\n                                                        in terms of, defaults to \"v1\".\n                                                      type: string\n                                                    fieldPath:\n                                                      description: Path of the field\n                                                        to select in the specified\n                                                        API version.\n                                                      type: string\n                                                  required:\n                                                  - fieldPath\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                                mode:\n                                                  description: |-\n                                                    Optional: mode bits used to set permissions on this file, must be an octal value\n                                                    between 0000 and 0777 or a decimal value between 0 and 511.\n                                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                    If not specified, the volume defaultMode will be used.\n                                                    This might be in conflict with other options that affect the file\n                                                    mode, like fsGroup, and the result can be other mode bits set.\n                                                  format: int32\n                                                  type: integer\n                                                path:\n                                                  description: 'Required: Path is  the\n                                                    relative path name of the file\n                                                    to be created. Must not be absolute\n                                                    or contain the ''..'' path. Must\n                                                    be utf-8 encoded. The first item\n                                                    of the relative path must not\n                                                    start with ''..'''\n                                                  type: string\n                                                resourceFieldRef:\n                                                  description: |-\n                                                    Selects a resource of the container: only resources limits and requests\n                                                    (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.\n                                                  properties:\n                                                    containerName:\n                                                      description: 'Container name:\n                                                        required for volumes, optional\n                                                        for env vars'\n                                                      type: string\n                                                    divisor:\n                                                      anyOf:\n                                                      - type: integer\n                                                      - type: string\n                                                      description: Specifies the output\n                                                        format of the exposed resources,\n                                                        defaults to \"1\"\n                                                      pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                                      x-kubernetes-int-or-string: true\n                                                    resource:\n                                                      description: 'Required: resource\n                                                        to select'\n                                                      type: string\n                                                  required:\n                                                  - resource\n                                                  type: object\n                                                  x-kubernetes-map-type: atomic\n                                              required:\n                                              - path\n                                              type: object\n                                            type: array\n                                        type: object\n                                      secret:\n                                        description: secret information about the\n                                          secret data to project\n                                        properties:\n                                          items:\n                                            description: |-\n                                              items if unspecified, each key-value pair in the Data field of the referenced\n                                              Secret will be projected into the volume as a file whose name is the\n                                              key and content is the value. If specified, the listed keys will be\n                                              projected into the specified paths, and unlisted keys will not be\n                                              present. If a key is specified which is not present in the Secret,\n                                              the volume setup will error unless it is marked optional. Paths must be\n                                              relative and may not contain the '..' path or start with '..'.\n                                            items:\n                                              description: Maps a string key to a\n                                                path within a volume.\n                                              properties:\n                                                key:\n                                                  description: key is the key to project.\n                                                  type: string\n                                                mode:\n                                                  description: |-\n                                                    mode is Optional: mode bits used to set permissions on this file.\n                                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                                    YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                                    If not specified, the volume defaultMode will be used.\n                                                    This might be in conflict with other options that affect the file\n                                                    mode, like fsGroup, and the result can be other mode bits set.\n                                                  format: int32\n                                                  type: integer\n                                                path:\n                                                  description: |-\n                                                    path is the relative path of the file to map the key to.\n                                                    May not be an absolute path.\n                                                    May not contain the path element '..'.\n                                                    May not start with the string '..'.\n                                                  type: string\n                                              required:\n                                              - key\n                                              - path\n                                              type: object\n                                            type: array\n                                          name:\n                                            description: |-\n                                              Name of the referent.\n                                              More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                              TODO: Add other useful fields. apiVersion, kind, uid?\n                                            type: string\n                                          optional:\n                                            description: optional field specify whether\n                                              the Secret or its key must be defined\n                                            type: boolean\n                                        type: object\n                                        x-kubernetes-map-type: atomic\n                                      serviceAccountToken:\n                                        description: serviceAccountToken is information\n                                          about the serviceAccountToken data to project\n                                        properties:\n                                          audience:\n                                            description: |-\n                                              audience is the intended audience of the token. A recipient of a token\n                                              must identify itself with an identifier specified in the audience of the\n                                              token, and otherwise should reject the token. The audience defaults to the\n                                              identifier of the apiserver.\n                                            type: string\n                                          expirationSeconds:\n                                            description: |-\n                                              expirationSeconds is the requested duration of validity of the service\n                                              account token. As the token approaches expiration, the kubelet volume\n                                              plugin will proactively rotate the service account token. The kubelet will\n                                              start trying to rotate the token if the token is older than 80 percent of\n                                              its time to live or if the token is older than 24 hours.Defaults to 1 hour\n                                              and must be at least 10 minutes.\n                                            format: int64\n                                            type: integer\n                                          path:\n                                            description: |-\n                                              path is the path relative to the mount point of the file to project the\n                                              token into.\n                                            type: string\n                                        required:\n                                        - path\n                                        type: object\n                                    type: object\n                                  type: array\n                              type: object\n                            quobyte:\n                              description: quobyte represents a Quobyte mount on the\n                                host that shares a pod's lifetime\n                              properties:\n                                group:\n                                  description: |-\n                                    group to map volume access to\n                                    Default is no group\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the Quobyte volume to be mounted with read-only permissions.\n                                    Defaults to false.\n                                  type: boolean\n                                registry:\n                                  description: |-\n                                    registry represents a single or multiple Quobyte Registry services\n                                    specified as a string as host:port pair (multiple entries are separated with commas)\n                                    which acts as the central registry for volumes\n                                  type: string\n                                tenant:\n                                  description: |-\n                                    tenant owning the given Quobyte volume in the Backend\n                                    Used with dynamically provisioned Quobyte volumes, value is set by the plugin\n                                  type: string\n                                user:\n                                  description: |-\n                                    user to map volume access to\n                                    Defaults to serivceaccount user\n                                  type: string\n                                volume:\n                                  description: volume is a string that references\n                                    an already created Quobyte volume by name.\n                                  type: string\n                              required:\n                              - registry\n                              - volume\n                              type: object\n                            rbd:\n                              description: |-\n                                rbd represents a Rados Block Device mount on the host that shares a pod's lifetime.\n                                More info: https://examples.k8s.io/volumes/rbd/README.md\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type of the volume that you want to mount.\n                                    Tip: Ensure that the filesystem type is supported by the host operating system.\n                                    Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd\n                                    TODO: how do we prevent errors in the filesystem from compromising the machine\n                                  type: string\n                                image:\n                                  description: |-\n                                    image is the rados image name.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: string\n                                keyring:\n                                  description: |-\n                                    keyring is the path to key ring for RBDUser.\n                                    Default is /etc/ceph/keyring.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: string\n                                monitors:\n                                  description: |-\n                                    monitors is a collection of Ceph monitors.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  items:\n                                    type: string\n                                  type: array\n                                pool:\n                                  description: |-\n                                    pool is the rados pool name.\n                                    Default is rbd.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly here will force the ReadOnly setting in VolumeMounts.\n                                    Defaults to false.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef is name of the authentication secret for RBDUser. If provided\n                                    overrides keyring.\n                                    Default is nil.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                user:\n                                  description: |-\n                                    user is the rados user name.\n                                    Default is admin.\n                                    More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it\n                                  type: string\n                              required:\n                              - image\n                              - monitors\n                              type: object\n                            scaleIO:\n                              description: scaleIO represents a ScaleIO persistent\n                                volume attached and mounted on Kubernetes nodes.\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\".\n                                    Default is \"xfs\".\n                                  type: string\n                                gateway:\n                                  description: gateway is the host address of the\n                                    ScaleIO API Gateway.\n                                  type: string\n                                protectionDomain:\n                                  description: protectionDomain is the name of the\n                                    ScaleIO Protection Domain for the configured storage.\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly Defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef references to the secret for ScaleIO user and other\n                                    sensitive information. If this is not provided, Login operation will fail.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                sslEnabled:\n                                  description: sslEnabled Flag enable/disable SSL\n                                    communication with Gateway, default false\n                                  type: boolean\n                                storageMode:\n                                  description: |-\n                                    storageMode indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.\n                                    Default is ThinProvisioned.\n                                  type: string\n                                storagePool:\n                                  description: storagePool is the ScaleIO Storage\n                                    Pool associated with the protection domain.\n                                  type: string\n                                system:\n                                  description: system is the name of the storage system\n                                    as configured in ScaleIO.\n                                  type: string\n                                volumeName:\n                                  description: |-\n                                    volumeName is the name of a volume already created in the ScaleIO system\n                                    that is associated with this volume source.\n                                  type: string\n                              required:\n                              - gateway\n                              - secretRef\n                              - system\n                              type: object\n                            secret:\n                              description: |-\n                                secret represents a secret that should populate this volume.\n                                More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                              properties:\n                                defaultMode:\n                                  description: |-\n                                    defaultMode is Optional: mode bits used to set permissions on created files by default.\n                                    Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                    YAML accepts both octal and decimal values, JSON requires decimal values\n                                    for mode bits. Defaults to 0644.\n                                    Directories within the path are not affected by this setting.\n                                    This might be in conflict with other options that affect the file\n                                    mode, like fsGroup, and the result can be other mode bits set.\n                                  format: int32\n                                  type: integer\n                                items:\n                                  description: |-\n                                    items If unspecified, each key-value pair in the Data field of the referenced\n                                    Secret will be projected into the volume as a file whose name is the\n                                    key and content is the value. If specified, the listed keys will be\n                                    projected into the specified paths, and unlisted keys will not be\n                                    present. If a key is specified which is not present in the Secret,\n                                    the volume setup will error unless it is marked optional. Paths must be\n                                    relative and may not contain the '..' path or start with '..'.\n                                  items:\n                                    description: Maps a string key to a path within\n                                      a volume.\n                                    properties:\n                                      key:\n                                        description: key is the key to project.\n                                        type: string\n                                      mode:\n                                        description: |-\n                                          mode is Optional: mode bits used to set permissions on this file.\n                                          Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511.\n                                          YAML accepts both octal and decimal values, JSON requires decimal values for mode bits.\n                                          If not specified, the volume defaultMode will be used.\n                                          This might be in conflict with other options that affect the file\n                                          mode, like fsGroup, and the result can be other mode bits set.\n                                        format: int32\n                                        type: integer\n                                      path:\n                                        description: |-\n                                          path is the relative path of the file to map the key to.\n                                          May not be an absolute path.\n                                          May not contain the path element '..'.\n                                          May not start with the string '..'.\n                                        type: string\n                                    required:\n                                    - key\n                                    - path\n                                    type: object\n                                  type: array\n                                optional:\n                                  description: optional field specify whether the\n                                    Secret or its keys must be defined\n                                  type: boolean\n                                secretName:\n                                  description: |-\n                                    secretName is the name of the secret in the pod's namespace to use.\n                                    More info: https://kubernetes.io/docs/concepts/storage/volumes#secret\n                                  type: string\n                              type: object\n                            storageos:\n                              description: storageOS represents a StorageOS volume\n                                attached and mounted on Kubernetes nodes.\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is the filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                readOnly:\n                                  description: |-\n                                    readOnly defaults to false (read/write). ReadOnly here will force\n                                    the ReadOnly setting in VolumeMounts.\n                                  type: boolean\n                                secretRef:\n                                  description: |-\n                                    secretRef specifies the secret to use for obtaining the StorageOS API\n                                    credentials.  If not specified, default values will be attempted.\n                                  properties:\n                                    name:\n                                      description: |-\n                                        Name of the referent.\n                                        More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                                        TODO: Add other useful fields. apiVersion, kind, uid?\n                                      type: string\n                                  type: object\n                                  x-kubernetes-map-type: atomic\n                                volumeName:\n                                  description: |-\n                                    volumeName is the human-readable name of the StorageOS volume.  Volume\n                                    names are only unique within a namespace.\n                                  type: string\n                                volumeNamespace:\n                                  description: |-\n                                    volumeNamespace specifies the scope of the volume within StorageOS.  If no\n                                    namespace is specified then the Pod's namespace will be used.  This allows the\n                                    Kubernetes name scoping to be mirrored within StorageOS for tighter integration.\n                                    Set VolumeName to any name to override the default behaviour.\n                                    Set to \"default\" if you are not using namespaces within StorageOS.\n                                    Namespaces that do not pre-exist within StorageOS will be created.\n                                  type: string\n                              type: object\n                            vsphereVolume:\n                              description: vsphereVolume represents a vSphere volume\n                                attached and mounted on kubelets host machine\n                              properties:\n                                fsType:\n                                  description: |-\n                                    fsType is filesystem type to mount.\n                                    Must be a filesystem type supported by the host operating system.\n                                    Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.\n                                  type: string\n                                storagePolicyID:\n                                  description: storagePolicyID is the storage Policy\n                                    Based Management (SPBM) profile ID associated\n                                    with the StoragePolicyName.\n                                  type: string\n                                storagePolicyName:\n                                  description: storagePolicyName is the storage Policy\n                                    Based Management (SPBM) profile name.\n                                  type: string\n                                volumePath:\n                                  description: volumePath is the path that identifies\n                                    vSphere volume vmdk\n                                  type: string\n                              required:\n                              - volumePath\n                              type: object\n                          required:\n                          - name\n                          type: object\n                        type: array\n                    required:\n                    - containers\n                    type: object\n                type: object\n              updateStrategy:\n                description: |-\n                  Indicates the StatefulSetUpdateStrategy that will be\n                  employed to update Pods in the InstanceSet when a revision is made to\n                  Template.\n\n\n                  Note: This field will be removed in future version.\n                properties:\n                  maxUnavailable:\n                    anyOf:\n                    - type: integer\n                    - type: string\n                    description: |-\n                      The maximum number of pods that can be unavailable during the update.\n                      Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).\n                      Absolute number is calculated from percentage by rounding up. This can not be 0.\n                      Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,\n                      it will be counted towards MaxUnavailable.\n                    x-kubernetes-int-or-string: true\n                  memberUpdateStrategy:\n                    description: |-\n                      Members(Pods) update strategy.\n\n\n                      - serial: update Members one by one that guarantee minimum component unavailable time.\n                      - bestEffortParallel: update Members in parallel that guarantee minimum component un-writable time.\n                      - parallel: force parallel\n                    enum:\n                    - Serial\n                    - BestEffortParallel\n                    - Parallel\n                    type: string\n                  partition:\n                    description: |-\n                      Partition indicates the number of pods that should be updated during a rolling update.\n                      The remaining pods will remain untouched. This is helpful in defining how many pods\n                      should participate in the update process. The update process will follow the order\n                      of pod names in descending lexicographical (dictionary) order. The default value is\n                      Replicas (i.e., update all pods).\n                    format: int32\n                    type: integer\n                type: object\n              volumeClaimTemplates:\n                description: |-\n                  Specifies a list of PersistentVolumeClaim templates that define the storage requirements for each replica.\n                  Each template specifies the desired characteristics of a persistent volume, such as storage class,\n                  size, and access modes.\n                  These templates are used to dynamically provision persistent volumes for replicas upon their creation.\n                  The final name of each PVC is generated by appending the pod's identifier to the name specified in volumeClaimTemplates[*].name.\n                items:\n                  description: PersistentVolumeClaim is a user's request for and claim\n                    to a persistent volume\n                  properties:\n                    apiVersion:\n                      description: |-\n                        APIVersion defines the versioned schema of this representation of an object.\n                        Servers should convert recognized schemas to the latest internal value, and\n                        may reject unrecognized values.\n                        More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n                      type: string\n                    kind:\n                      description: |-\n                        Kind is a string value representing the REST resource this object represents.\n                        Servers may infer this from the endpoint the client submits requests to.\n                        Cannot be updated.\n                        In CamelCase.\n                        More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                      type: string\n                    metadata:\n                      description: |-\n                        Standard object's metadata.\n                        More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata\n                      properties:\n                        annotations:\n                          additionalProperties:\n                            type: string\n                          type: object\n                        finalizers:\n                          items:\n                            type: string\n                          type: array\n                        labels:\n                          additionalProperties:\n                            type: string\n                          type: object\n                        name:\n                          type: string\n                        namespace:\n                          type: string\n                      type: object\n                    spec:\n                      description: |-\n                        spec defines the desired characteristics of a volume requested by a pod author.\n                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                      properties:\n                        accessModes:\n                          description: |-\n                            accessModes contains the desired access modes the volume should have.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                          items:\n                            type: string\n                          type: array\n                        dataSource:\n                          description: |-\n                            dataSource field can be used to specify either:\n                            * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n                            * An existing PVC (PersistentVolumeClaim)\n                            If the provisioner or an external controller can support the specified data source,\n                            it will create a new volume based on the contents of the specified data source.\n                            When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\n                            and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\n                            If the namespace is specified, then dataSourceRef will not be copied to dataSource.\n                          properties:\n                            apiGroup:\n                              description: |-\n                                APIGroup is the group for the resource being referenced.\n                                If APIGroup is not specified, the specified Kind must be in the core API group.\n                                For any other third-party types, APIGroup is required.\n                              type: string\n                            kind:\n                              description: Kind is the type of resource being referenced\n                              type: string\n                            name:\n                              description: Name is the name of resource being referenced\n                              type: string\n                          required:\n                          - kind\n                          - name\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        dataSourceRef:\n                          description: |-\n                            dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\n                            volume is desired. This may be any object from a non-empty API group (non\n                            core object) or a PersistentVolumeClaim object.\n                            When this field is specified, volume binding will only succeed if the type of\n                            the specified object matches some installed volume populator or dynamic\n                            provisioner.\n                            This field will replace the functionality of the dataSource field and as such\n                            if both fields are non-empty, they must have the same value. For backwards\n                            compatibility, when namespace isn't specified in dataSourceRef,\n                            both fields (dataSource and dataSourceRef) will be set to the same\n                            value automatically if one of them is empty and the other is non-empty.\n                            When namespace is specified in dataSourceRef,\n                            dataSource isn't set to the same value and must be empty.\n                            There are three important differences between dataSource and dataSourceRef:\n                            * While dataSource only allows two specific types of objects, dataSourceRef\n                              allows any non-core object, as well as PersistentVolumeClaim objects.\n                            * While dataSource ignores disallowed values (dropping them), dataSourceRef\n                              preserves all values, and generates an error if a disallowed value is\n                              specified.\n                            * While dataSource only allows local objects, dataSourceRef allows objects\n                              in any namespaces.\n                            (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n                            (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                          properties:\n                            apiGroup:\n                              description: |-\n                                APIGroup is the group for the resource being referenced.\n                                If APIGroup is not specified, the specified Kind must be in the core API group.\n                                For any other third-party types, APIGroup is required.\n                              type: string\n                            kind:\n                              description: Kind is the type of resource being referenced\n                              type: string\n                            name:\n                              description: Name is the name of resource being referenced\n                              type: string\n                            namespace:\n                              description: |-\n                                Namespace is the namespace of resource being referenced\n                                Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n                                (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n                              type: string\n                          required:\n                          - kind\n                          - name\n                          type: object\n                        resources:\n                          description: |-\n                            resources represents the minimum resources the volume should have.\n                            If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\n                            that are lower than previous value but must still be higher than capacity recorded in the\n                            status field of the claim.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n                          properties:\n                            limits:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Limits describes the maximum amount of compute resources allowed.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                            requests:\n                              additionalProperties:\n                                anyOf:\n                                - type: integer\n                                - type: string\n                                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                                x-kubernetes-int-or-string: true\n                              description: |-\n                                Requests describes the minimum amount of compute resources required.\n                                If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\n                                otherwise to an implementation-defined value. Requests cannot exceed Limits.\n                                More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n                              type: object\n                          type: object\n                        selector:\n                          description: selector is a label query over volumes to consider\n                            for binding.\n                          properties:\n                            matchExpressions:\n                              description: matchExpressions is a list of label selector\n                                requirements. The requirements are ANDed.\n                              items:\n                                description: |-\n                                  A label selector requirement is a selector that contains values, a key, and an operator that\n                                  relates the key and values.\n                                properties:\n                                  key:\n                                    description: key is the label key that the selector\n                                      applies to.\n                                    type: string\n                                  operator:\n                                    description: |-\n                                      operator represents a key's relationship to a set of values.\n                                      Valid operators are In, NotIn, Exists and DoesNotExist.\n                                    type: string\n                                  values:\n                                    description: |-\n                                      values is an array of string values. If the operator is In or NotIn,\n                                      the values array must be non-empty. If the operator is Exists or DoesNotExist,\n                                      the values array must be empty. This array is replaced during a strategic\n                                      merge patch.\n                                    items:\n                                      type: string\n                                    type: array\n                                required:\n                                - key\n                                - operator\n                                type: object\n                              type: array\n                            matchLabels:\n                              additionalProperties:\n                                type: string\n                              description: |-\n                                matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\n                                map is equivalent to an element of matchExpressions, whose key field is \"key\", the\n                                operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.\n                              type: object\n                          type: object\n                          x-kubernetes-map-type: atomic\n                        storageClassName:\n                          description: |-\n                            storageClassName is the name of the StorageClass required by the claim.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1\n                          type: string\n                        volumeAttributesClassName:\n                          description: |-\n                            volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\n                            If specified, the CSI driver will create or update the volume with the attributes defined\n                            in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\n                            it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\n                            will be applied to the claim but it's not allowed to reset this field to empty string once it is set.\n                            If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\n                            will be set by the persistentvolume controller if it exists.\n                            If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\n                            set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\n                            exists.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n                            (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n                          type: string\n                        volumeMode:\n                          description: |-\n                            volumeMode defines what type of volume is required by the claim.\n                            Value of Filesystem is implied when not included in claim spec.\n                          type: string\n                        volumeName:\n                          description: volumeName is the binding reference to the\n                            PersistentVolume backing this claim.\n                          type: string\n                      type: object\n                    status:\n                      description: |-\n                        status represents the current information/status of a persistent volume claim.\n                        Read-only.\n                        More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims\n                      properties:\n                        accessModes:\n                          description: |-\n                            accessModes contains the actual access modes the volume backing the PVC has.\n                            More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1\n                          items:\n                            type: string\n                          type: array\n                        allocatedResourceStatuses:\n                          additionalProperties:\n                            description: |-\n                              When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource\n                              that it does not recognizes, then it should ignore that update and let other controllers\n                              handle it.\n                            type: string\n                          description: \"allocatedResourceStatuses stores status of\n                            resource being resized for the given PVC.\\nKey names follow\n                            standard Kubernetes label syntax. Valid values are either:\\n\\t*\n                            Un-prefixed keys:\\n\\t\\t- storage - the capacity of the\n                            volume.\\n\\t* Custom resources must use implementation-defined\n                            prefixed names such as \\\"example.com/my-custom-resource\\\"\\nApart\n                            from above values - keys that are unprefixed or have kubernetes.io\n                            prefix are considered\\nreserved and hence may not be used.\\n\\n\\nClaimResourceStatus\n                            can be in any of following states:\\n\\t- ControllerResizeInProgress:\\n\\t\\tState\n                            set when resize controller starts resizing the volume\n                            in control-plane.\\n\\t- ControllerResizeFailed:\\n\\t\\tState\n                            set when resize has failed in resize controller with a\n                            terminal error.\\n\\t- NodeResizePending:\\n\\t\\tState set\n                            when resize controller has finished resizing the volume\n                            but further resizing of\\n\\t\\tvolume is needed on the node.\\n\\t-\n                            NodeResizeInProgress:\\n\\t\\tState set when kubelet starts\n                            resizing the volume.\\n\\t- NodeResizeFailed:\\n\\t\\tState\n                            set when resizing has failed in kubelet with a terminal\n                            error. Transient errors don't set\\n\\t\\tNodeResizeFailed.\\nFor\n                            example: if expanding a PVC for more capacity - this field\n                            can be one of the following states:\\n\\t- pvc.status.allocatedResourceStatus['storage']\n                            = \\\"ControllerResizeInProgress\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                            = \\\"ControllerResizeFailed\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                            = \\\"NodeResizePending\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                            = \\\"NodeResizeInProgress\\\"\\n     - pvc.status.allocatedResourceStatus['storage']\n                            = \\\"NodeResizeFailed\\\"\\nWhen this field is not set, it\n                            means that no resize operation is in progress for the\n                            given PVC.\\n\\n\\nA controller that receives PVC update\n                            with previously unknown resourceName or ClaimResourceStatus\\nshould\n                            ignore the update for the purpose it was designed. For\n                            example - a controller that\\nonly is responsible for resizing\n                            capacity of the volume, should ignore PVC updates that\n                            change other valid\\nresources associated with PVC.\\n\\n\\nThis\n                            is an alpha field and requires enabling RecoverVolumeExpansionFailure\n                            feature.\"\n                          type: object\n                          x-kubernetes-map-type: granular\n                        allocatedResources:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: \"allocatedResources tracks the resources allocated\n                            to a PVC including its capacity.\\nKey names follow standard\n                            Kubernetes label syntax. Valid values are either:\\n\\t*\n                            Un-prefixed keys:\\n\\t\\t- storage - the capacity of the\n                            volume.\\n\\t* Custom resources must use implementation-defined\n                            prefixed names such as \\\"example.com/my-custom-resource\\\"\\nApart\n                            from above values - keys that are unprefixed or have kubernetes.io\n                            prefix are considered\\nreserved and hence may not be used.\\n\\n\\nCapacity\n                            reported here may be larger than the actual capacity when\n                            a volume expansion operation\\nis requested.\\nFor storage\n                            quota, the larger value from allocatedResources and PVC.spec.resources\n                            is used.\\nIf allocatedResources is not set, PVC.spec.resources\n                            alone is used for quota calculation.\\nIf a volume expansion\n                            capacity request is lowered, allocatedResources is only\\nlowered\n                            if there are no expansion operations in progress and if\n                            the actual volume capacity\\nis equal or lower than the\n                            requested capacity.\\n\\n\\nA controller that receives PVC\n                            update with previously unknown resourceName\\nshould ignore\n                            the update for the purpose it was designed. For example\n                            - a controller that\\nonly is responsible for resizing\n                            capacity of the volume, should ignore PVC updates that\n                            change other valid\\nresources associated with PVC.\\n\\n\\nThis\n                            is an alpha field and requires enabling RecoverVolumeExpansionFailure\n                            feature.\"\n                          type: object\n                        capacity:\n                          additionalProperties:\n                            anyOf:\n                            - type: integer\n                            - type: string\n                            pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                            x-kubernetes-int-or-string: true\n                          description: capacity represents the actual resources of\n                            the underlying volume.\n                          type: object\n                        conditions:\n                          description: |-\n                            conditions is the current Condition of persistent volume claim. If underlying persistent volume is being\n                            resized then the Condition will be set to 'ResizeStarted'.\n                          items:\n                            description: PersistentVolumeClaimCondition contains details\n                              about state of pvc\n                            properties:\n                              lastProbeTime:\n                                description: lastProbeTime is the time we probed the\n                                  condition.\n                                format: date-time\n                                type: string\n                              lastTransitionTime:\n                                description: lastTransitionTime is the time the condition\n                                  transitioned from one status to another.\n                                format: date-time\n                                type: string\n                              message:\n                                description: message is the human-readable message\n                                  indicating details about last transition.\n                                type: string\n                              reason:\n                                description: |-\n                                  reason is a unique, this should be a short, machine understandable string that gives the reason\n                                  for condition's last transition. If it reports \"ResizeStarted\" that means the underlying\n                                  persistent volume is being resized.\n                                type: string\n                              status:\n                                type: string\n                              type:\n                                description: PersistentVolumeClaimConditionType is\n                                  a valid value of PersistentVolumeClaimCondition.Type\n                                type: string\n                            required:\n                            - status\n                            - type\n                            type: object\n                          type: array\n                        currentVolumeAttributesClassName:\n                          description: |-\n                            currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using.\n                            When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim\n                            This is an alpha field and requires enabling VolumeAttributesClass feature.\n                          type: string\n                        modifyVolumeStatus:\n                          description: |-\n                            ModifyVolumeStatus represents the status object of ControllerModifyVolume operation.\n                            When this is unset, there is no ModifyVolume operation being attempted.\n                            This is an alpha field and requires enabling VolumeAttributesClass feature.\n                          properties:\n                            status:\n                              description: \"status is the status of the ControllerModifyVolume\n                                operation. It can be in any of following states:\\n\n                                - Pending\\n   Pending indicates that the PersistentVolumeClaim\n                                cannot be modified due to unmet requirements, such\n                                as\\n   the specified VolumeAttributesClass not existing.\\n\n                                - InProgress\\n   InProgress indicates that the volume\n                                is being modified.\\n - Infeasible\\n  Infeasible indicates\n                                that the request has been rejected as invalid by the\n                                CSI driver. To\\n\\t  resolve the error, a valid VolumeAttributesClass\n                                needs to be specified.\\nNote: New statuses can be\n                                added in the future. Consumers should check for unknown\n                                statuses and fail appropriately.\"\n                              type: string\n                            targetVolumeAttributesClassName:\n                              description: targetVolumeAttributesClassName is the\n                                name of the VolumeAttributesClass the PVC currently\n                                being reconciled\n                              type: string\n                          required:\n                          - status\n                          type: object\n                        phase:\n                          description: phase represents the current phase of PersistentVolumeClaim.\n                          type: string\n                      type: object\n                  type: object\n                type: array\n            required:\n            - selector\n            - template\n            type: object\n          status:\n            description: Represents the current information about the state machine.\n              This data may be out of date.\n            properties:\n              availableReplicas:\n                description: Total number of available instances (ready for at least\n                  minReadySeconds) targeted by this InstanceSet.\n                format: int32\n                type: integer\n              conditions:\n                description: |-\n                  Represents the latest available observations of an instanceset's current state.\n                  Known .status.conditions.type are: \"InstanceFailure\", \"InstanceReady\"\n                items:\n                  description: \"Condition contains details for one aspect of the current\n                    state of this API Resource.\\n---\\nThis struct is intended for\n                    direct use as an array at the field path .status.conditions.  For\n                    example,\\n\\n\\n\\ttype FooStatus struct{\\n\\t    // Represents the\n                    observations of a foo's current state.\\n\\t    // Known .status.conditions.type\n                    are: \\\"Available\\\", \\\"Progressing\\\", and \\\"Degraded\\\"\\n\\t    //\n                    +patchMergeKey=type\\n\\t    // +patchStrategy=merge\\n\\t    // +listType=map\\n\\t\n                    \\   // +listMapKey=type\\n\\t    Conditions []metav1.Condition `json:\\\"conditions,omitempty\\\"\n                    patchStrategy:\\\"merge\\\" patchMergeKey:\\\"type\\\" protobuf:\\\"bytes,1,rep,name=conditions\\\"`\\n\\n\\n\\t\n                    \\   // other fields\\n\\t}\"\n                  properties:\n                    lastTransitionTime:\n                      description: |-\n                        lastTransitionTime is the last time the condition transitioned from one status to another.\n                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\n                      format: date-time\n                      type: string\n                    message:\n                      description: |-\n                        message is a human readable message indicating details about the transition.\n                        This may be an empty string.\n                      maxLength: 32768\n                      type: string\n                    observedGeneration:\n                      description: |-\n                        observedGeneration represents the .metadata.generation that the condition was set based upon.\n                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\n                        with respect to the current state of the instance.\n                      format: int64\n                      minimum: 0\n                      type: integer\n                    reason:\n                      description: |-\n                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\n                        Producers of specific condition types may define expected values and meanings for this field,\n                        and whether the values are considered a guaranteed API.\n                        The value should be a CamelCase string.\n                        This field may not be empty.\n                      maxLength: 1024\n                      minLength: 1\n                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\n                      type: string\n                    status:\n                      description: status of the condition, one of True, False, Unknown.\n                      enum:\n                      - \"True\"\n                      - \"False\"\n                      - Unknown\n                      type: string\n                    type:\n                      description: |-\n                        type of condition in CamelCase or in foo.example.com/CamelCase.\n                        ---\n                        Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be\n                        useful (see .node.status.conditions), the ability to deconflict is important.\n                        The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)\n                      maxLength: 316\n                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\n                      type: string\n                  required:\n                  - lastTransitionTime\n                  - message\n                  - reason\n                  - status\n                  - type\n                  type: object\n                type: array\n                x-kubernetes-list-map-keys:\n                - type\n                x-kubernetes-list-type: map\n              currentReplicas:\n                description: |-\n                  currentReplicas is the number of instances created by the InstanceSet controller from the InstanceSet version\n                  indicated by CurrentRevisions.\n                format: int32\n                type: integer\n              currentRevision:\n                description: |-\n                  currentRevision, if not empty, indicates the version of the InstanceSet used to generate instances in the\n                  sequence [0,currentReplicas).\n                type: string\n              currentRevisions:\n                additionalProperties:\n                  type: string\n                description: |-\n                  currentRevisions, if not empty, indicates the old version of the InstanceSet used to generate the underlying workload.\n                  key is the pod name, value is the revision.\n                type: object\n              initReplicas:\n                description: |-\n                  Defines the initial number of instances when the cluster is first initialized.\n                  This value is set to spec.Replicas at the time of object creation and remains constant thereafter.\n                  Used only when spec.roles set.\n                format: int32\n                type: integer\n              membersStatus:\n                description: Provides the status of each member in the cluster.\n                items:\n                  properties:\n                    podName:\n                      default: Unknown\n                      description: Represents the name of the pod.\n                      type: string\n                    role:\n                      description: Defines the role of the replica in the cluster.\n                      properties:\n                        accessMode:\n                          default: ReadWrite\n                          description: Specifies the service capabilities of this\n                            member.\n                          enum:\n                          - None\n                          - Readonly\n                          - ReadWrite\n                          type: string\n                        canVote:\n                          default: true\n                          description: Indicates if this member has voting rights.\n                          type: boolean\n                        isLeader:\n                          default: false\n                          description: Determines if this member is the leader.\n                          type: boolean\n                        name:\n                          default: leader\n                          description: Defines the role name of the replica.\n                          type: string\n                      required:\n                      - accessMode\n                      - name\n                      type: object\n                  required:\n                  - podName\n                  type: object\n                type: array\n              observedGeneration:\n                description: |-\n                  observedGeneration is the most recent generation observed for this InstanceSet. It corresponds to the\n                  InstanceSet's generation, which is updated on mutation by the API Server.\n                format: int64\n                type: integer\n              readyInitReplicas:\n                description: |-\n                  Represents the number of instances that have already reached the MembersStatus during the cluster initialization stage.\n                  This value remains constant once it equals InitReplicas.\n                  Used only when spec.roles set.\n                format: int32\n                type: integer\n              readyReplicas:\n                description: readyReplicas is the number of instances created for\n                  this InstanceSet with a Ready Condition.\n                format: int32\n                type: integer\n              readyWithoutPrimary:\n                description: Indicates whether it is required for the InstanceSet\n                  to have at least one primary instance ready.\n                type: boolean\n              replicas:\n                description: replicas is the number of instances created by the InstanceSet\n                  controller.\n                format: int32\n                type: integer\n              templatesStatus:\n                description: TemplatesStatus represents status of each instance generated\n                  by InstanceTemplates\n                items:\n                  description: InstanceTemplateStatus aggregates the status of replicas\n                    for each InstanceTemplate\n                  properties:\n                    availableReplicas:\n                      description: AvailableReplicas is the number of Pods that ready\n                        for at least minReadySeconds.\n                      format: int32\n                      type: integer\n                    currentReplicas:\n                      description: |-\n                        currentReplicas is the number of instances created by the InstanceSet controller from the InstanceSet version\n                        indicated by CurrentRevisions.\n                      format: int32\n                      type: integer\n                    name:\n                      description: Name, the name of the InstanceTemplate.\n                      type: string\n                    readyReplicas:\n                      description: ReadyReplicas is the number of Pods that have a\n                        Ready Condition.\n                      format: int32\n                      type: integer\n                    replicas:\n                      description: Replicas is the number of replicas of the InstanceTemplate.\n                      format: int32\n                      type: integer\n                    updatedReplicas:\n                      description: |-\n                        UpdatedReplicas is the number of Pods created by the InstanceSet controller from the InstanceSet version\n                        indicated by UpdateRevisions.\n                      format: int32\n                      type: integer\n                  required:\n                  - name\n                  type: object\n                type: array\n              updateRevision:\n                description: |-\n                  updateRevision, if not empty, indicates the version of the InstanceSet used to generate instances in the sequence\n                  [replicas-updatedReplicas,replicas)\n                type: string\n              updateRevisions:\n                additionalProperties:\n                  type: string\n                description: |-\n                  updateRevisions, if not empty, indicates the new version of the InstanceSet used to generate the underlying workload.\n                  key is the pod name, value is the revision.\n                type: object\n              updatedReplicas:\n                description: |-\n                  updatedReplicas is the number of instances created by the InstanceSet controller from the InstanceSet version\n                  indicated by UpdateRevisions.\n                format: int32\n                type: integer\n            required:\n            - replicas\n            type: object\n        type: object\n    served: true\n    storage: false\n    subresources:\n      scale:\n        specReplicasPath: .spec.replicas\n        statusReplicasPath: .status.replicas\n      status: {}\n"
  },
  {
    "path": "roles/cluster-addon/files/snapshot.storage.k8s.io_volumesnapshotclasses.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    api-approved.kubernetes.io: \"https://github.com/kubernetes-csi/external-snapshotter/pull/814\"\n    controller-gen.kubebuilder.io/version: v0.15.0\n  name: volumesnapshotclasses.snapshot.storage.k8s.io\nspec:\n  group: snapshot.storage.k8s.io\n  names:\n    kind: VolumeSnapshotClass\n    listKind: VolumeSnapshotClassList\n    plural: volumesnapshotclasses\n    shortNames:\n    - vsclass\n    - vsclasses\n    singular: volumesnapshotclass\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - jsonPath: .driver\n      name: Driver\n      type: string\n    - description: Determines whether a VolumeSnapshotContent created through the\n        VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted.\n      jsonPath: .deletionPolicy\n      name: DeletionPolicy\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          VolumeSnapshotClass specifies parameters that a underlying storage system uses when\n          creating a volume snapshot. A specific VolumeSnapshotClass is used by specifying its\n          name in a VolumeSnapshot object.\n          VolumeSnapshotClasses are non-namespaced\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          deletionPolicy:\n            description: |-\n              deletionPolicy determines whether a VolumeSnapshotContent created through\n              the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted.\n              Supported values are \"Retain\" and \"Delete\".\n              \"Retain\" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept.\n              \"Delete\" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted.\n              Required.\n            enum:\n            - Delete\n            - Retain\n            type: string\n          driver:\n            description: |-\n              driver is the name of the storage driver that handles this VolumeSnapshotClass.\n              Required.\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          parameters:\n            additionalProperties:\n              type: string\n            description: |-\n              parameters is a key-value map with storage driver specific parameters for creating snapshots.\n              These values are opaque to Kubernetes.\n            type: object\n        required:\n        - deletionPolicy\n        - driver\n        type: object\n    served: true\n    storage: true\n    subresources: {}\n  - additionalPrinterColumns:\n    - jsonPath: .driver\n      name: Driver\n      type: string\n    - description: Determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted.\n      jsonPath: .deletionPolicy\n      name: DeletionPolicy\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1beta1\n    # This indicates the v1beta1 version of the custom resource is deprecated.\n    # API requests to this version receive a warning in the server response.\n    deprecated: true\n    # This overrides the default warning returned to clients making v1beta1 API requests.\n    deprecationWarning: \"snapshot.storage.k8s.io/v1beta1 VolumeSnapshotClass is deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshotClass\"\n    schema:\n      openAPIV3Schema:\n        description: VolumeSnapshotClass specifies parameters that a underlying storage system uses when creating a volume snapshot. A specific VolumeSnapshotClass is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses are non-namespaced\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          deletionPolicy:\n            description: deletionPolicy determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. Supported values are \"Retain\" and \"Delete\". \"Retain\" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. \"Delete\" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. Required.\n            enum:\n            - Delete\n            - Retain\n            type: string\n          driver:\n            description: driver is the name of the storage driver that handles this VolumeSnapshotClass. Required.\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          parameters:\n            additionalProperties:\n              type: string\n            description: parameters is a key-value map with storage driver specific parameters for creating snapshots. These values are opaque to Kubernetes.\n            type: object\n        required:\n        - deletionPolicy\n        - driver\n        type: object\n    served: false\n    storage: false\n    subresources: {}\nstatus:\n  acceptedNames:\n    kind: \"\"\n    plural: \"\"\n  conditions: []\n  storedVersions: []\n"
  },
  {
    "path": "roles/cluster-addon/files/snapshot.storage.k8s.io_volumesnapshotcontents.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.15.0\n    api-approved.kubernetes.io: \"https://github.com/kubernetes-csi/external-snapshotter/pull/955\"\n  name: volumesnapshotcontents.snapshot.storage.k8s.io\nspec:\n  group: snapshot.storage.k8s.io\n  names:\n    kind: VolumeSnapshotContent\n    listKind: VolumeSnapshotContentList\n    plural: volumesnapshotcontents\n    shortNames:\n    - vsc\n    - vscs\n    singular: volumesnapshotcontent\n  scope: Cluster\n  versions:\n  - additionalPrinterColumns:\n    - description: Indicates if the snapshot is ready to be used to restore a volume.\n      jsonPath: .status.readyToUse\n      name: ReadyToUse\n      type: boolean\n    - description: Represents the complete size of the snapshot in bytes\n      jsonPath: .status.restoreSize\n      name: RestoreSize\n      type: integer\n    - description: Determines whether this VolumeSnapshotContent and its physical\n        snapshot on the underlying storage system should be deleted when its bound\n        VolumeSnapshot is deleted.\n      jsonPath: .spec.deletionPolicy\n      name: DeletionPolicy\n      type: string\n    - description: Name of the CSI driver used to create the physical snapshot on\n        the underlying storage system.\n      jsonPath: .spec.driver\n      name: Driver\n      type: string\n    - description: Name of the VolumeSnapshotClass to which this snapshot belongs.\n      jsonPath: .spec.volumeSnapshotClassName\n      name: VolumeSnapshotClass\n      type: string\n    - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent\n        object is bound.\n      jsonPath: .spec.volumeSnapshotRef.name\n      name: VolumeSnapshot\n      type: string\n    - description: Namespace of the VolumeSnapshot object to which this VolumeSnapshotContent\n        object is bound.\n      jsonPath: .spec.volumeSnapshotRef.namespace\n      name: VolumeSnapshotNamespace\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          VolumeSnapshotContent represents the actual \"on-disk\" snapshot object in the\n          underlying storage system\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: |-\n              spec defines properties of a VolumeSnapshotContent created by the underlying storage system.\n              Required.\n            properties:\n              deletionPolicy:\n                description: |-\n                  deletionPolicy determines whether this VolumeSnapshotContent and its physical snapshot on\n                  the underlying storage system should be deleted when its bound VolumeSnapshot is deleted.\n                  Supported values are \"Retain\" and \"Delete\".\n                  \"Retain\" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept.\n                  \"Delete\" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted.\n                  For dynamically provisioned snapshots, this field will automatically be filled in by the\n                  CSI snapshotter sidecar with the \"DeletionPolicy\" field defined in the corresponding\n                  VolumeSnapshotClass.\n                  For pre-existing snapshots, users MUST specify this field when creating the\n                   VolumeSnapshotContent object.\n                  Required.\n                enum:\n                - Delete\n                - Retain\n                type: string\n              driver:\n                description: |-\n                  driver is the name of the CSI driver used to create the physical snapshot on\n                  the underlying storage system.\n                  This MUST be the same as the name returned by the CSI GetPluginName() call for\n                  that driver.\n                  Required.\n                type: string\n              source:\n                description: |-\n                  source specifies whether the snapshot is (or should be) dynamically provisioned\n                  or already exists, and just requires a Kubernetes object representation.\n                  This field is immutable after creation.\n                  Required.\n                properties:\n                  snapshotHandle:\n                    description: |-\n                      snapshotHandle specifies the CSI \"snapshot_id\" of a pre-existing snapshot on\n                      the underlying storage system for which a Kubernetes object representation\n                      was (or should be) created.\n                      This field is immutable.\n                    type: string\n                    x-kubernetes-validations:\n                    - message: snapshotHandle is immutable\n                      rule: self == oldSelf\n                  volumeHandle:\n                    description: |-\n                      volumeHandle specifies the CSI \"volume_id\" of the volume from which a snapshot\n                      should be dynamically taken from.\n                      This field is immutable.\n                    type: string\n                    x-kubernetes-validations:\n                    - message: volumeHandle is immutable\n                      rule: self == oldSelf\n                type: object\n                x-kubernetes-validations:\n                - message: volumeHandle is required once set\n                  rule: '!has(oldSelf.volumeHandle) || has(self.volumeHandle)'\n                - message: snapshotHandle is required once set\n                  rule: '!has(oldSelf.snapshotHandle) || has(self.snapshotHandle)'\n                - message: exactly one of volumeHandle and snapshotHandle must be\n                    set\n                  rule: (has(self.volumeHandle) && !has(self.snapshotHandle)) || (!has(self.volumeHandle)\n                    && has(self.snapshotHandle))\n              sourceVolumeMode:\n                description: |-\n                  SourceVolumeMode is the mode of the volume whose snapshot is taken.\n                  Can be either “Filesystem” or “Block”.\n                  If not specified, it indicates the source volume's mode is unknown.\n                  This field is immutable.\n                  This field is an alpha field.\n                type: string\n                x-kubernetes-validations:\n                - message: sourceVolumeMode is immutable\n                  rule: self == oldSelf\n              volumeSnapshotClassName:\n                description: |-\n                  name of the VolumeSnapshotClass from which this snapshot was (or will be)\n                  created.\n                  Note that after provisioning, the VolumeSnapshotClass may be deleted or\n                  recreated with different set of values, and as such, should not be referenced\n                  post-snapshot creation.\n                type: string\n              volumeSnapshotRef:\n                description: |-\n                  volumeSnapshotRef specifies the VolumeSnapshot object to which this\n                  VolumeSnapshotContent object is bound.\n                  VolumeSnapshot.Spec.VolumeSnapshotContentName field must reference to\n                  this VolumeSnapshotContent's name for the bidirectional binding to be valid.\n                  For a pre-existing VolumeSnapshotContent object, name and namespace of the\n                  VolumeSnapshot object MUST be provided for binding to happen.\n                  This field is immutable after creation.\n                  Required.\n                properties:\n                  apiVersion:\n                    description: API version of the referent.\n                    type: string\n                  fieldPath:\n                    description: |-\n                      If referring to a piece of an object instead of an entire object, this string\n                      should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2].\n                      For example, if the object reference is to a container within a pod, this would take on a value like:\n                      \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered\n                      the event) or if no container name is specified \"spec.containers[2]\" (container with\n                      index 2 in this pod). This syntax is chosen only to have some well-defined way of\n                      referencing a part of an object.\n                      TODO: this design is not final and this field is subject to change in the future.\n                    type: string\n                  kind:\n                    description: |-\n                      Kind of the referent.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n                    type: string\n                  name:\n                    description: |-\n                      Name of the referent.\n                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n                    type: string\n                  namespace:\n                    description: |-\n                      Namespace of the referent.\n                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n                    type: string\n                  resourceVersion:\n                    description: |-\n                      Specific resourceVersion to which this reference is made, if any.\n                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency\n                    type: string\n                  uid:\n                    description: |-\n                      UID of the referent.\n                      More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids\n                    type: string\n                type: object\n                x-kubernetes-map-type: atomic\n                x-kubernetes-validations:\n                - message: both spec.volumeSnapshotRef.name and spec.volumeSnapshotRef.namespace\n                    must be set\n                  rule: has(self.name) && has(self.__namespace__)\n            required:\n            - deletionPolicy\n            - driver\n            - source\n            - volumeSnapshotRef\n            type: object\n            x-kubernetes-validations:\n            - message: sourceVolumeMode is required once set\n              rule: '!has(oldSelf.sourceVolumeMode) || has(self.sourceVolumeMode)'\n          status:\n            description: status represents the current information of a snapshot.\n            properties:\n              creationTime:\n                description: |-\n                  creationTime is the timestamp when the point-in-time snapshot is taken\n                  by the underlying storage system.\n                  In dynamic snapshot creation case, this field will be filled in by the\n                  CSI snapshotter sidecar with the \"creation_time\" value returned from CSI\n                  \"CreateSnapshot\" gRPC call.\n                  For a pre-existing snapshot, this field will be filled with the \"creation_time\"\n                  value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it.\n                  If not specified, it indicates the creation time is unknown.\n                  The format of this field is a Unix nanoseconds time encoded as an int64.\n                  On Unix, the command `date +%s%N` returns the current time in nanoseconds\n                  since 1970-01-01 00:00:00 UTC.\n                format: int64\n                type: integer\n              error:\n                description: |-\n                  error is the last observed error during snapshot creation, if any.\n                  Upon success after retry, this error field will be cleared.\n                properties:\n                  message:\n                    description: |-\n                      message is a string detailing the encountered error during snapshot\n                      creation if specified.\n                      NOTE: message may be logged, and it should not contain sensitive\n                      information.\n                    type: string\n                  time:\n                    description: time is the timestamp when the error was encountered.\n                    format: date-time\n                    type: string\n                type: object\n              readyToUse:\n                description: |-\n                  readyToUse indicates if a snapshot is ready to be used to restore a volume.\n                  In dynamic snapshot creation case, this field will be filled in by the\n                  CSI snapshotter sidecar with the \"ready_to_use\" value returned from CSI\n                  \"CreateSnapshot\" gRPC call.\n                  For a pre-existing snapshot, this field will be filled with the \"ready_to_use\"\n                  value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it,\n                  otherwise, this field will be set to \"True\".\n                  If not specified, it means the readiness of a snapshot is unknown.\n                type: boolean\n              restoreSize:\n                description: |-\n                  restoreSize represents the complete size of the snapshot in bytes.\n                  In dynamic snapshot creation case, this field will be filled in by the\n                  CSI snapshotter sidecar with the \"size_bytes\" value returned from CSI\n                  \"CreateSnapshot\" gRPC call.\n                  For a pre-existing snapshot, this field will be filled with the \"size_bytes\"\n                  value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it.\n                  When restoring a volume from this snapshot, the size of the volume MUST NOT\n                  be smaller than the restoreSize if it is specified, otherwise the restoration will fail.\n                  If not specified, it indicates that the size is unknown.\n                format: int64\n                minimum: 0\n                type: integer\n              snapshotHandle:\n                description: |-\n                  snapshotHandle is the CSI \"snapshot_id\" of a snapshot on the underlying storage system.\n                  If not specified, it indicates that dynamic snapshot creation has either failed\n                  or it is still in progress.\n                type: string\n              volumeGroupSnapshotHandle:\n                description: |-\n                  VolumeGroupSnapshotHandle is the CSI \"group_snapshot_id\" of a group snapshot\n                  on the underlying storage system.\n                type: string\n            type: object\n        required:\n        - spec\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n  - additionalPrinterColumns:\n    - description: Indicates if the snapshot is ready to be used to restore a volume.\n      jsonPath: .status.readyToUse\n      name: ReadyToUse\n      type: boolean\n    - description: Represents the complete size of the snapshot in bytes\n      jsonPath: .status.restoreSize\n      name: RestoreSize\n      type: integer\n    - description: Determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted.\n      jsonPath: .spec.deletionPolicy\n      name: DeletionPolicy\n      type: string\n    - description: Name of the CSI driver used to create the physical snapshot on the underlying storage system.\n      jsonPath: .spec.driver\n      name: Driver\n      type: string\n    - description: Name of the VolumeSnapshotClass to which this snapshot belongs.\n      jsonPath: .spec.volumeSnapshotClassName\n      name: VolumeSnapshotClass\n      type: string\n    - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent object is bound.\n      jsonPath: .spec.volumeSnapshotRef.name\n      name: VolumeSnapshot\n      type: string\n    - description: Namespace of the VolumeSnapshot object to which this VolumeSnapshotContent object is bound.\n      jsonPath: .spec.volumeSnapshotRef.namespace\n      name: VolumeSnapshotNamespace\n      type: string\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1beta1\n    # This indicates the v1beta1 version of the custom resource is deprecated.\n    # API requests to this version receive a warning in the server response.\n    deprecated: true\n    # This overrides the default warning returned to clients making v1beta1 API requests.\n    deprecationWarning: \"snapshot.storage.k8s.io/v1beta1 VolumeSnapshotContent is deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshotContent\"\n    schema:\n      openAPIV3Schema:\n        description: VolumeSnapshotContent represents the actual \"on-disk\" snapshot object in the underlying storage system\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          spec:\n            description: spec defines properties of a VolumeSnapshotContent created by the underlying storage system. Required.\n            properties:\n              deletionPolicy:\n                description: deletionPolicy determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted. Supported values are \"Retain\" and \"Delete\". \"Retain\" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. \"Delete\" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. For dynamically provisioned snapshots, this field will automatically be filled in by the CSI snapshotter sidecar with the \"DeletionPolicy\" field defined in the corresponding VolumeSnapshotClass. For pre-existing snapshots, users MUST specify this field when creating the  VolumeSnapshotContent object. Required.\n                enum:\n                - Delete\n                - Retain\n                type: string\n              driver:\n                description: driver is the name of the CSI driver used to create the physical snapshot on the underlying storage system. This MUST be the same as the name returned by the CSI GetPluginName() call for that driver. Required.\n                type: string\n              source:\n                description: source specifies whether the snapshot is (or should be) dynamically provisioned or already exists, and just requires a Kubernetes object representation. This field is immutable after creation. Required.\n                properties:\n                  snapshotHandle:\n                    description: snapshotHandle specifies the CSI \"snapshot_id\" of a pre-existing snapshot on the underlying storage system for which a Kubernetes object representation was (or should be) created. This field is immutable.\n                    type: string\n                  volumeHandle:\n                    description: volumeHandle specifies the CSI \"volume_id\" of the volume from which a snapshot should be dynamically taken from. This field is immutable.\n                    type: string\n                type: object\n              volumeSnapshotClassName:\n                description: name of the VolumeSnapshotClass from which this snapshot was (or will be) created. Note that after provisioning, the VolumeSnapshotClass may be deleted or recreated with different set of values, and as such, should not be referenced post-snapshot creation.\n                type: string\n              volumeSnapshotRef:\n                description: volumeSnapshotRef specifies the VolumeSnapshot object to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName field must reference to this VolumeSnapshotContent's name for the bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent object, name and namespace of the VolumeSnapshot object MUST be provided for binding to happen. This field is immutable after creation. Required.\n                properties:\n                  apiVersion:\n                    description: API version of the referent.\n                    type: string\n                  fieldPath:\n                    description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: \"spec.containers{name}\" (where \"name\" refers to the name of the container that triggered the event) or if no container name is specified \"spec.containers[2]\" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.'\n                    type: string\n                  kind:\n                    description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n                    type: string\n                  name:\n                    description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'\n                    type: string\n                  namespace:\n                    description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'\n                    type: string\n                  resourceVersion:\n                    description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'\n                    type: string\n                  uid:\n                    description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'\n                    type: string\n                type: object\n            required:\n            - deletionPolicy\n            - driver\n            - source\n            - volumeSnapshotRef\n            type: object\n          status:\n            description: status represents the current information of a snapshot.\n            properties:\n              creationTime:\n                description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the \"creation_time\" value returned from CSI \"CreateSnapshot\" gRPC call. For a pre-existing snapshot, this field will be filled with the \"creation_time\" value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it. If not specified, it indicates the creation time is unknown. The format of this field is a Unix nanoseconds time encoded as an int64. On Unix, the command `date +%s%N` returns the current time in nanoseconds since 1970-01-01 00:00:00 UTC.\n                format: int64\n                type: integer\n              error:\n                description: error is the last observed error during snapshot creation, if any. Upon success after retry, this error field will be cleared.\n                properties:\n                  message:\n                    description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.'\n                    type: string\n                  time:\n                    description: time is the timestamp when the error was encountered.\n                    format: date-time\n                    type: string\n                type: object\n              readyToUse:\n                description: readyToUse indicates if a snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the \"ready_to_use\" value returned from CSI \"CreateSnapshot\" gRPC call. For a pre-existing snapshot, this field will be filled with the \"ready_to_use\" value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it, otherwise, this field will be set to \"True\". If not specified, it means the readiness of a snapshot is unknown.\n                type: boolean\n              restoreSize:\n                description: restoreSize represents the complete size of the snapshot in bytes. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the \"size_bytes\" value returned from CSI \"CreateSnapshot\" gRPC call. For a pre-existing snapshot, this field will be filled with the \"size_bytes\" value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown.\n                format: int64\n                minimum: 0\n                type: integer\n              snapshotHandle:\n                description: snapshotHandle is the CSI \"snapshot_id\" of a snapshot on the underlying storage system. If not specified, it indicates that dynamic snapshot creation has either failed or it is still in progress.\n                type: string\n            type: object\n        required:\n        - spec\n        type: object\n    served: false\n    storage: false\n    subresources:\n      status: {}\nstatus:\n  acceptedNames:\n    kind: \"\"\n    plural: \"\"\n  conditions: []\n  storedVersions: []\n"
  },
  {
    "path": "roles/cluster-addon/files/snapshot.storage.k8s.io_volumesnapshots.yaml",
    "content": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  annotations:\n    controller-gen.kubebuilder.io/version: v0.15.0\n    api-approved.kubernetes.io: \"https://github.com/kubernetes-csi/external-snapshotter/pull/814\"\n  name: volumesnapshots.snapshot.storage.k8s.io\nspec:\n  group: snapshot.storage.k8s.io\n  names:\n    kind: VolumeSnapshot\n    listKind: VolumeSnapshotList\n    plural: volumesnapshots\n    shortNames:\n    - vs\n    singular: volumesnapshot\n  scope: Namespaced\n  versions:\n  - additionalPrinterColumns:\n    - description: Indicates if the snapshot is ready to be used to restore a volume.\n      jsonPath: .status.readyToUse\n      name: ReadyToUse\n      type: boolean\n    - description: If a new snapshot needs to be created, this contains the name of\n        the source PVC from which this snapshot was (or will be) created.\n      jsonPath: .spec.source.persistentVolumeClaimName\n      name: SourcePVC\n      type: string\n    - description: If a snapshot already exists, this contains the name of the existing\n        VolumeSnapshotContent object representing the existing snapshot.\n      jsonPath: .spec.source.volumeSnapshotContentName\n      name: SourceSnapshotContent\n      type: string\n    - description: Represents the minimum size of volume required to rehydrate from\n        this snapshot.\n      jsonPath: .status.restoreSize\n      name: RestoreSize\n      type: string\n    - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot.\n      jsonPath: .spec.volumeSnapshotClassName\n      name: SnapshotClass\n      type: string\n    - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot\n        object intends to bind to. Please note that verification of binding actually\n        requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure\n        both are pointing at each other. Binding MUST be verified prior to usage of\n        this object.\n      jsonPath: .status.boundVolumeSnapshotContentName\n      name: SnapshotContent\n      type: string\n    - description: Timestamp when the point-in-time snapshot was taken by the underlying\n        storage system.\n      jsonPath: .status.creationTime\n      name: CreationTime\n      type: date\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1\n    schema:\n      openAPIV3Schema:\n        description: |-\n          VolumeSnapshot is a user's request for either creating a point-in-time\n          snapshot of a persistent volume, or binding to a pre-existing snapshot.\n        properties:\n          apiVersion:\n            description: |-\n              APIVersion defines the versioned schema of this representation of an object.\n              Servers should convert recognized schemas to the latest internal value, and\n              may reject unrecognized values.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\n            type: string\n          kind:\n            description: |-\n              Kind is a string value representing the REST resource this object represents.\n              Servers may infer this from the endpoint the client submits requests to.\n              Cannot be updated.\n              In CamelCase.\n              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\n            type: string\n          metadata:\n            type: object\n          spec:\n            description: |-\n              spec defines the desired characteristics of a snapshot requested by a user.\n              More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots\n              Required.\n            properties:\n              source:\n                description: |-\n                  source specifies where a snapshot will be created from.\n                  This field is immutable after creation.\n                  Required.\n                properties:\n                  persistentVolumeClaimName:\n                    description: |-\n                      persistentVolumeClaimName specifies the name of the PersistentVolumeClaim\n                      object representing the volume from which a snapshot should be created.\n                      This PVC is assumed to be in the same namespace as the VolumeSnapshot\n                      object.\n                      This field should be set if the snapshot does not exists, and needs to be\n                      created.\n                      This field is immutable.\n                    type: string\n                    x-kubernetes-validations:\n                    - message: persistentVolumeClaimName is immutable\n                      rule: self == oldSelf\n                  volumeSnapshotContentName:\n                    description: |-\n                      volumeSnapshotContentName specifies the name of a pre-existing VolumeSnapshotContent\n                      object representing an existing volume snapshot.\n                      This field should be set if the snapshot already exists and only needs a representation in Kubernetes.\n                      This field is immutable.\n                    type: string\n                    x-kubernetes-validations:\n                    - message: volumeSnapshotContentName is immutable\n                      rule: self == oldSelf\n                type: object\n                x-kubernetes-validations:\n                - message: persistentVolumeClaimName is required once set\n                  rule: '!has(oldSelf.persistentVolumeClaimName) || has(self.persistentVolumeClaimName)'\n                - message: volumeSnapshotContentName is required once set\n                  rule: '!has(oldSelf.volumeSnapshotContentName) || has(self.volumeSnapshotContentName)'\n                - message: exactly one of volumeSnapshotContentName and persistentVolumeClaimName\n                    must be set\n                  rule: (has(self.volumeSnapshotContentName) && !has(self.persistentVolumeClaimName))\n                    || (!has(self.volumeSnapshotContentName) && has(self.persistentVolumeClaimName))\n              volumeSnapshotClassName:\n                description: |-\n                  VolumeSnapshotClassName is the name of the VolumeSnapshotClass\n                  requested by the VolumeSnapshot.\n                  VolumeSnapshotClassName may be left nil to indicate that the default\n                  SnapshotClass should be used.\n                  A given cluster may have multiple default Volume SnapshotClasses: one\n                  default per CSI Driver. If a VolumeSnapshot does not specify a SnapshotClass,\n                  VolumeSnapshotSource will be checked to figure out what the associated\n                  CSI Driver is, and the default VolumeSnapshotClass associated with that\n                  CSI Driver will be used. If more than one VolumeSnapshotClass exist for\n                  a given CSI Driver and more than one have been marked as default,\n                  CreateSnapshot will fail and generate an event.\n                  Empty string is not allowed for this field.\n                type: string\n                x-kubernetes-validations:\n                - message: volumeSnapshotClassName must not be the empty string when\n                    set\n                  rule: size(self) > 0\n            required:\n            - source\n            type: object\n          status:\n            description: |-\n              status represents the current information of a snapshot.\n              Consumers must verify binding between VolumeSnapshot and\n              VolumeSnapshotContent objects is successful (by validating that both\n              VolumeSnapshot and VolumeSnapshotContent point at each other) before\n              using this object.\n            properties:\n              boundVolumeSnapshotContentName:\n                description: |-\n                  boundVolumeSnapshotContentName is the name of the VolumeSnapshotContent\n                  object to which this VolumeSnapshot object intends to bind to.\n                  If not specified, it indicates that the VolumeSnapshot object has not been\n                  successfully bound to a VolumeSnapshotContent object yet.\n                  NOTE: To avoid possible security issues, consumers must verify binding between\n                  VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that\n                  both VolumeSnapshot and VolumeSnapshotContent point at each other) before using\n                  this object.\n                type: string\n              creationTime:\n                description: |-\n                  creationTime is the timestamp when the point-in-time snapshot is taken\n                  by the underlying storage system.\n                  In dynamic snapshot creation case, this field will be filled in by the\n                  snapshot controller with the \"creation_time\" value returned from CSI\n                  \"CreateSnapshot\" gRPC call.\n                  For a pre-existing snapshot, this field will be filled with the \"creation_time\"\n                  value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it.\n                  If not specified, it may indicate that the creation time of the snapshot is unknown.\n                format: date-time\n                type: string\n              error:\n                description: |-\n                  error is the last observed error during snapshot creation, if any.\n                  This field could be helpful to upper level controllers(i.e., application controller)\n                  to decide whether they should continue on waiting for the snapshot to be created\n                  based on the type of error reported.\n                  The snapshot controller will keep retrying when an error occurs during the\n                  snapshot creation. Upon success, this error field will be cleared.\n                properties:\n                  message:\n                    description: |-\n                      message is a string detailing the encountered error during snapshot\n                      creation if specified.\n                      NOTE: message may be logged, and it should not contain sensitive\n                      information.\n                    type: string\n                  time:\n                    description: time is the timestamp when the error was encountered.\n                    format: date-time\n                    type: string\n                type: object\n              readyToUse:\n                description: |-\n                  readyToUse indicates if the snapshot is ready to be used to restore a volume.\n                  In dynamic snapshot creation case, this field will be filled in by the\n                  snapshot controller with the \"ready_to_use\" value returned from CSI\n                  \"CreateSnapshot\" gRPC call.\n                  For a pre-existing snapshot, this field will be filled with the \"ready_to_use\"\n                  value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it,\n                  otherwise, this field will be set to \"True\".\n                  If not specified, it means the readiness of a snapshot is unknown.\n                type: boolean\n              restoreSize:\n                type: string\n                description: |-\n                  restoreSize represents the minimum size of volume required to create a volume\n                  from this snapshot.\n                  In dynamic snapshot creation case, this field will be filled in by the\n                  snapshot controller with the \"size_bytes\" value returned from CSI\n                  \"CreateSnapshot\" gRPC call.\n                  For a pre-existing snapshot, this field will be filled with the \"size_bytes\"\n                  value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it.\n                  When restoring a volume from this snapshot, the size of the volume MUST NOT\n                  be smaller than the restoreSize if it is specified, otherwise the restoration will fail.\n                  If not specified, it indicates that the size is unknown.\n                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                x-kubernetes-int-or-string: true\n              volumeGroupSnapshotName:\n                description: |-\n                  VolumeGroupSnapshotName is the name of the VolumeGroupSnapshot of which this\n                  VolumeSnapshot is a part of.\n                type: string\n            type: object\n        required:\n        - spec\n        type: object\n    served: true\n    storage: true\n    subresources:\n      status: {}\n  - additionalPrinterColumns:\n    - description: Indicates if the snapshot is ready to be used to restore a volume.\n      jsonPath: .status.readyToUse\n      name: ReadyToUse\n      type: boolean\n    - description: If a new snapshot needs to be created, this contains the name of the source PVC from which this snapshot was (or will be) created.\n      jsonPath: .spec.source.persistentVolumeClaimName\n      name: SourcePVC\n      type: string\n    - description: If a snapshot already exists, this contains the name of the existing VolumeSnapshotContent object representing the existing snapshot.\n      jsonPath: .spec.source.volumeSnapshotContentName\n      name: SourceSnapshotContent\n      type: string\n    - description: Represents the minimum size of volume required to rehydrate from this snapshot.\n      jsonPath: .status.restoreSize\n      name: RestoreSize\n      type: string\n    - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot.\n      jsonPath: .spec.volumeSnapshotClassName\n      name: SnapshotClass\n      type: string\n    - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot object intends to bind to. Please note that verification of binding actually requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure both are pointing at each other. Binding MUST be verified prior to usage of this object.\n      jsonPath: .status.boundVolumeSnapshotContentName\n      name: SnapshotContent\n      type: string\n    - description: Timestamp when the point-in-time snapshot was taken by the underlying storage system.\n      jsonPath: .status.creationTime\n      name: CreationTime\n      type: date\n    - jsonPath: .metadata.creationTimestamp\n      name: Age\n      type: date\n    name: v1beta1\n    # This indicates the v1beta1 version of the custom resource is deprecated.\n    # API requests to this version receive a warning in the server response.\n    deprecated: true\n    # This overrides the default warning returned to clients making v1beta1 API requests.\n    deprecationWarning: \"snapshot.storage.k8s.io/v1beta1 VolumeSnapshot is deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshot\"\n    schema:\n      openAPIV3Schema:\n        description: VolumeSnapshot is a user's request for either creating a point-in-time snapshot of a persistent volume, or binding to a pre-existing snapshot.\n        properties:\n          apiVersion:\n            description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'\n            type: string\n          kind:\n            description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'\n            type: string\n          spec:\n            description: 'spec defines the desired characteristics of a snapshot requested by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots Required.'\n            properties:\n              source:\n                description: source specifies where a snapshot will be created from. This field is immutable after creation. Required.\n                properties:\n                  persistentVolumeClaimName:\n                    description: persistentVolumeClaimName specifies the name of the PersistentVolumeClaim object representing the volume from which a snapshot should be created. This PVC is assumed to be in the same namespace as the VolumeSnapshot object. This field should be set if the snapshot does not exists, and needs to be created. This field is immutable.\n                    type: string\n                  volumeSnapshotContentName:\n                    description: volumeSnapshotContentName specifies the name of a pre-existing VolumeSnapshotContent object representing an existing volume snapshot. This field should be set if the snapshot already exists and only needs a representation in Kubernetes. This field is immutable.\n                    type: string\n                type: object\n              volumeSnapshotClassName:\n                description: 'VolumeSnapshotClassName is the name of the VolumeSnapshotClass requested by the VolumeSnapshot. VolumeSnapshotClassName may be left nil to indicate that the default SnapshotClass should be used. A given cluster may have multiple default Volume SnapshotClasses: one default per CSI Driver. If a VolumeSnapshot does not specify a SnapshotClass, VolumeSnapshotSource will be checked to figure out what the associated CSI Driver is, and the default VolumeSnapshotClass associated with that CSI Driver will be used. If more than one VolumeSnapshotClass exist for a given CSI Driver and more than one have been marked as default, CreateSnapshot will fail and generate an event. Empty string is not allowed for this field.'\n                type: string\n            required:\n            - source\n            type: object\n          status:\n            description: status represents the current information of a snapshot. Consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object.\n            properties:\n              boundVolumeSnapshotContentName:\n                description: 'boundVolumeSnapshotContentName is the name of the VolumeSnapshotContent object to which this VolumeSnapshot object intends to bind to. If not specified, it indicates that the VolumeSnapshot object has not been successfully bound to a VolumeSnapshotContent object yet. NOTE: To avoid possible security issues, consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object.'\n                type: string\n              creationTime:\n                description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the \"creation_time\" value returned from CSI \"CreateSnapshot\" gRPC call. For a pre-existing snapshot, this field will be filled with the \"creation_time\" value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it. If not specified, it may indicate that the creation time of the snapshot is unknown.\n                format: date-time\n                type: string\n              error:\n                description: error is the last observed error during snapshot creation, if any. This field could be helpful to upper level controllers(i.e., application controller) to decide whether they should continue on waiting for the snapshot to be created based on the type of error reported. The snapshot controller will keep retrying when an error occurs during the snapshot creation. Upon success, this error field will be cleared.\n                properties:\n                  message:\n                    description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.'\n                    type: string\n                  time:\n                    description: time is the timestamp when the error was encountered.\n                    format: date-time\n                    type: string\n                type: object\n              readyToUse:\n                description: readyToUse indicates if the snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the \"ready_to_use\" value returned from CSI \"CreateSnapshot\" gRPC call. For a pre-existing snapshot, this field will be filled with the \"ready_to_use\" value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it, otherwise, this field will be set to \"True\". If not specified, it means the readiness of a snapshot is unknown.\n                type: boolean\n              restoreSize:\n                type: string\n                description: restoreSize represents the minimum size of volume required to create a volume from this snapshot. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the \"size_bytes\" value returned from CSI \"CreateSnapshot\" gRPC call. For a pre-existing snapshot, this field will be filled with the \"size_bytes\" value returned from the CSI \"ListSnapshots\" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown.\n                pattern: ^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$\n                x-kubernetes-int-or-string: true\n            type: object\n        required:\n        - spec\n        type: object\n    served: false\n    storage: false\n    subresources:\n      status: {}\nstatus:\n  acceptedNames:\n    kind: \"\"\n    plural: \"\"\n  conditions: []\n  storedVersions: []\n"
  },
  {
    "path": "roles/cluster-addon/tasks/argocd.yml",
    "content": "- block:\n    - name: prepare some dirs\n      file: name={{ cluster_dir }}/yml/argocd state=directory\n\n    - name: 创建命名空间 argocd\n      shell: \"{{ base_dir }}/bin/kubectl create ns argocd || echo true\"\n\n    - name: 创建chart 个性化设置\n      template: src=argocd/values.yaml.j2 dest={{ cluster_dir }}/yml/argocd/values.yaml\n\n    - name: helm 部署 argocd\n      shell: \"{{ base_dir }}/bin/helm upgrade argocd --install -n argocd \\\n              -f {{ cluster_dir }}/yml/argocd/values.yaml \\\n              {{ base_dir }}/roles/cluster-addon/files/argo-cd-9.3.4.tgz\"\n\n    - name: 轮询等待部署 argocd\n      shell: \"{{ base_dir }}/bin/helm ls -n argocd|grep argocd|awk '{print $8}'\"\n      register: chart_status\n      until: chart_status.stdout == \"deployed\"\n      retries: 15\n      delay: 5\n      ignore_errors: true\n\n  when: 'argocd_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/cilium_connectivity_check.yml",
    "content": "- block:\n    - name: 准备 cilium-check 配置目录\n      file: name={{ cluster_dir }}/yml/cilium-check state=directory\n    \n    - name: 准备部署文件\n      template: src=cilium-check/{{ item }}.j2 dest={{ cluster_dir }}/yml/cilium-check/{{ item }}\n      with_items:\n      - \"connectivity-check.yaml\"\n      - \"check-part1.yaml\"\n      - \"namespace.yaml\"\n    \n    - name: 创建测试namespace\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/cilium-check/namespace.yaml\"\n    \n    - name: 创建测试part1\n      shell: \"{{ base_dir }}/bin/kubectl apply -n cilium-test -f {{ cluster_dir }}/yml/cilium-check/check-part1.yaml\"\n    \n    - name: 轮询等待echo pod运行，视下载镜像速度而定\n      shell: \"{{ base_dir }}/bin/kubectl get pod -n cilium-test |grep echo|grep Running|grep '1/1'|wc -l\"\n      register: pod_status\n      until: pod_status.stdout == \"3\"\n      retries: 15\n      delay: 8\n      ignore_errors: true\n    \n    - name: 创建完整测试connectivity-check\n      shell: \"{{ base_dir }}/bin/kubectl apply -n cilium-test -f {{ cluster_dir }}/yml/cilium-check/connectivity-check.yaml\"\n\n    - debug:\n        msg: \"[重要]: 请查看命名空间cilium-test下所有pod，如果均为Running状态，且没有重启数增长，说明cilium连接测试正常。 \\\n              测试观察一段时间可以整体删除该命名空间所有资源(kubectl delete ns cilium-test)\"\n  when: 'cilium_connectivity_check|bool'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/coredns.yml",
    "content": "- block:\n    - name: 准备 DNS的部署文件\n      template: src=dns/coredns.yaml.j2 dest={{ cluster_dir }}/yml/coredns.yaml\n\n    - name: 删除coredns部署\n      shell: \"{{ base_dir }}/bin/kubectl delete -f {{ cluster_dir }}/yml/coredns.yaml || echo true; sleep 3\"\n      tags: force_change_certs\n      when: 'CHANGE_CA|bool'\n\n    - name: 创建coredns部署\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/coredns.yaml\"\n      tags: force_change_certs\n  when: 'dns_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/dashboard.yml",
    "content": "- block:\n    - name: prepare some dirs\n      file: name={{ cluster_dir }}/yml/dashboard state=directory\n\n    - name: 准备 dashboard的部署文件\n      template: src=dashboard/{{ item }}.j2 dest={{ cluster_dir }}/yml/dashboard/{{ item }}\n      with_items:\n      - \"dashboard-values.yaml\"\n      - \"admin-user-sa-rbac.yaml\"\n      - \"read-user-sa-rbac.yaml\"\n\n    - name: 创建 dashboard部署\n      shell: \"{{ base_dir }}/bin/helm upgrade kubernetes-dashboard --install --create-namespace \\\n              -n kube-system -f {{ cluster_dir }}/yml/dashboard/dashboard-values.yaml \\\n              {{ base_dir }}/roles/cluster-addon/files/kubernetes-dashboard-{{ dashboardVer }}.tgz\"\n\n    - name: 创建用户admin,read\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/dashboard/admin-user-sa-rbac.yaml \\\n           && {{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/dashboard/read-user-sa-rbac.yaml\"\n\n  when: 'dashboard_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/ingress-nginx.yml",
    "content": "- block:\n    - name: prepare some dirs\n      file: name={{ cluster_dir }}/yml/ingress-nginx state=directory\n\n    - name: 创建命名空间{{ ingress_nginx_namespace }}\n      shell: \"{{ base_dir }}/bin/kubectl create ns {{ ingress_nginx_namespace }} || echo true\"\n\n    - name: 创建chart 个性化设置\n      template: src=ingress-nginx/{{ item }}.j2 dest={{ cluster_dir }}/yml/ingress-nginx/{{ item }}\n      with_items:\n      - \"values.yaml\"\n\n    - name: helm 部署 ingress-nginx\n      shell: \"{{ base_dir }}/bin/helm upgrade ingress-nginx --install -n {{ ingress_nginx_namespace }} \\\n              -f {{ cluster_dir }}/yml/ingress-nginx/values.yaml \\\n              {{ base_dir }}/roles/cluster-addon/files/ingress-nginx-{{ ingress_nginx_ver }}.tgz\"\n\n    - name: 轮询等待部署 ingress-nginx\n      shell: \"{{ base_dir }}/bin/helm ls -n {{ ingress_nginx_namespace }}|grep ingress-nginx|awk '{print $8}'\"\n      register: chart_status\n      until: chart_status.stdout == \"deployed\"\n      retries: 15\n      delay: 5\n      ignore_errors: true\n\n    - name: 提示 WARNNING\n      debug:\n        msg: \"ingress-nginx 只会部署到有如下标签的节点：ingress-controller/provider=ingress-nginx\"\n\n  when: 'ingress_nginx_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/kubeblocks.yml",
    "content": "# https://kubeblocks.io/docs/release-1_0/user_docs/overview/install-kubeblocks \n- block:\n  - name: 创建 snapshot-controller crd\n    shell: \"cd {{ base_dir }}/roles/cluster-addon/files; \\\n            {{ base_dir }}/bin/kubectl get crd volumesnapshotclasses.snapshot.storage.k8s.io || \\\n            {{ base_dir }}/bin/kubectl create -f snapshot.storage.k8s.io_volumesnapshotclasses.yaml; \\\n            {{ base_dir }}/bin/kubectl get crd volumesnapshots.snapshot.storage.k8s.io || \\\n            {{ base_dir }}/bin/kubectl create -f snapshot.storage.k8s.io_volumesnapshots.yaml; \\\n            {{ base_dir }}/bin/kubectl get crd volumesnapshotcontents.snapshot.storage.k8s.io || \\\n            {{ base_dir }}/bin/kubectl create -f snapshot.storage.k8s.io_volumesnapshotcontents.yaml\"\n    ignore_errors: true\n\n  - name: 创建snapshot-controller\n    shell: \"{{ base_dir }}/bin/helm upgrade -i -n kb-system snapshot-controller --create-namespace \\\n            --set controller.image.repository='easzlab.io.local:5000/apecloud/snapshot-controller' \\\n            {{ base_dir }}/roles/cluster-addon/files/snapshot-controller-4.1.0.tgz\"\n  when: '\"snapshot-controller\" not in pod_info.stdout and openebs_install != \"yes\"'\n\n- block:\n  - name: 创建 kubeblocks yml 目录\n    file: name={{ cluster_dir }}/yml/kubeblocks state=directory\n\n  - name: 创建 kubeblocks clusters 个性化设置\n    template: src=kubeblocks/{{ item }}.yaml.j2 dest={{ cluster_dir }}/yml/kubeblocks/{{ item }}.yaml\n    with_items:\n      - kb-values\n\n  - name: 创建 kubeblocks crd\n    shell: \"{{ base_dir }}/bin/kubectl get crd clusters.apps.kubeblocks.io || \\\n            {{ base_dir }}/bin/kubectl create -f {{ base_dir }}/roles/cluster-addon/files/kubeblocks_crds.yaml\"\n    ignore_errors: true\n\n  - name: helm 创建 kubeblocks\n    shell: \"{{ base_dir }}/bin/helm upgrade kubeblocks --install --create-namespace -n kb-system \\\n            -f {{ cluster_dir }}/yml/kubeblocks/kb-values.yaml \\\n            {{ base_dir }}/roles/cluster-addon/files/kubeblocks-{{ kubeblocks_ver }}.tgz\"\n\n  - name: helm 安装 kb-addon-es\n    shell: \"{{ base_dir }}/bin/helm upgrade -i -n kb-system kb-addon-elasticsearch \\\n            {{ base_dir }}/roles/cluster-addon/files/elasticsearch-1.0.2.tgz\"\n\n  - name: helm 安装 kb-addon-clickhouse\n    shell: \"{{ base_dir }}/bin/helm upgrade -i -n kb-system kb-addon-clickhouse \\\n            {{ base_dir }}/roles/cluster-addon/files/clickhouse-1.0.0.tgz\"\n\n  - name: helm 安装 kb-addon-minio\n    shell: \"{{ base_dir }}/bin/helm upgrade -i -n kb-system kb-addon-minio \\\n            --set image.registry=easzlab.io.local:5000 \\\n            {{ base_dir }}/roles/cluster-addon/files/minio-1.0.1.tgz\"\n\n  - name: 轮询等待部署 kb-addon-mysql chart\n    shell: \"{{ base_dir }}/bin/helm ls -n kb-system|grep kb-addon-mysql|awk '{print $8}'\"\n    register: mysql_status\n    until: mysql_status.stdout == \"deployed\"\n    retries: 15\n    delay: 5\n    ignore_errors: true\n\n  - name: 轮询等待部署 kb-addon-postgresql chart\n    shell: \"{{ base_dir }}/bin/helm ls -n kb-system|grep kb-addon-postgresql|awk '{print $8}'\"\n    register: pg_status\n    until: pg_status.stdout == \"deployed\"\n    retries: 15\n    delay: 5\n    ignore_errors: true\n\n  - name: 轮询等待部署 kb-addon-redis chart\n    shell: \"{{ base_dir }}/bin/helm ls -n kb-system|grep kb-addon-redis|awk '{print $8}'\"\n    register: redis_status\n    until: redis_status.stdout == \"deployed\"\n    retries: 15\n    delay: 5\n    ignore_errors: true\n\n  when: '\"kubeblocks-dataprotection\" not in pod_info.stdout'\n\n#- name: 设置chart允许修改镜像地址\n#  shell: \"{{ base_dir }}/bin/kubectl annotate componentdefinitions.apps.kubeblocks.io mysql-5.7 apps.kubeblocks.io/skip-immutable-check=true && \\\n#      {{ base_dir }}/bin/kubectl annotate componentdefinitions.apps.kubeblocks.io mysql-8.0 apps.kubeblocks.io/skip-immutable-check=true\"\n#  ignore_errors: true\n#\n#- name: helm 更新 kb-addon-mysql\n#  shell: \"{{ base_dir }}/bin/helm upgrade -n kb-system kb-addon-mysql \\\n#          --set image.registry=easzlab.io.local:5000 \\\n#          {{ base_dir }}/roles/cluster-addon/files/mysql-0.9.1.tgz\"\n#\n#- name: 优化mysql节点健康检查探针\n#  shell: '{{ base_dir }}/bin/kubectl patch ComponentDefinition mysql-8.0 --type merge --patch \"{\\\"spec\\\":{\\\"lifecycleActions\\\":{\\\"roleProbe\\\":{\\\"periodSeconds\\\":5,\\\"timeoutSeconds\\\":2}}}}\"'\n#  ignore_errors: true\n#\n#- name: 优化postgresql节点健康检查探针\n#  shell: '{{ base_dir }}/bin/kubectl patch ComponentDefinition postgresql-16 --type merge --patch \"{\\\"spec\\\":{\\\"lifecycleActions\\\":{\\\"roleProbe\\\":{\\\"periodSeconds\\\":5,\\\"timeoutSeconds\\\":2}}}}\"'\n#  ignore_errors: true\n"
  },
  {
    "path": "roles/cluster-addon/tasks/local-storage.yml",
    "content": "- block:\n    - name: 准备 local-storage 配置目录\n      file: name={{ cluster_dir }}/yml/local-storage state=directory\n\n    - name: 准备 local-storage部署文件\n      template: src=local-storage/{{ item }}.j2 dest={{ cluster_dir }}/yml/local-storage/{{ item }}\n      with_items:\n      - \"local-path-storage.yaml\"\n      - \"test-pod.yaml\"\n\n    - name: 创建 local-storage部署\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/local-storage/local-path-storage.yaml\"\n  when: 'local_path_provisioner_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/main.yml",
    "content": "- name: 获取所有已经创建的POD信息\n  command: \"{{ base_dir }}/bin/kubectl get pod --all-namespaces\"\n  register: pod_info\n  tags: force_change_certs\n\n- import_tasks: coredns.yml\n  when: '\"coredns\" not in pod_info.stdout or CHANGE_CA|bool'\n\n- import_tasks: nodelocaldns.yml\n  when: '\"node-local-dns\" not in pod_info.stdout or CHANGE_CA|bool'\n\n- import_tasks: metrics-server.yml\n  when: '\"metrics-server\" not in pod_info.stdout or CHANGE_CA|bool'\n\n- import_tasks: dashboard.yml\n  when: '\"kubernetes-dashboard\" not in pod_info.stdout or CHANGE_CA|bool'\n\n- import_tasks: local-storage.yml\n  when: '\"local-path-provisioner\" not in pod_info.stdout or CHANGE_CA|bool'\n\n- import_tasks: nfs-provisioner.yml\n  when: '\"nfs-client-provisioner\" not in pod_info.stdout or CHANGE_CA|bool'\n\n- import_tasks: openebs.yml\n  when: 'openebs_install == \"yes\" and \"openebs-localpv-provisioner\" not in pod_info.stdout'\n\n- import_tasks: prometheus.yml\n  when: '\"kube-prometheus-operator\" not in pod_info.stdout and prom_install == \"yes\"'\n\n- import_tasks: minio.yml\n  when: 'minio_install == \"yes\" and \"minio-operator\" not in pod_info.stdout'\n\n- import_tasks: nacos.yml\n  when: '\"nacos-0\" not in pod_info.stdout and nacos_install == \"yes\"'\n\n- import_tasks: rocketmq.yml\n  when: '\"broker-0-master\" not in pod_info.stdout and rocketmq_install == \"yes\"'\n\n- import_tasks: cilium_connectivity_check.yml\n  when: 'CLUSTER_NETWORK == \"cilium\" and cilium_connectivity_check|bool'\n\n- import_tasks: network_check.yml\n  when: 'network_check_enabled|bool and CLUSTER_NETWORK != \"cilium\"'\n\n- import_tasks: kubeblocks.yml\n  when: 'kubeblocks_install == \"yes\"'\n\n- import_tasks: ingress-nginx.yml\n  when: 'ingress_nginx_install == \"yes\" and \"ingress-nginx-controller\" not in pod_info.stdout'\n\n- import_tasks: argocd.yml\n  when: 'argocd_install == \"yes\" and \"argocd-server\" not in pod_info.stdout'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/metrics-server.yml",
    "content": "- block:\n    - name: 准备 metrics-server的部署文件\n      template: src=metrics-server/components.yaml.j2 dest={{ cluster_dir }}/yml/metrics-server.yaml\n\n    - name: 删除 metrics-server部署\n      shell: \"{{ base_dir }}/bin/kubectl delete -f {{ cluster_dir }}/yml/metrics-server.yaml || echo true; sleep 3\"\n      tags: force_change_certs\n      when: 'CHANGE_CA|bool'\n\n    - name: 创建 metrics-server部署\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/metrics-server.yaml\"\n      tags: force_change_certs\n  when: 'metricsserver_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/minio.yml",
    "content": "- block:\n    - name: prepare some dirs\n      file: name={{ cluster_dir }}/yml/minio state=directory\n\n    - name: 创建命名空间{{ minio_namespace }}\n      shell: \"{{ base_dir }}/bin/kubectl create ns {{ minio_namespace }} || echo true\"\n\n    - name: get minio-global-cert info\n      shell: \"{{ base_dir }}/bin/kubectl get secrets -n {{ minio_namespace }}\"\n      register: secrets_info\n      when: 'minio_with_global_cert|bool'\n\n    - name: 创建 minio-global-cert\n      shell: \"{{ base_dir }}/bin/kubectl create secret generic -n {{ minio_namespace }} minio-global-cert \\\n            --from-file=public.crt={{ base_dir }}/roles/cluster-addon/templates/minio/server.crt \\\n            --from-file=private.key={{ base_dir }}/roles/cluster-addon/templates/minio/server.key\"\n      when: 'minio_with_global_cert|bool and \"minio-global-cert\" not in secrets_info.stdout'\n\n    - name: 创建chart 个性化设置\n      template: src=minio/{{ item }}.j2 dest={{ cluster_dir }}/yml/minio/{{ item }}\n      with_items:\n      - \"operator-values.yaml\"\n      - \"tenant-values.yaml\"\n\n    - name: helm 部署 minio operator \n      shell: \"{{ base_dir }}/bin/helm upgrade minio-operator --install -n minio-operator \\\n              --create-namespace -f {{ cluster_dir }}/yml/minio/operator-values.yaml \\\n              {{ base_dir }}/roles/cluster-addon/files/operator-{{ minio_chart_ver }}.tgz\"\n\n    - name: 轮询等待部署 minio operator\n      shell: \"{{ base_dir }}/bin/helm ls -n minio-operator|grep minio-operator|awk '{print $8}'\"\n      register: chart_status\n      until: chart_status.stdout == \"deployed\"\n      retries: 15\n      delay: 5\n      ignore_errors: true\n\n    - name: helm 部署 minio tenant\n      shell: \"{{ base_dir }}/bin/helm upgrade minio --install -n {{ minio_namespace }} \\\n              --create-namespace -f {{ cluster_dir }}/yml/minio/tenant-values.yaml \\\n              {{ base_dir }}/roles/cluster-addon/files/tenant-{{ minio_chart_ver }}.tgz\"\n\n  when: 'minio_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/nacos.yml",
    "content": "- block:\n    - name: 准备 nacos的部署文件\n      template: src=nacos/nacos-sts.yaml.j2 dest={{ cluster_dir }}/yml/nacos-sts.yaml\n\n    - name: 创建命名空间{{ nacos_namespace }}\n      shell: \"{{ base_dir }}/bin/kubectl create ns {{ nacos_namespace }} || echo true\"\n\n    - name: 创建 nacos部署\n      shell: \"{{ base_dir }}/bin/kubectl -n {{ nacos_namespace }} apply -f {{ cluster_dir }}/yml/nacos-sts.yaml\"\n  when: 'nacos_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/network_check.yml",
    "content": "- block:\n    - name: 准备 network-check 配置目录\n      file: name={{ cluster_dir }}/yml/network-check state=directory\n    \n    - name: 准备部署文件\n      template: src=network-check/{{ item }}.j2 dest={{ cluster_dir }}/yml/network-check/{{ item }}\n      with_items:\n      - \"network-check.yaml\"\n      - \"namespace.yaml\"\n    \n    - name: 创建测试namespace\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/network-check/namespace.yaml\"\n    \n    - name: 创建完整测试network-check\n      shell: \"{{ base_dir }}/bin/kubectl apply -n network-test -f {{ cluster_dir }}/yml/network-check/network-check.yaml\"\n\n    - debug:\n        msg: \"[重要]: 请查看命名空间network-test下所有pod，如果均为Completed状态，且没有重启数增长，说明网络连接测试正常。 \\\n              如果有Pending状态，部分测试需要多节点集群才能完成，如果希望禁用网络测试执行(kubectl delete ns network-test)\"\n  when: 'network_check_enabled|bool'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/nfs-provisioner.yml",
    "content": "- block:\n    - name: 准备 nfs-provisioner 配置目录\n      file: name={{ cluster_dir }}/yml/nfs-provisioner state=directory\n\n    - name: 准备 nfs-provisioner部署文件\n      template: src=nfs-provisioner/{{ item }}.j2 dest={{ cluster_dir }}/yml/nfs-provisioner/{{ item }}\n      with_items:\n      - \"nfs-provisioner.yaml\"\n      - \"test-pod.yaml\"\n\n    - name: 创建 nfs-provisioner部署\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/nfs-provisioner/nfs-provisioner.yaml\"\n  when: 'nfs_provisioner_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/nodelocaldns.yml",
    "content": "- block:\n    - name: 准备dnscache的部署文件\n      template: src=dns/nodelocaldns-ipvs.yaml.j2 dest={{ cluster_dir }}/yml/nodelocaldns.yaml\n      when: \"PROXY_MODE == 'ipvs'\"\n\n    - name: 准备dnscache的部署文件\n      template: src=dns/nodelocaldns-iptables.yaml.j2 dest={{ cluster_dir }}/yml/nodelocaldns.yaml\n      when: \"PROXY_MODE == 'iptables'\"\n\n    - name: 删除dnscache部署\n      shell: \"{{ base_dir }}/bin/kubectl delete -f {{ cluster_dir }}/yml/nodelocaldns.yaml || echo true; sleep 3\"\n      tags: force_change_certs\n      when: 'CHANGE_CA|bool'\n\n    - name: 创建dnscache部署\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/nodelocaldns.yaml\"\n      tags: force_change_certs\n  when: 'ENABLE_LOCAL_DNS_CACHE|bool'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/openebs.yml",
    "content": "- block:\n    - name: 清理 snapshot-controller crd\n      shell: \"echo 'clean existed snapshot-controller crds'; \\\n            {{ base_dir }}/bin/kubectl delete crd volumesnapshotclasses.snapshot.storage.k8s.io || echo ''; \\\n            {{ base_dir }}/bin/kubectl delete crd volumesnapshots.snapshot.storage.k8s.io || echo ''; \\\n            {{ base_dir }}/bin/kubectl delete crd volumesnapshotcontents.snapshot.storage.k8s.io || echo ''\"\n      ignore_errors: true\n\n    - name: prepare some dirs\n      file: name={{ cluster_dir }}/yml/openebs state=directory\n\n    - name: 创建命名空间{{ openebs_namespace }}\n      shell: \"{{ base_dir }}/bin/kubectl create ns {{ openebs_namespace }} || echo ''\"\n\n    - name: 创建chart 个性化设置\n      template: src=openebs/{{ item }}.j2 dest={{ cluster_dir }}/yml/openebs/{{ item }}\n      with_items:\n      - \"values.yaml\"\n      - \"sc.yaml\"\n\n    - name: helm 部署 openebs operator \n      shell: \"{{ base_dir }}/bin/helm upgrade openebs --install -n {{ openebs_namespace }} \\\n              -f {{ cluster_dir }}/yml/openebs/values.yaml \\\n              {{ base_dir }}/roles/cluster-addon/files/openebs-{{ openebs_ver }}.tgz\"\n\n    - name: 轮询等待部署 openebs \n      shell: \"{{ base_dir }}/bin/helm ls -n {{ openebs_namespace }}|grep openebs|awk '{print $8}'\"\n      register: chart_status\n      until: chart_status.stdout == \"deployed\"\n      retries: 15\n      delay: 5\n      ignore_errors: true\n\n    - name: 轮询等待lvm-localpv-controller 运行\n      shell: \"{{ base_dir }}/bin/kubectl get pod -n {{ openebs_namespace }}|grep 'lvm-localpv-controller'|awk '{print $2}'\"\n      register: pod_status\n      until: pod_status.stdout == \"5/5\"\n      retries: 15\n      delay: 10\n      ignore_errors: true\n\n    - name: 创建lvm storageclass\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/openebs/sc.yaml\" \n\n  when: 'openebs_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/tasks/prometheus.yml",
    "content": "# https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack\n\n- block:\n    - name: 获取是否已创建命名空间{{ prom_namespace }}\n      shell: \"{{ base_dir }}/bin/kubectl get ns\"\n      register: ns_info\n    \n    - name: 创建命名空间{{ prom_namespace }}\n      shell: \"{{ base_dir }}/bin/kubectl create ns {{ prom_namespace }}\"\n      when: \"prom_namespace not in ns_info.stdout\"\n    \n    - name: get etcd-client-cert info\n      shell: \"{{ base_dir }}/bin/kubectl get secrets -n {{ prom_namespace }}\"\n      register: secrets_info\n    \n    - name: 创建etcd-client 证书请求\n      template: src=prometheus/etcd-client-csr.json.j2 dest={{ cluster_dir }}/ssl/etcd-client-csr.json\n      when: '\"etcd-client-cert\" not in secrets_info.stdout'\n    \n    - name: 创建 etcd-client证书和私钥\n      shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n            -ca=ca.pem \\\n            -ca-key=ca-key.pem \\\n            -config=ca-config.json \\\n            -profile=kubernetes etcd-client-csr.json|{{ base_dir }}/bin/cfssljson -bare etcd-client\"\n      when: '\"etcd-client-cert\" not in secrets_info.stdout or CHANGE_CA|bool'\n\n    - name: 删除 etcd-client-cert\n      shell: \"{{ base_dir }}/bin/kubectl delete secret -n {{ prom_namespace }} etcd-client-cert || echo true\"\n      when: 'CHANGE_CA|bool'\n    \n    - name: 创建 etcd-client-cert\n      shell: \"cd {{ cluster_dir }}/ssl && \\\n            {{ base_dir }}/bin/kubectl create secret generic -n {{ prom_namespace }} etcd-client-cert \\\n            --from-file=etcd-ca=ca.pem \\\n            --from-file=etcd-client=etcd-client.pem \\\n            --from-file=etcd-client-key=etcd-client-key.pem\"\n      when: '\"etcd-client-cert\" not in secrets_info.stdout or CHANGE_CA|bool'\n\n    - debug: var=\"K8S_VER\"\n\n    - name: 创建 prom chart 个性化设置\n      template: src=prometheus/values.yaml.j2 dest={{ cluster_dir }}/yml/prom-values.yaml\n\n    - name: helm 删除 kube-prometheus-stack {{ prom_chart_ver }}\n      shell: \"{{ base_dir }}/bin/helm delete prometheus -n {{ prom_namespace }} || echo true; sleep 3\"\n      when: 'CHANGE_CA|bool'\n\n    - name: helm 创建 kube-prometheus-stack {{ prom_chart_ver }}\n      shell: \"{{ base_dir }}/bin/helm upgrade prometheus --install \\\n              -n {{ prom_namespace }} -f {{ cluster_dir }}/yml/prom-values.yaml \\\n              {{ base_dir }}/roles/cluster-addon/files/kube-prometheus-stack-{{ prom_chart_ver }}.tgz\"\n  when: 'prom_install == \"yes\"'\n  tags: force_change_certs\n"
  },
  {
    "path": "roles/cluster-addon/tasks/rocketmq.yml",
    "content": "- block:\n    - name: 创建命名空间{{ rocketmq_namespace }}\n      shell: \"{{ base_dir }}/bin/kubectl create ns {{ rocketmq_namespace }} || echo true\"\n\n    - name: helm 部署 rocketmq operator \n      shell: \"{{ base_dir }}/bin/helm upgrade rocketmq-operator --install -n {{ rocketmq_namespace }} \\\n              --set rocketmqOperator.manager.image.repository='easzlab.io.local:5000/rocketmq/rocketmq-operator' \\\n              {{ base_dir }}/roles/cluster-addon/files/rocketmq-operator-0.1.0.tgz\"\n\n    - name: 轮询等待 rocketmq operator 运行\n      shell: \"{{ base_dir }}/bin/kubectl get pod -n {{ rocketmq_namespace }}|grep 'rocketmq-operator'|awk '{print $3}'\"\n      register: pod_status\n      until: pod_status.stdout == \"Running\"\n      retries: 15\n      delay: 3\n      ignore_errors: true\n\n    - name: 准备 rocketmq 部署文件\n      template: src=rocketmq/rocketmq_cluster.yaml.j2 dest={{ cluster_dir }}/yml/rocketmq_cluster.yaml\n\n    - name: 部署 rocketmq cluster\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/rocketmq_cluster.yaml\"\n  when: 'rocketmq_install == \"yes\"'\n"
  },
  {
    "path": "roles/cluster-addon/templates/argocd/argocd-app-example.yaml",
    "content": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n  name: example-app\n  namespace: mypro1\nspec:\n  syncPolicy:\n    #automated: {}\n    syncOptions:\n    - CreateNamespace=true\n    - ServerSideApply=true\n  project: mypro1\n  destination:\n    server: https://192.168.0.1:6443\n    namespace: default\n  sources:\n  - repoURL: 'git@192.168.0.2:mycharts.git'\n    targetRevision: master\n    path: charts/example-app\n    helm:\n      valueFiles:\n      - values.yaml\n      - $setups/mypro1/global.yaml\n      - $setups/mypro1/example-app.yaml\n  - repoURL: 'git@192.168.0.2:provalues.git'\n    targetRevision: master\n    ref: setups\n"
  },
  {
    "path": "roles/cluster-addon/templates/argocd/cluster/cluster-mypro1.yaml",
    "content": "apiVersion: v1\nkind: Secret\nmetadata:\n  annotations:\n    managed-by: argocd.argoproj.io\n  labels:\n    argocd.argoproj.io/secret-type: cluster\n  name: cluster-mypro1\n  namespace: argocd\ntype: Opaque\nstringData:\n  name: mypro1\n  server: https://192.168.0.1:6443\n  # _CERT_DATA_ 为 kubeconfig 中用户的 'client-certificate-data' 部分\n  # _KEY_DATA_ 为 kubeconfig 中用户的 'client-key-data' 部分\n  config: '{\"tlsClientConfig\":{\"insecure\":true,\"certData\":\"_CERT_DATA_\",\"keyData\":\"_KEY_DATA_\"}}'\n"
  },
  {
    "path": "roles/cluster-addon/templates/argocd/project/project-mypro1.yaml",
    "content": "apiVersion: argoproj.io/v1alpha1\nkind: AppProject\nmetadata:\n  name: mypro1\n  namespace: argocd\nspec:\n  clusterResourceWhitelist:\n  - group: '*'\n    kind: '*'\n  description: 'mypro1 部署环境'\n  destinations:\n  - name: mypro1\n    namespace: '*'\n    server: https://192.168.0.1:6443\n  namespaceResourceWhitelist:\n  - group: '*'\n    kind: '*'\n  sourceRepos:\n  - '*'\n  sourceNamespaces:\n  - '*'\n"
  },
  {
    "path": "roles/cluster-addon/templates/argocd/repository/argocd-ssh-known-hosts-cm.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  labels:\n    app.kubernetes.io/name: argocd-ssh-known-hosts-cm\n    app.kubernetes.io/part-of: argocd\n  name: argocd-ssh-known-hosts-cm\n  namespace: argocd\ndata:\n  #### 配置信任git服务器的ssh证书，可以选择ecdsa-sha2-nistp256，在git服务器/etc/ssh/ssh_host_ecdsa_key.pub\n  ssh_known_hosts: |\n    192.168.0.2 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBZOaFXc9MqZbQ37PA/onVaMnUBD3ceJjMzyTsDDftesakRWrIbvUW6GGB/tGikiDosYP178/N/PiDXo4oq/bL0=\n"
  },
  {
    "path": "roles/cluster-addon/templates/argocd/repository/git-sync.sh",
    "content": "#!/bin/bash\n\n# 把如下脚本放入：/etc/cron.d/ 目录，每分钟自动同步\n# echo '* * * * * root /bin/bash \"/root/repository/git-sync.sh\" -u user -p eZm******AQ > \"/root/repository/sync.log\" 2>&1'\n\nset -o nounset\nset -o errexit\n\nSOURCE_GIT=\"github.com/mypro1/\"\nTARGET_GIT=\"git@192.168.0.2:\"\n\nfunction usage() {\n  echo -e \"\\033[33mUsage:\\033[0m git_sync [options] [args]\"\n  cat <<EOF\n  option:\n    -u <user>       set user\n    -p <token>      set private token\nEOF\n}\n\nfunction logger() {\n  TIMESTAMP=$(date +'%Y-%m-%d %H:%M:%S')\n  local FNAME=$(basename \"${BASH_SOURCE[1]}\")\n  local SOURCE=\"\\033[36m[$FNAME:${BASH_LINENO[0]}]\\033[0m\"\n  case \"$1\" in\n    debug)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[36mDEBUG $2\\033[0m\"\n      ;;\n    info)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[32mINFO $2\\033[0m\"\n      ;;\n    warn)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[33mWARN $2\\033[0m\"\n      ;;\n    error)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[31mERROR $2\\033[0m\"\n      ;;\n    *) ;;\n  esac\n}\n\n# 同步特定分支\nfunction sync_branch(){\n    mkdir -p \"$BASE_DIR/$1\"\n    for ((i=0;i<${#PROJECTS[@]};i++))\n    do\n        PROJECT_NAME=${PROJECTS[i]}\n        PRO_GIT_NAME=$PROJECT_NAME.git\n\n        pull_and_push $1 $PROJECT_NAME || pull_and_push_force $1 $PROJECT_NAME\n    done\n}\n\n# 参数 $1 代表分支名\n# 参数 $2 代表项目名\nfunction pull_and_push(){\n    [[ -d \"$BASE_DIR/$1/$2\" ]] || { logger warn \"project not existed\"; return 1; }\n    logger info \"normal pull_and_push $2 $1\"\n    cd \"$BASE_DIR/$1/$2\"\n    git pull origin $1 || { logger error \"git pull $2 $1\"; return 1; }\n    git push secondary $1 || { logger error \"git push $2 $1\"; return 1; }\n}\n\n\nfunction pull_and_push_force(){\n    logger warn \"force pull_and_push $2 $1\"\n    cd \"$BASE_DIR/$1\"\n    rm -rf \"$2\"\n    git clone -b $1 \"$FROM_GIT$PRO_GIT_NAME\" || { logger error \"git pull $2 $1\"; exit 1; }\n    cd \"$2\"\n    git remote add secondary \"$TARGET_GIT$PRO_GIT_NAME\"\n    git push secondary $1 --force || { logger error \"git push $2 $1\"; exit 1; }\n}\n\n\nfunction main() {\n    BASE_DIR=/tmp/mygit_sync\n\n    [[ \"$#\" -eq 0 ]] && { usage >&2; exit 1; }\n\n    USER=\"\"\n    TOKEN=\"\"\n\n    while getopts \"u:p:f\" OPTION; do\n      case \"$OPTION\" in\n        u)\n          USER=\"$OPTARG\"\n          ;;\n        p)\n          TOKEN=\"$OPTARG\"\n          ;;\n        ?)\n          usage\n          exit 1\n          ;;\n      esac\n    done\n\n    FROM_GIT=\"http://$USER:$TOKEN@$SOURCE_GIT\"\n\n    # 1. 同步项目master、release分支\n    PROJECTS=(\"zscluster\" \"setup\")\n    sync_branch master\n    sync_branch release\n\n    # 4. done\n    logger debug \"sync finished\"\n}\n\nmain \"$@\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/argocd/repository/repo-charts-git.yaml",
    "content": "apiVersion: v1\nkind: Secret\nmetadata:\n  name: repo-charts-git\n  namespace: argocd\n  labels:\n    argocd.argoproj.io/secret-type: repository\n  annotations:\n    managed-by: argocd.argoproj.io\ntype: Opaque\nstringData:\n  name: repo-charts-git\n  type: git\n  ## 前提：添加信任git服务器的证书到argocd-ssh-known-hosts\n  url: git@192.168.0.2:mycharts.git\n  ## 任意创建一对ssh私钥和公钥，公钥配置到git服务器.ssh/authorized_keys 中，私钥配置如下\n  sshPrivateKey: |\n    -----BEGIN OPENSSH PRIVATE KEY-----\n    b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n    NhAAAAAwEAAQAAAQEAqcBisD7rq/zjfXcwi2EDYjAKDxO6O8PH9IpVCoTyVQAhFRnS3bSY\n    KJwdXPW58bIZAK959HJC05dLj1YEU1s4PELf2kY+64qqjpZUmPJsE6rvUKclXNIm56YSEw\n    eCJGLo+2tsTw9NpqHAeF8vdFNtrmxP1FE5OSXbs9tM8DeJVLs8gVFKO+KbLxF4rUNHEDNC\n    Cl0zVq3CX5rYlckUT7F+ay5Zbl9AJCxpTlHjixL2vFDPIoKKHnDQBrv8033YNBnnwGakBt\n    nSPTdIhOiGWNfwIMrPWZzlYaL7dc9GX1BvDgu3UoGu3sthR4DCJuqA7OS6M04vL/KhBA12\n    e8RYli1CkwAAA9A3DDdhNww3YQAAAAdzc2gtcnNhAAABAQCpwGKwPuur/ON9dzCLYQNiMA\n    oPE7o7w8f0ilUKhPJVACEVGdLdtJgonB1c9bnxshkAr3n0ckLTl0uPVgRTWzg8Qt/aRj7r\n    iqqOllSY8mwTqu9QpyVc0ibnphITB4IkYuj7a2xPD02mocB4Xy90U22ubE/UUTk5Jduz20\n    zwN4lUuzyBUUo74psvEXitQ0cQM0IKXTNWrcJfmtiVyRRPsX5rLlluX0AkLGlOUeOLEva8\n    UM8igooecNAGu/zTfdg0GefAZqQG2dI9N0iE6IZY1/Agys9ZnOVhovt1z0ZfUG8OC7dSga\n    7ey2FHgMIm6oDs5LozTi8v8qEEDXZ7xFiWLUKTAAAAAwEAAQAAAQAe+nUIJPNtV6FMbEv3\n    o6SyboHnbno2HeyHvBb47Hos+PEQoL3Sp/p8rsDNDir46L+XWG6xJYj8hEfNyKzRaXxBwx\n    KHCvrAkXW+v8CAiP0gObmixl4TKmbfL3ds8ZnWehZ6i4gghXJuTmaJkRVf7Tm+8xU+cfQ3\n    cak+kW7hB8GQLK6POr8HVK6wzDRWO2VMtbKOo+TzWyR8Mmiw0nUJHjbv91YqG1B9giKxeH\n    fA6ey/c6h1CPGdSwTGNoipYmQWy/Gkyep5FSNPwWyOoX2VwTV66yKG7VO0kdKZ+MpuFDqF\n    GxXFfmNKA/5DETWMaa1RRd5QOYIyMCRmLhEvdaZ4iJtBAAAAgQC6FhpwnaQDz2G3kJzJfg\n    ffkLJ+lhv3oxZBIWkX7XiUv1zrlbj8KLS3e/PhlHJXoggNF6x1OPRTz2iPMTYoEl6Jm61K\n    8GH3Uba19L8xMqIvHCSRKRhhbDWVbwhhMMsLnTRSZ6e53aFwGjmhGbpa1Y379o+stH3UY1\n    3peaQ8LzNN9wAAAIEA7QKV5EMkQnP3vZiG9SQJgw+qtQ1NqjXLHoCnJQg+OmFZuHX0im65\n    BCeQTcAxencxcGCmFPBBWVz/pwuDYiqXzuD1VCRASLZX/cltQqOVP9/TOH9H+AZeVoqHC6\n    +SNYPn1VpBb3o71IuI8AsxzGzEC316QK7vG0mm2+VC9J3MQbcAAACBALdaOwHsrW+7Cd32\n    FwARmZRrZ5Xu9cJjMxx5lOGA6p36HRos9IAYBv9b8YFiu4VQ7eJsjg9U9Qb9ZmXhFb3uc7\n    QrZVda/O6fma1dK+Qsd7Puwo9yDR9RN9GzuoWKnP3roCO2aCETPQHhevm3DOq4ObEl/gEW\n    97y7NEYMrye7x9YFAAAAF2FsYmVydEBrOHMtMTkyLTE2OC0wLTkzAQID\n    -----END OPENSSH PRIVATE KEY-----\n"
  },
  {
    "path": "roles/cluster-addon/templates/argocd/repository/repo-values-git.yaml",
    "content": "apiVersion: v1\nkind: Secret\nmetadata:\n  name: repo-values-git\n  namespace: argocd\n  labels:\n    argocd.argoproj.io/secret-type: repository\n  annotations:\n    managed-by: argocd.argoproj.io\ntype: Opaque\nstringData:\n  name: repo-values-git\n  type: git\n  ## 前提：添加信任git服务器的证书到argocd-ssh-known-hosts\n  url: git@192.168.0.2:provalues.git\n  ## 创建一对ssh私钥和公钥，公钥配置到git服务器.ssh/authorized_keys 中，私钥配置如下\n  sshPrivateKey: |\n    -----BEGIN OPENSSH PRIVATE KEY-----\n    b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n    NhAAAAAwEAAQAAAQEAqcBisD7rq/zjfXcwi2EDYjAKDxO6O8PH9IpVCoTyVQAhFRnS3bSY\n    KJwdXPW58bIZAK959HJC05dLj1YEU1s4PELf2kY+64qqjpZUmPJsE6rvUKclXNIm56YSEw\n    eCJGLo+2tsTw9NpqHAeF8vdFNtrmxP1FE5OSXbs9tM8DeJVLs8gVFKO+KbLxF4rUNHEDNC\n    Cl0zVq3CX5rYlckUT7F+ay5Zbl9AJCxpTlHjixL2vFDPIoKKHnDQBrv8033YNBnnwGakBt\n    nSPTdIhOiGWNfwIMrPWZzlYaL7dc9GX1BvDgu3UoGu3sthR4DCJuqA7OS6M04vL/KhBA12\n    e8RYli1CkwAAA9A3DDdhNww3YQAAAAdzc2gtcnNhAAABAQCpwGKwPuur/ON9dzCLYQNiMA\n    oPE7o7w8f0ilUKhPJVACEVGdLdtJgonB1c9bnxshkAr3n0ckLTl0uPVgRTWzg8Qt/aRj7r\n    iqqOllSY8mwTqu9QpyVc0ibnphITB4IkYuj7a2xPD02mocB4Xy90U22ubE/UUTk5Jduz20\n    zwN4lUuzyBUUo74psvEXitQ0cQM0IKXTNWrcJfmtiVyRRPsX5rLlluX0AkLGlOUeOLEva8\n    UM8igooecNAGu/zTfdg0GefAZqQG2dI9N0iE6IZY1/Agys9ZnOVhovt1z0ZfUG8OC7dSga\n    7ey2FHgMIm6oDs5LozTi8v8qEEDXZ7xFiWLUKTAAAAAwEAAQAAAQAe+nUIJPNtV6FMbEv3\n    o6SyboHnbno2HeyHvBb47Hos+PEQoL3Sp/p8rsDNDir46L+XWG6xJYj8hEfNyKzRaXxBwx\n    KHCvrAkXW+v8CAiP0gObmixl4TKmbfL3ds8ZnWehZ6i4gghXJuTmaJkRVf7Tm+8xU+cfQ3\n    cak+kW7hB8GQLK6POr8HVK6wzDRWO2VMtbKOo+TzWyR8Mmiw0nUJHjbv91YqG1B9giKxeH\n    fA6ey/c6h1CPGdSwTGNoipYmQWy/Gkyep5FSNPwWyOoX2VwTV66yKG7VO0kdKZ+MpuFDqF\n    GxXFfmNKA/5DETWMaa1RRd5QOYIyMCRmLhEvdaZ4iJtBAAAAgQC6FhpwnaQDz2G3kJzJfg\n    ffkLJ+lhv3oxZBIWkX7XiUv1zrlbj8KLS3e/PhlHJXoggNF6x1OPRTz2iPMTYoEl6Jm61K\n    8GH3Uba19L8xMqIvHCSRKRhhbDWVbwhhMMsLnTRSZ6e53aFwGjmhGbpa1Y379o+stH3UY1\n    3peaQ8LzNN9wAAAIEA7QKV5EMkQnP3vZiG9SQJgw+qtQ1NqjXLHoCnJQg+OmFZuHX0im65\n    BCeQTcAxencxcGCmFPBBWVz/pwuDYiqXzuD1VCRASLZX/cltQqOVP9/TOH9H+AZeVoqHC6\n    +SNYPn1VpBb3o71IuI8AsxzGzEC316QK7vG0mm2+VC9J3MQbcAAACBALdaOwHsrW+7Cd32\n    FwARmZRrZ5Xu9cJjMxx5lOGA6p36HRos9IAYBv9b8YFiu4VQ7eJsjg9U9Qb9ZmXhFb3uc7\n    QrZVda/O6fma1dK+Qsd7Puwo9yDR9RN9GzuoWKnP3roCO2aCETPQHhevm3DOq4ObEl/gEW\n    97y7NEYMrye7x9YFAAAAF2FsYmVydEBrOHMtMTkyLTE2OC0wLTkzAQID\n    -----END OPENSSH PRIVATE KEY-----\n"
  },
  {
    "path": "roles/cluster-addon/templates/argocd/values.yaml.j2",
    "content": "# Ref: https://github.com/argoproj/argo-helm/tree/main/charts/argo-cd\n\nglobal:\n  # -- Default domain used by all components\n  domain: myargocd.example.com\n\n  # -- Number of old deployment ReplicaSets to retain. The rest will be garbage collected.\n  revisionHistoryLimit: 3\n\n  image:\n    repository: easzlab.io.local:5000/argocd/argocd\n\nconfigs:\n  ## Ref: https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-cm.yaml\n  cm:\n    # -- Create the argocd-cm configmap for [declarative setup]\n    create: true\n\n    # application in any namespace\n    application.resourceTrackingMethod: annotation\n\n    ## Ref: https://argo-cd.readthedocs.io/en/latest/operator-manual/rbac/#exec-resource\n    exec.enabled: true \n\n    ## Ref: https://argo-cd.readthedocs.io/en/latest/faq/#how-to-disable-admin-user\n    admin.enabled: true\n\n    # -- Timeout to discover if a new manifests version got published to the repository\n    timeout.reconciliation: 180s\n\n    # -- Timeout to refresh application data as well as target manifests cache\n    timeout.hard.reconciliation: 0s\n\n    ## Ref: https://argo-cd.readthedocs.io/en/stable/user-guide/status-badge/\n    statusbadge.enabled: false\n\n  # Argo CD configuration parameters\n  params:\n    create: true\n    # use http\n    server.insecure: \"true\"\n    # support application in any namespace\n    # https://argo-cd.readthedocs.io/en/stable/operator-manual/app-any-namespace/\n    application.namespaces: '*'\n    applicationsetcontroller.allowed.scm.providers: '*'\n    applicationsetcontroller.namespaces: '*'\n\n  # Argo CD RBAC policy configuration\n  rbac:\n    create: true\n\n  # SSH known hosts for Git repositories\n  ssh:\n    create: true\n\n## Application controller\ncontroller:\n  name: application-controller\n\n## Dex\ndex:\n  enabled: true\n  image:\n    repository: easzlab.io.local:5000/argocd/dex\n    tag: v2.44.0\n\n## Redis\nredis:\n  enabled: true\n  image:\n    repository: easzlab.io.local:5000/argocd/redis\n    tag: 8.2.2-alpine\n\n# Ref: https://github.com/DandyDeveloper/charts/blob/master/charts/redis-ha/values.yaml\nredis-ha:\n  enabled: false\n\n## Server\nserver:\n  ingress:\n    enabled: true\n    ingressClassName: nginx\n    annotations:\n      nginx.ingress.kubernetes.io/force-ssl-redirect: \"true\"\n      nginx.ingress.kubernetes.io/backend-protocol: \"HTTP\"\n\n## Repo Server\nrepoServer:\n  replicas: 1\n\n## ApplicationSet controller\napplicationSet:\n  replicas: 1\n\nnotifications:\n  enabled: false\n\ncommitServer:\n  enabled: false\n"
  },
  {
    "path": "roles/cluster-addon/templates/cilium-check/check-part1.yaml.j2",
    "content": "# Automatically generated by Makefile. DO NOT EDIT\n---\nmetadata:\n  name: echo-a\n  labels:\n    name: echo-a\n    topology: any\n    component: network-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: echo-a\n    spec:\n      hostNetwork: false\n      containers:\n      - name: echo-a-container\n        env:\n        - name: PORT\n          value: \"8080\"\n        ports:\n        - containerPort: 8080\n        image: easzlab.io.local:5000/easzlab/json-mock:v1.3.0\n        imagePullPolicy: IfNotPresent\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:8080\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:8080\n  selector:\n    matchLabels:\n      name: echo-a\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: echo-b\n  labels:\n    name: echo-b\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: echo-b\n    spec:\n      hostNetwork: false\n      containers:\n      - name: echo-b-container\n        env:\n        - name: PORT\n          value: \"8080\"\n        ports:\n        - containerPort: 8080\n          hostPort: 40000\n        image: easzlab.io.local:5000/easzlab/json-mock:v1.3.0\n        imagePullPolicy: IfNotPresent\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:8080\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:8080\n  selector:\n    matchLabels:\n      name: echo-b\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: echo-b-host\n  labels:\n    name: echo-b-host\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: echo-b-host\n    spec:\n      hostNetwork: true\n      containers:\n      - name: echo-b-host-container\n        env:\n        - name: PORT\n          value: \"41000\"\n        ports: []\n        image: easzlab.io.local:5000/easzlab/json-mock:v1.3.0\n        imagePullPolicy: IfNotPresent\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:41000\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:41000\n      affinity:\n        podAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchExpressions:\n              - key: name\n                operator: In\n                values:\n                - echo-b\n            topologyKey: kubernetes.io/hostname\n  selector:\n    matchLabels:\n      name: echo-b-host\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: echo-a\n  labels:\n    name: echo-a\n    topology: any\n    component: network-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  ports:\n  - name: http\n    port: 8080\n  type: ClusterIP\n  selector:\n    name: echo-a\napiVersion: v1\nkind: Service\n---\nmetadata:\n  name: echo-b\n  labels:\n    name: echo-b\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  ports:\n  - name: http\n    port: 8080\n    nodePort: 31414\n  type: NodePort\n  selector:\n    name: echo-b\napiVersion: v1\nkind: Service\n---\nmetadata:\n  name: echo-b-headless\n  labels:\n    name: echo-b-headless\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  ports:\n  - name: http\n    port: 8080\n  type: ClusterIP\n  selector:\n    name: echo-b\n  clusterIP: None\napiVersion: v1\nkind: Service\n---\nmetadata:\n  name: echo-b-host-headless\n  labels:\n    name: echo-b-host-headless\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  ports: []\n  type: ClusterIP\n  selector:\n    name: echo-b-host\n  clusterIP: None\napiVersion: v1\nkind: Service\n"
  },
  {
    "path": "roles/cluster-addon/templates/cilium-check/connectivity-check.yaml.j2",
    "content": "# Automatically generated by Makefile. DO NOT EDIT\n---\nmetadata:\n  name: echo-a\n  labels:\n    name: echo-a\n    topology: any\n    component: network-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: echo-a\n    spec:\n      hostNetwork: false\n      containers:\n      - name: echo-a-container\n        env:\n        - name: PORT\n          value: \"8080\"\n        ports:\n        - containerPort: 8080\n        image: easzlab.io.local:5000/easzlab/json-mock:v1.3.0\n        imagePullPolicy: IfNotPresent\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:8080\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:8080\n  selector:\n    matchLabels:\n      name: echo-a\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: echo-b\n  labels:\n    name: echo-b\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: echo-b\n    spec:\n      hostNetwork: false\n      containers:\n      - name: echo-b-container\n        env:\n        - name: PORT\n          value: \"8080\"\n        ports:\n        - containerPort: 8080\n          hostPort: 40000\n        image: easzlab.io.local:5000/easzlab/json-mock:v1.3.0\n        imagePullPolicy: IfNotPresent\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:8080\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:8080\n  selector:\n    matchLabels:\n      name: echo-b\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: echo-b-host\n  labels:\n    name: echo-b-host\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: echo-b-host\n    spec:\n      hostNetwork: true\n      containers:\n      - name: echo-b-host-container\n        env:\n        - name: PORT\n          value: \"31000\"\n        ports: []\n        image: easzlab.io.local:5000/easzlab/json-mock:v1.3.0\n        imagePullPolicy: IfNotPresent\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:31000\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - localhost:31000\n      affinity:\n        podAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchExpressions:\n              - key: name\n                operator: In\n                values:\n                - echo-b\n            topologyKey: kubernetes.io/hostname\n  selector:\n    matchLabels:\n      name: echo-b-host\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: pod-to-a\n  labels:\n    name: pod-to-a\n    topology: any\n    component: network-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: pod-to-a\n    spec:\n      hostNetwork: false\n      containers:\n      - name: pod-to-a-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-a:8080/public\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-a:8080/public\n  selector:\n    matchLabels:\n      name: pod-to-a\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: pod-to-external-1111\n  labels:\n    name: pod-to-external-1111\n    topology: any\n    component: network-check\n    traffic: external\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: pod-to-external-1111\n    spec:\n      hostNetwork: false\n      containers:\n      - name: pod-to-external-1111-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - 1.1.1.1\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - 1.1.1.1\n  selector:\n    matchLabels:\n      name: pod-to-external-1111\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: pod-to-a-denied-cnp\n  labels:\n    name: pod-to-a-denied-cnp\n    topology: any\n    component: policy-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: pod-to-a-denied-cnp\n    spec:\n      hostNetwork: false\n      containers:\n      - name: pod-to-a-denied-cnp-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - sh\n            - -c\n            - '! curl -s --fail --connect-timeout 5 -o /dev/null echo-a:8080/private'\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - sh\n            - -c\n            - '! curl -s --fail --connect-timeout 5 -o /dev/null echo-a:8080/private'\n  selector:\n    matchLabels:\n      name: pod-to-a-denied-cnp\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: pod-to-a-allowed-cnp\n  labels:\n    name: pod-to-a-allowed-cnp\n    topology: any\n    component: policy-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: pod-to-a-allowed-cnp\n    spec:\n      hostNetwork: false\n      containers:\n      - name: pod-to-a-allowed-cnp-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-a:8080/public\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-a:8080/public\n  selector:\n    matchLabels:\n      name: pod-to-a-allowed-cnp\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: pod-to-external-fqdn-allow-baidu-cnp\n  labels:\n    name: pod-to-external-fqdn-allow-baidu-cnp\n    topology: any\n    component: policy-check\n    traffic: external\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: pod-to-external-fqdn-allow-baidu-cnp\n    spec:\n      hostNetwork: false\n      containers:\n      - name: pod-to-external-fqdn-allow-baidu-cnp-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - www.baidu.com\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - www.baidu.com\n  selector:\n    matchLabels:\n      name: pod-to-external-fqdn-allow-baidu-cnp\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: pod-to-b-multi-node-clusterip\n  labels:\n    name: pod-to-b-multi-node-clusterip\n    topology: multi-node\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: pod-to-b-multi-node-clusterip\n    spec:\n      hostNetwork: false\n      containers:\n      - name: pod-to-b-multi-node-clusterip-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b:8080/public\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b:8080/public\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchExpressions:\n              - key: name\n                operator: In\n                values:\n                - echo-b\n            topologyKey: kubernetes.io/hostname\n  selector:\n    matchLabels:\n      name: pod-to-b-multi-node-clusterip\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: pod-to-b-multi-node-headless\n  labels:\n    name: pod-to-b-multi-node-headless\n    topology: multi-node\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: pod-to-b-multi-node-headless\n    spec:\n      hostNetwork: false\n      containers:\n      - name: pod-to-b-multi-node-headless-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b-headless:8080/public\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b-headless:8080/public\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchExpressions:\n              - key: name\n                operator: In\n                values:\n                - echo-b\n            topologyKey: kubernetes.io/hostname\n  selector:\n    matchLabels:\n      name: pod-to-b-multi-node-headless\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: host-to-b-multi-node-clusterip\n  labels:\n    name: host-to-b-multi-node-clusterip\n    topology: multi-node\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: host-to-b-multi-node-clusterip\n    spec:\n      hostNetwork: true\n      containers:\n      - name: host-to-b-multi-node-clusterip-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b:8080/public\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b:8080/public\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchExpressions:\n              - key: name\n                operator: In\n                values:\n                - echo-b\n            topologyKey: kubernetes.io/hostname\n      dnsPolicy: ClusterFirstWithHostNet\n  selector:\n    matchLabels:\n      name: host-to-b-multi-node-clusterip\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: host-to-b-multi-node-headless\n  labels:\n    name: host-to-b-multi-node-headless\n    topology: multi-node\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: host-to-b-multi-node-headless\n    spec:\n      hostNetwork: true\n      containers:\n      - name: host-to-b-multi-node-headless-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b-headless:8080/public\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b-headless:8080/public\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchExpressions:\n              - key: name\n                operator: In\n                values:\n                - echo-b\n            topologyKey: kubernetes.io/hostname\n      dnsPolicy: ClusterFirstWithHostNet\n  selector:\n    matchLabels:\n      name: host-to-b-multi-node-headless\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: pod-to-b-multi-node-nodeport\n  labels:\n    name: pod-to-b-multi-node-nodeport\n    topology: multi-node\n    component: nodeport-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: pod-to-b-multi-node-nodeport\n    spec:\n      hostNetwork: false\n      containers:\n      - name: pod-to-b-multi-node-nodeport-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b-host-headless:31414/public\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b-host-headless:31414/public\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchExpressions:\n              - key: name\n                operator: In\n                values:\n                - echo-b\n            topologyKey: kubernetes.io/hostname\n  selector:\n    matchLabels:\n      name: pod-to-b-multi-node-nodeport\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: pod-to-b-intra-node-nodeport\n  labels:\n    name: pod-to-b-intra-node-nodeport\n    topology: intra-node\n    component: nodeport-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  template:\n    metadata:\n      labels:\n        name: pod-to-b-intra-node-nodeport\n    spec:\n      hostNetwork: false\n      containers:\n      - name: pod-to-b-intra-node-nodeport-container\n        ports: []\n        image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - sleep 1000000000\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b-host-headless:31414/public\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command:\n            - curl\n            - -sS\n            - --fail\n            - --connect-timeout\n            - \"5\"\n            - -o\n            - /dev/null\n            - echo-b-host-headless:31414/public\n      affinity:\n        podAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchExpressions:\n              - key: name\n                operator: In\n                values:\n                - echo-b\n            topologyKey: kubernetes.io/hostname\n  selector:\n    matchLabels:\n      name: pod-to-b-intra-node-nodeport\n  replicas: 1\napiVersion: apps/v1\nkind: Deployment\n---\nmetadata:\n  name: echo-a\n  labels:\n    name: echo-a\n    topology: any\n    component: network-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  ports:\n  - name: http\n    port: 8080\n  type: ClusterIP\n  selector:\n    name: echo-a\napiVersion: v1\nkind: Service\n---\nmetadata:\n  name: echo-b\n  labels:\n    name: echo-b\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  ports:\n  - name: http\n    port: 8080\n    nodePort: 31414\n  type: NodePort\n  selector:\n    name: echo-b\napiVersion: v1\nkind: Service\n---\nmetadata:\n  name: echo-b-headless\n  labels:\n    name: echo-b-headless\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  ports:\n  - name: http\n    port: 8080\n  type: ClusterIP\n  selector:\n    name: echo-b\n  clusterIP: None\napiVersion: v1\nkind: Service\n---\nmetadata:\n  name: echo-b-host-headless\n  labels:\n    name: echo-b-host-headless\n    topology: any\n    component: services-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  ports: []\n  type: ClusterIP\n  selector:\n    name: echo-b-host\n  clusterIP: None\napiVersion: v1\nkind: Service\n---\nmetadata:\n  name: pod-to-a-denied-cnp\n  labels:\n    name: pod-to-a-denied-cnp\n    topology: any\n    component: policy-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  endpointSelector:\n    matchLabels:\n      name: pod-to-a-denied-cnp\n  egress:\n  - toPorts:\n    - ports:\n      - port: \"53\"\n        protocol: ANY\n    toEndpoints:\n    - matchLabels:\n        k8s:io.kubernetes.pod.namespace: kube-system\n        k8s:k8s-app: kube-dns\n  - toPorts:\n    - ports:\n      - port: \"53\"\n        protocol: ANY\n    toCIDR:\n    - {{ LOCAL_DNS_CACHE }}/32\napiVersion: cilium.io/v2\nkind: CiliumNetworkPolicy\n---\nmetadata:\n  name: pod-to-a-allowed-cnp\n  labels:\n    name: pod-to-a-allowed-cnp\n    topology: any\n    component: policy-check\n    traffic: internal\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  endpointSelector:\n    matchLabels:\n      name: pod-to-a-allowed-cnp\n  egress:\n  - toPorts:\n    - ports:\n      - port: \"8080\"\n        protocol: TCP\n    toEndpoints:\n    - matchLabels:\n        name: echo-a\n  - toPorts:\n    - ports:\n      - port: \"53\"\n        protocol: ANY\n    toEndpoints:\n    - matchLabels:\n        k8s:io.kubernetes.pod.namespace: kube-system\n        k8s:k8s-app: kube-dns\n  - toPorts:\n    - ports:\n      - port: \"53\"\n        protocol: ANY\n    toCIDR:\n    - {{ LOCAL_DNS_CACHE }}/32\napiVersion: cilium.io/v2\nkind: CiliumNetworkPolicy\n---\nmetadata:\n  name: pod-to-external-fqdn-allow-baidu-cnp\n  labels:\n    name: pod-to-external-fqdn-allow-baidu-cnp\n    topology: any\n    component: policy-check\n    traffic: external\n    quarantine: \"false\"\n    type: autocheck\nspec:\n  endpointSelector:\n    matchLabels:\n      name: pod-to-external-fqdn-allow-baidu-cnp\n  egress:\n  - toFQDNs:\n    - matchPattern: '*.baidu.com'\n  - toPorts:\n    - ports:\n      - port: \"53\"\n        protocol: ANY\n      rules:\n        dns:\n        - matchPattern: '*'\n    toEndpoints:\n    - matchLabels:\n        k8s:io.kubernetes.pod.namespace: kube-system\n        k8s:k8s-app: kube-dns\n  - toPorts:\n    - ports:\n      - port: \"53\"\n        protocol: ANY\n      rules:\n        dns:\n        - matchPattern: '*'\n    toCIDR:\n    - {{ LOCAL_DNS_CACHE }}/32\napiVersion: cilium.io/v2\nkind: CiliumNetworkPolicy\n"
  },
  {
    "path": "roles/cluster-addon/templates/cilium-check/namespace.yaml.j2",
    "content": "apiVersion: v1\nkind: Namespace\nmetadata:\n  labels:\n    kubernetes.io/metadata.name: cilium-test\n  name: cilium-test\nspec:\n  finalizers:\n  - kubernetes\n"
  },
  {
    "path": "roles/cluster-addon/templates/dashboard/admin-user-sa-rbac.yaml.j2",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: admin-user\n  namespace: kube-system\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: admin-user\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: cluster-admin\nsubjects:\n- kind: ServiceAccount\n  name: admin-user\n  namespace: kube-system\n\n---\napiVersion: v1\nkind: Secret\ntype: kubernetes.io/service-account-token\nmetadata:\n  name: admin-user\n  namespace: kube-system\n  annotations:\n    kubernetes.io/service-account.name: \"admin-user\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/dashboard/dashboard-values.yaml.j2",
    "content": "# General configuration shared across resources\napp:\n  mode: 'dashboard'\n\nauth:\n  image:\n    repository: easzlab.io.local:5000/kubernetesui/dashboard-auth\n\napi:\n  image:\n    repository: easzlab.io.local:5000/kubernetesui/dashboard-api\n\nweb:\n  image:\n    repository: easzlab.io.local:5000/kubernetesui/dashboard-web\n\nmetricsScraper:\n  image:\n    repository: easzlab.io.local:5000/kubernetesui/dashboard-metrics-scraper\n\n## Required Kong sub-chart with DBless configuration to act as a gateway\nkong:\n  enabled: true\n  image:\n    repository: easzlab.io.local:5000/kubernetesui/kong\n  proxy:\n    type: NodePort\n    http:\n      enabled: false\n"
  },
  {
    "path": "roles/cluster-addon/templates/dashboard/read-user-sa-rbac.yaml.j2",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: dashboard-read-user\n  namespace: kube-system\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: dashboard-read-binding\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: dashboard-read-clusterrole\nsubjects:\n- kind: ServiceAccount\n  name: dashboard-read-user\n  namespace: kube-system\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: dashboard-read-clusterrole\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - configmaps\n  - endpoints\n  - nodes\n  - persistentvolumes\n  - persistentvolumeclaims\n  - persistentvolumeclaims/status\n  - pods\n  - replicationcontrollers\n  - replicationcontrollers/scale\n  - serviceaccounts\n  - services\n  - services/status\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - \"\"\n  resources:\n  - bindings\n  - events\n  - limitranges\n  - namespaces/status\n  - pods/log\n  - pods/status\n  - replicationcontrollers/status\n  - resourcequotas\n  - resourcequotas/status\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - \"\"\n  resources:\n  - namespaces\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - apps\n  resources:\n  - controllerrevisions\n  - daemonsets\n  - daemonsets/status\n  - deployments\n  - deployments/scale\n  - deployments/status\n  - replicasets\n  - replicasets/scale\n  - replicasets/status\n  - statefulsets\n  - statefulsets/scale\n  - statefulsets/status\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - autoscaling\n  resources:\n  - horizontalpodautoscalers\n  - horizontalpodautoscalers/status\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - batch\n  resources:\n  - cronjobs\n  - cronjobs/status\n  - jobs\n  - jobs/status\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - extensions\n  resources:\n  - daemonsets\n  - daemonsets/status\n  - deployments\n  - deployments/scale\n  - deployments/status\n  - ingresses\n  - ingresses/status\n  - replicasets\n  - replicasets/scale\n  - replicasets/status\n  - replicationcontrollers/scale\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - policy\n  resources:\n  - poddisruptionbudgets\n  - poddisruptionbudgets/status\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - networking.k8s.io\n  resources:\n  - ingresses\n  - ingresses/status\n  - networkpolicies\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - storage.k8s.io\n  resources:\n  - storageclasses\n  - volumeattachments\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - rbac.authorization.k8s.io\n  resources:\n  - clusterrolebindings\n  - clusterroles\n  - roles\n  - rolebindings\n  verbs:\n  - get\n  - list\n  - watch\n\n---\napiVersion: v1\nkind: Secret\ntype: kubernetes.io/service-account-token\nmetadata:\n  name: dashboard-read-user\n  namespace: kube-system\n  annotations:\n    kubernetes.io/service-account.name: \"dashboard-read-user\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/dns/coredns.yaml.j2",
    "content": "# https://github.com/kubernetes/kubernetes/blob/v1.31.2/cluster/addons/dns/coredns/coredns.yaml.base\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: coredns\n  namespace: kube-system\n  labels:\n      kubernetes.io/cluster-service: \"true\"\n      addonmanager.kubernetes.io/mode: Reconcile\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  labels:\n    kubernetes.io/bootstrapping: rbac-defaults\n    addonmanager.kubernetes.io/mode: Reconcile\n  name: system:coredns\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - endpoints\n  - services\n  - pods\n  - namespaces\n  verbs:\n  - list\n  - watch\n- apiGroups:\n  - discovery.k8s.io\n  resources:\n  - endpointslices\n  verbs:\n  - list\n  - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  annotations:\n    rbac.authorization.kubernetes.io/autoupdate: \"true\"\n  labels:\n    kubernetes.io/bootstrapping: rbac-defaults\n    addonmanager.kubernetes.io/mode: EnsureExists\n  name: system:coredns\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: system:coredns\nsubjects:\n- kind: ServiceAccount\n  name: coredns\n  namespace: kube-system\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: coredns\n  namespace: kube-system\n  labels:\n      addonmanager.kubernetes.io/mode: EnsureExists\ndata:\n  Corefile: |\n    .:53 {\n        errors\n        health {\n            lameduck 5s\n        }\n        ready\n        kubernetes {{ CLUSTER_DNS_DOMAIN }} in-addr.arpa ip6.arpa {\n            pods insecure\n            fallthrough in-addr.arpa ip6.arpa\n            ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf {\n            max_concurrent 1000\n        }\n        cache 30\n        reload\n        loadbalance\n    }\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: coredns\n  namespace: kube-system\n  labels:\n    k8s-app: kube-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"CoreDNS\"\nspec:\n  replicas: 1\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxUnavailable: 1\n  selector:\n    matchLabels:\n      k8s-app: kube-dns\n  template:\n    metadata:\n      labels:\n        k8s-app: kube-dns\n    spec:\n      securityContext:\n        seccompProfile:\n          type: RuntimeDefault\n      priorityClassName: system-cluster-critical\n      serviceAccountName: coredns\n      affinity:\n        podAntiAffinity:\n          preferredDuringSchedulingIgnoredDuringExecution:\n          - weight: 100\n            podAffinityTerm:\n              labelSelector:\n                matchExpressions:\n                  - key: k8s-app\n                    operator: In\n                    values: [\"kube-dns\"]\n              topologyKey: kubernetes.io/hostname\n      tolerations:\n        - key: \"CriticalAddonsOnly\"\n          operator: \"Exists\"\n      nodeSelector:\n        kubernetes.io/os: linux\n      containers:\n      - name: coredns\n        image: easzlab.io.local:5000/easzlab/coredns:{{ corednsVer }}\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: 500Mi\n          requests:\n            cpu: 100m\n            memory: 70Mi\n        args: [ \"-conf\", \"/etc/coredns/Corefile\" ]\n        volumeMounts:\n        - name: config-volume\n          mountPath: /etc/coredns\n          readOnly: true\n        ports:\n        - containerPort: 53\n          name: dns\n          protocol: UDP\n        - containerPort: 53\n          name: dns-tcp\n          protocol: TCP\n        - containerPort: 9153\n          name: metrics\n          protocol: TCP\n        livenessProbe:\n          httpGet:\n            path: /health\n            port: 8080\n            scheme: HTTP\n          initialDelaySeconds: 60\n          timeoutSeconds: 5\n          successThreshold: 1\n          failureThreshold: 5\n        readinessProbe:\n          httpGet:\n            path: /ready\n            port: 8181\n            scheme: HTTP\n        securityContext:\n          allowPrivilegeEscalation: false\n          capabilities:\n            add:\n            - NET_BIND_SERVICE\n            drop:\n            - ALL\n          readOnlyRootFilesystem: true\n      dnsPolicy: Default\n      volumes:\n        - name: config-volume\n          configMap:\n            name: coredns\n            items:\n            - key: Corefile\n              path: Corefile\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: kube-dns\n  namespace: kube-system\n  annotations:\n    prometheus.io/port: \"9153\"\n    prometheus.io/scrape: \"true\"\n  labels:\n    k8s-app: kube-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"CoreDNS\"\nspec:\n  selector:\n    k8s-app: kube-dns\n  clusterIP: {{ CLUSTER_DNS_SVC_IP }}\n  ports:\n  - name: dns\n    port: 53\n    protocol: UDP\n  - name: dns-tcp\n    port: 53\n    protocol: TCP\n  - name: metrics\n    port: 9153\n    protocol: TCP\n"
  },
  {
    "path": "roles/cluster-addon/templates/dns/kubedns.yaml.j2",
    "content": "---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: kube-dns\n  namespace: kube-system\n  labels:\n    addonmanager.kubernetes.io/mode: EnsureExists\n\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: kube-dns\n  namespace: kube-system\n  labels:\n    #kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: kube-dns\n  namespace: kube-system\n  labels:\n    k8s-app: kube-dns\n    #kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"KubeDNS\"\nspec:\n  selector:\n    k8s-app: kube-dns\n  clusterIP: {{ CLUSTER_DNS_SVC_IP }}\n  ports:\n  - name: dns\n    port: 53\n    protocol: UDP\n  - name: dns-tcp\n    port: 53\n    protocol: TCP\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kube-dns\n  namespace: kube-system\n  labels:\n    k8s-app: kube-dns\n    #kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  # replicas: not specified here:\n  # 1. In order to make Addon Manager do not reconcile this replicas parameter.\n  # 2. Default is 1.\n  # 3. Will be tuned in real time if DNS horizontal auto-scaling is turned on.\n  strategy:\n    rollingUpdate:\n      maxSurge: 10%\n      maxUnavailable: 0\n  selector:\n    matchLabels:\n      k8s-app: kube-dns\n  template:\n    metadata:\n      labels:\n        k8s-app: kube-dns\n    spec:\n      priorityClassName: system-cluster-critical\n      tolerations:\n      - key: \"CriticalAddonsOnly\"\n        operator: \"Exists\"\n      volumes:\n      - name: kube-dns-config\n        configMap:\n          name: kube-dns\n          optional: true\n      containers:\n      - name: kubedns\n        #image: gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.13\n        image: mirrorgooglecontainers/k8s-dns-kube-dns-amd64:1.14.13\n        resources:\n          # TODO: Set memory limits when we've profiled the container for large\n          # clusters, then set request = limit to keep this container in\n          # guaranteed class. Currently, this container falls into the\n          # \"burstable\" category so the kubelet doesn't backoff from restarting it.\n          limits:\n            memory: 170Mi\n          requests:\n            cpu: 100m\n            memory: 70Mi\n        livenessProbe:\n          httpGet:\n            path: /healthcheck/kubedns\n            port: 10054\n            scheme: HTTP\n          initialDelaySeconds: 60\n          timeoutSeconds: 5\n          successThreshold: 1\n          failureThreshold: 5\n        readinessProbe:\n          httpGet:\n            path: /readiness\n            port: 8081\n            scheme: HTTP\n          # we poll on pod startup for the Kubernetes master service and\n          # only setup the /readiness HTTP server once that's available.\n          initialDelaySeconds: 3\n          timeoutSeconds: 5\n        args:\n        - --domain={{ CLUSTER_DNS_DOMAIN }}\n        - --dns-port=10053\n        - --config-dir=/kube-dns-config\n        - --v=2\n        env:\n        - name: PROMETHEUS_PORT\n          value: \"10055\"\n        ports:\n        - containerPort: 10053\n          name: dns-local\n          protocol: UDP\n        - containerPort: 10053\n          name: dns-tcp-local\n          protocol: TCP\n        - containerPort: 10055\n          name: metrics\n          protocol: TCP\n        volumeMounts:\n        - name: kube-dns-config\n          mountPath: /kube-dns-config\n      - name: dnsmasq\n        #image: gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.13\n        image: mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.13\n        livenessProbe:\n          httpGet:\n            path: /healthcheck/dnsmasq\n            port: 10054\n            scheme: HTTP\n          initialDelaySeconds: 60\n          timeoutSeconds: 5\n          successThreshold: 1\n          failureThreshold: 5\n        args:\n        - -v=2\n        - -logtostderr\n        - -configDir=/etc/k8s/dns/dnsmasq-nanny\n        - -restartDnsmasq=true\n        - --\n        - -k\n        - --cache-size=1000\n        - --log-facility=-\n        - --server=/{{ CLUSTER_DNS_DOMAIN }}/127.0.0.1#10053\n        - --server=/in-addr.arpa/127.0.0.1#10053\n        - --server=/ip6.arpa/127.0.0.1#10053\n        ports:\n        - containerPort: 53\n          name: dns\n          protocol: UDP\n        - containerPort: 53\n          name: dns-tcp\n          protocol: TCP\n        # see: https://github.com/kubernetes/kubernetes/issues/29055 for details\n        resources:\n          requests:\n            cpu: 150m\n            memory: 20Mi\n        volumeMounts:\n        - name: kube-dns-config\n          mountPath: /etc/k8s/dns/dnsmasq-nanny\n      - name: sidecar\n        #image: gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.13\n        image: mirrorgooglecontainers/k8s-dns-sidecar-amd64:1.14.13\n        livenessProbe:\n          httpGet:\n            path: /metrics\n            port: 10054\n            scheme: HTTP\n          initialDelaySeconds: 60\n          timeoutSeconds: 5\n          successThreshold: 1\n          failureThreshold: 5\n        args:\n        - --v=2\n        - --logtostderr\n        - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.{{ CLUSTER_DNS_DOMAIN }},5,A\n        - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.{{ CLUSTER_DNS_DOMAIN }},5,A\n        ports:\n        - containerPort: 10054\n          name: metrics\n          protocol: TCP\n        resources:\n          requests:\n            memory: 20Mi\n            cpu: 10m\n      dnsPolicy: Default  # Don't use cluster DNS.\n      serviceAccountName: kube-dns\n"
  },
  {
    "path": "roles/cluster-addon/templates/dns/nodelocaldns-iptables.yaml.j2",
    "content": "# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: kube-dns-upstream\n  namespace: kube-system\n  labels:\n    k8s-app: kube-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"KubeDNSUpstream\"\nspec:\n  ports:\n  - name: dns\n    port: 53\n    protocol: UDP\n    targetPort: 53\n  - name: dns-tcp\n    port: 53\n    protocol: TCP\n    targetPort: 53\n  selector:\n    k8s-app: kube-dns\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    addonmanager.kubernetes.io/mode: Reconcile\ndata:\n  Corefile: |\n    {{ CLUSTER_DNS_DOMAIN }}:53 {\n        errors\n        cache {\n                success 9984 30\n                denial 9984 10\n        }\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }} {{ CLUSTER_DNS_SVC_IP }}\n        forward . __PILLAR__CLUSTER__DNS__ {\n                force_tcp\n        }\n        prometheus :9253\n        health {{ LOCAL_DNS_CACHE }}:8099\n        }\n    in-addr.arpa:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }} {{ CLUSTER_DNS_SVC_IP }}\n        forward . __PILLAR__CLUSTER__DNS__ {\n                force_tcp\n        }\n        prometheus :9253\n        }\n    ip6.arpa:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }} {{ CLUSTER_DNS_SVC_IP }}\n        forward . __PILLAR__CLUSTER__DNS__ {\n                force_tcp\n        }\n        prometheus :9253\n        }\n    .:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }} {{ CLUSTER_DNS_SVC_IP }}\n        forward . __PILLAR__UPSTREAM__SERVERS__\n        prometheus :9253\n        }\n---\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    k8s-app: node-local-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  updateStrategy:\n    rollingUpdate:\n      maxUnavailable: 10%\n  selector:\n    matchLabels:\n      k8s-app: node-local-dns\n  template:\n    metadata:\n      labels:\n        k8s-app: node-local-dns\n      annotations:\n        prometheus.io/port: \"9253\"\n        prometheus.io/scrape: \"true\"\n    spec:\n      priorityClassName: system-node-critical\n      serviceAccountName: node-local-dns\n      hostNetwork: true\n      dnsPolicy: Default  # Don't use cluster DNS.\n      tolerations:\n      - key: \"CriticalAddonsOnly\"\n        operator: \"Exists\"\n      - effect: \"NoExecute\"\n        operator: \"Exists\"\n      - effect: \"NoSchedule\"\n        operator: \"Exists\"\n      containers:\n      - name: node-cache\n        image: easzlab.io.local:5000/easzlab/k8s-dns-node-cache:{{ dnsNodeCacheVer }}\n        resources:\n          requests:\n            cpu: 25m\n            memory: 5Mi\n        args: [ \"-localip\", \"{{ LOCAL_DNS_CACHE }},{{ CLUSTER_DNS_SVC_IP }}\", \"-conf\", \"/etc/Corefile\", \"-upstreamsvc\", \"kube-dns-upstream\" ]\n        securityContext:\n          capabilities:\n            add:\n            - NET_ADMIN\n        ports:\n        - containerPort: 53\n          name: dns\n          protocol: UDP\n        - containerPort: 53\n          name: dns-tcp\n          protocol: TCP\n        - containerPort: 9253\n          name: metrics\n          protocol: TCP\n        livenessProbe:\n          httpGet:\n            host: {{ LOCAL_DNS_CACHE }}\n            path: /health\n            port: 8099\n          initialDelaySeconds: 60\n          timeoutSeconds: 5\n        volumeMounts:\n        - mountPath: /run/xtables.lock\n          name: xtables-lock\n          readOnly: false\n        - name: config-volume\n          mountPath: /etc/coredns\n        - name: kube-dns-config\n          mountPath: /etc/kube-dns\n      volumes:\n      - name: xtables-lock\n        hostPath:\n          path: /run/xtables.lock\n          type: FileOrCreate\n      - name: kube-dns-config\n        configMap:\n          name: kube-dns\n          optional: true\n      - name: config-volume\n        configMap:\n          name: node-local-dns\n          items:\n            - key: Corefile\n              path: Corefile.base\n---\n# A headless service is a service with a service IP but instead of load-balancing it will return the IPs of our associated Pods.\n# We use this to expose metrics to Prometheus.\napiVersion: v1\nkind: Service\nmetadata:\n  annotations:\n    prometheus.io/port: \"9253\"\n    prometheus.io/scrape: \"true\"\n  labels:\n    k8s-app: node-local-dns\n  name: node-local-dns\n  namespace: kube-system\nspec:\n  clusterIP: None\n  ports:\n    - name: metrics\n      port: 9253\n      targetPort: 9253\n  selector:\n    k8s-app: node-local-dns\n"
  },
  {
    "path": "roles/cluster-addon/templates/dns/nodelocaldns-ipvs.yaml.j2",
    "content": "# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: kube-dns-upstream\n  namespace: kube-system\n  labels:\n    k8s-app: kube-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"KubeDNSUpstream\"\nspec:\n  ports:\n  - name: dns\n    port: 53\n    protocol: UDP\n    targetPort: 53\n  - name: dns-tcp\n    port: 53\n    protocol: TCP\n    targetPort: 53\n  selector:\n    k8s-app: kube-dns\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    addonmanager.kubernetes.io/mode: Reconcile\ndata:\n  Corefile: |\n    {{ CLUSTER_DNS_DOMAIN }}:53 {\n        errors\n        cache {\n                success 9984 30\n                denial 9984 10\n        }\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }}\n        forward . {{ CLUSTER_DNS_SVC_IP }} {\n                force_tcp\n        }\n        prometheus :9253\n        health {{ LOCAL_DNS_CACHE }}:8099\n        }\n    in-addr.arpa:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }}\n        forward . {{ CLUSTER_DNS_SVC_IP }} {\n                force_tcp\n        }\n        prometheus :9253\n        }\n    ip6.arpa:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }}\n        forward . {{ CLUSTER_DNS_SVC_IP }} {\n                force_tcp\n        }\n        prometheus :9253\n        }\n    .:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }}\n        forward . __PILLAR__UPSTREAM__SERVERS__\n        prometheus :9253\n        }\n---\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    k8s-app: node-local-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  updateStrategy:\n    rollingUpdate:\n      maxUnavailable: 10%\n  selector:\n    matchLabels:\n      k8s-app: node-local-dns\n  template:\n    metadata:\n      labels:\n        k8s-app: node-local-dns\n      annotations:\n        prometheus.io/port: \"9253\"\n        prometheus.io/scrape: \"true\"\n    spec:\n      priorityClassName: system-node-critical\n      serviceAccountName: node-local-dns\n      hostNetwork: true\n      dnsPolicy: Default  # Don't use cluster DNS.\n      tolerations:\n      - key: \"CriticalAddonsOnly\"\n        operator: \"Exists\"\n      - effect: \"NoExecute\"\n        operator: \"Exists\"\n      - effect: \"NoSchedule\"\n        operator: \"Exists\"\n      containers:\n      - name: node-cache\n        image: easzlab.io.local:5000/easzlab/k8s-dns-node-cache:{{ dnsNodeCacheVer }}\n        resources:\n          requests:\n            cpu: 25m\n            memory: 5Mi\n        args: [ \"-localip\", \"{{ LOCAL_DNS_CACHE }}\", \"-conf\", \"/etc/Corefile\", \"-upstreamsvc\", \"kube-dns-upstream\" ]\n        securityContext:\n          capabilities:\n            add:\n            - NET_ADMIN\n        ports:\n        - containerPort: 53\n          name: dns\n          protocol: UDP\n        - containerPort: 53\n          name: dns-tcp\n          protocol: TCP\n        - containerPort: 9253\n          name: metrics\n          protocol: TCP\n        livenessProbe:\n          httpGet:\n            host: {{ LOCAL_DNS_CACHE }}\n            path: /health\n            port: 8099\n          initialDelaySeconds: 60\n          timeoutSeconds: 5\n        volumeMounts:\n        - mountPath: /run/xtables.lock\n          name: xtables-lock\n          readOnly: false\n        - name: config-volume\n          mountPath: /etc/coredns\n        - name: kube-dns-config\n          mountPath: /etc/kube-dns\n      volumes:\n      - name: xtables-lock\n        hostPath:\n          path: /run/xtables.lock\n          type: FileOrCreate\n      - name: kube-dns-config\n        configMap:\n          name: kube-dns\n          optional: true\n      - name: config-volume\n        configMap:\n          name: node-local-dns\n          items:\n            - key: Corefile\n              path: Corefile.base\n---\n# A headless service is a service with a service IP but instead of load-balancing it will return the IPs of our associated Pods.\n# We use this to expose metrics to Prometheus.\napiVersion: v1\nkind: Service\nmetadata:\n  annotations:\n    prometheus.io/port: \"9253\"\n    prometheus.io/scrape: \"true\"\n  labels:\n    k8s-app: node-local-dns\n  name: node-local-dns\n  namespace: kube-system\nspec:\n  clusterIP: None\n  ports:\n    - name: metrics\n      port: 9253\n      targetPort: 9253\n  selector:\n    k8s-app: node-local-dns\n"
  },
  {
    "path": "roles/cluster-addon/templates/ingress-nginx/nginx.json",
    "content": "{\n  \"__inputs\": [\n    {\n      \"name\": \"DS_PROMETHEUS\",\n      \"label\": \"Prometheus\",\n      \"description\": \"\",\n      \"type\": \"datasource\",\n      \"pluginId\": \"prometheus\",\n      \"pluginName\": \"Prometheus\"\n    }\n  ],\n  \"__elements\": {},\n  \"__requires\": [\n    {\n      \"type\": \"grafana\",\n      \"id\": \"grafana\",\n      \"name\": \"Grafana\",\n      \"version\": \"10.4.3\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"heatmap\",\n      \"name\": \"Heatmap\",\n      \"version\": \"\"\n    },\n    {\n      \"type\": \"datasource\",\n      \"id\": \"prometheus\",\n      \"name\": \"Prometheus\",\n      \"version\": \"1.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"stat\",\n      \"name\": \"Stat\",\n      \"version\": \"\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"table\",\n      \"name\": \"Table\",\n      \"version\": \"\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"timeseries\",\n      \"name\": \"Time series\",\n      \"version\": \"\"\n    }\n  ],\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${DS_PROMETHEUS}\"\n        },\n        \"enable\": true,\n        \"expr\": \"sum(changes(nginx_ingress_controller_config_last_reload_successful_timestamp_seconds{instance!=\\\"unknown\\\",controller_class=~\\\"$controller_class\\\",namespace=~\\\"$namespace\\\"}[30s])) by (controller_class)\",\n        \"hide\": false,\n        \"iconColor\": \"rgba(255, 96, 96, 1)\",\n        \"limit\": 100,\n        \"name\": \"Config Reloads\",\n        \"showIn\": 0,\n        \"step\": \"30s\",\n        \"tagKeys\": \"controller_class\",\n        \"tags\": [],\n        \"titleFormat\": \"Config Reloaded\",\n        \"type\": \"tags\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ops\"\n        },\n        \"overrides\": []\n      },\n      \"id\": 20,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"round(sum(irate(nginx_ingress_controller_requests{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",namespace=~\\\"$namespace\\\"}[2m])), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"title\": \"Controller Request Volume\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 0\n      },\n      \"id\": 82,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"sum(avg_over_time(nginx_ingress_controller_nginx_process_connections{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",state=\\\"active\\\"}[2m]))\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"title\": \"Controller Connections\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 95\n              },\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": 99\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 21,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"sum(rate(nginx_ingress_controller_requests{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",namespace=~\\\"$namespace\\\",status!~\\\"[4-5].*\\\"}[2m])) / sum(rate(nginx_ingress_controller_requests{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",namespace=~\\\"$namespace\\\"}[2m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"title\": \"Controller Success Rate (non-4|5xx responses)\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 18,\n        \"y\": 0\n      },\n      \"id\": 81,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"sum\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"avg(irate(nginx_ingress_controller_success{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\"}[1m])) * 60\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"title\": \"Config Reloads\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 21,\n        \"y\": 0\n      },\n      \"id\": 83,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"count(nginx_ingress_controller_config_last_reload_successful{controller_pod=~\\\"$controller\\\",controller_namespace=~\\\"$namespace\\\"} == 0)\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"title\": \"Last Config Failed\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"reqps\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byValue\",\n              \"options\": {\n                \"op\": \"gte\",\n                \"reducer\": \"allIsZero\",\n                \"value\": 0\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": true,\n                  \"tooltip\": true,\n                  \"viz\": false\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 3\n      },\n      \"id\": 86,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"repeatDirection\": \"h\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"round(sum(irate(nginx_ingress_controller_requests{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",exported_namespace=~\\\"$exported_namespace\\\",ingress=~\\\"$ingress\\\"}[2m])) by (ingress), 0.001)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ ingress }}\",\n          \"metric\": \"network\",\n          \"refId\": \"A\",\n          \"step\": 10\n        }\n      ],\n      \"title\": \"Ingress Request Volume\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"max - istio-proxy\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#890f02\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"max - master\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#bf1b00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"max - prometheus\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#bf1b00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byValue\",\n              \"options\": {\n                \"op\": \"gte\",\n                \"reducer\": \"allIsNull\",\n                \"value\": 0\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": true,\n                  \"tooltip\": true,\n                  \"viz\": false\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 3\n      },\n      \"id\": 87,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"asc\"\n        }\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"sum(rate(nginx_ingress_controller_requests{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",namespace=~\\\"$namespace\\\",exported_namespace=~\\\"$exported_namespace\\\",ingress=~\\\"$ingress\\\",status!~\\\"[4-5].*\\\"}[2m])) by (ingress) / sum(rate(nginx_ingress_controller_requests{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",namespace=~\\\"$namespace\\\",exported_namespace=~\\\"$exported_namespace\\\",ingress=~\\\"$ingress\\\"}[2m])) by (ingress)\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"10s\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ ingress }}\",\n          \"metric\": \"container_memory_usage:sort_desc\",\n          \"refId\": \"A\",\n          \"step\": 10\n        }\n      ],\n      \"title\": \"Ingress Success Rate (non-4|5xx responses)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"Bps\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 10\n      },\n      \"id\": 32,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false,\n          \"width\": 200\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"sum (irate (nginx_ingress_controller_request_size_sum{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\"}[2m]))\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"10s\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Received\",\n          \"metric\": \"network\",\n          \"refId\": \"A\",\n          \"step\": 10\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"- sum (irate (nginx_ingress_controller_response_size_sum{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\"}[2m]))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"10s\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Sent\",\n          \"metric\": \"network\",\n          \"refId\": \"B\",\n          \"step\": 10\n        }\n      ],\n      \"title\": \"Network I/O pressure\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"max - istio-proxy\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#890f02\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"max - master\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#bf1b00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"max - prometheus\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#bf1b00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 10\n      },\n      \"id\": 77,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false,\n          \"width\": 200\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"desc\"\n        }\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"avg(nginx_ingress_controller_nginx_process_resident_memory_bytes{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\"}) \",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"10s\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"nginx\",\n          \"metric\": \"container_memory_usage:sort_desc\",\n          \"refId\": \"A\",\n          \"step\": 10\n        }\n      ],\n      \"title\": \"Average Memory Usage\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"cores\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"line+area\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"transparent\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 10\n      },\n      \"id\": 79,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"desc\"\n        }\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"avg (rate (nginx_ingress_controller_nginx_process_cpu_seconds_total{controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\"}[2m])) \",\n          \"format\": \"time_series\",\n          \"interval\": \"10s\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"nginx\",\n          \"metric\": \"container_cpu\",\n          \"refId\": \"A\",\n          \"step\": 10\n        }\n      ],\n      \"title\": \"Average CPU Usage\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"description\": \"This data is real time, independent of dashboard time range\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"cellOptions\": {\n              \"type\": \"auto\"\n            },\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"ingress\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"Ingress\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Value #A\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"P50 Latency\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"dtdurations\"\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Value #B\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"P90 Latency\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"dtdurations\"\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Value #C\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"P99 Latency\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"dtdurations\"\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Value #D\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"IN\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"Bps\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.align\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"rgba(245, 54, 54, 0.9)\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"rgba(237, 129, 40, 0.89)\"\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Time\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.align\"\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Value #E\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"OUT\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"Bps\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"hideTimeOverride\": false,\n      \"id\": 75,\n      \"options\": {\n        \"cellHeight\": \"sm\",\n        \"footer\": {\n          \"countRows\": false,\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"repeatDirection\": \"h\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"histogram_quantile(0.50, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\\\"\\\",controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\",exported_namespace=~\\\"$exported_namespace\\\"}[2m])) by (le, ingress))\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ ingress }}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"histogram_quantile(0.90, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\\\"\\\",controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\",exported_namespace=~\\\"$exported_namespace\\\"}[2m])) by (le, ingress))\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ ingress }}\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\\\"\\\",controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\",exported_namespace=~\\\"$exported_namespace\\\"}[2m])) by (le, ingress))\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }}\",\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"sum(irate(nginx_ingress_controller_request_size_sum{ingress!=\\\"\\\",controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\",exported_namespace=~\\\"$exported_namespace\\\"}[2m])) by (ingress)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ ingress }}\",\n          \"refId\": \"D\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"sum(irate(nginx_ingress_controller_response_size_sum{ingress!=\\\"\\\",controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\",exported_namespace=~\\\"$exported_namespace\\\"}[2m])) by (ingress)\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ ingress }}\",\n          \"refId\": \"E\"\n        }\n      ],\n      \"title\": \"Ingress Percentile Response Times and Transfer Rates\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {\n            \"reducers\": []\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"hideTimeOverride\": false,\n      \"id\": 91,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"8.3.4\",\n      \"repeatDirection\": \"h\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"histogram_quantile(0.80, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\\\"\\\",controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\",exported_namespace=~\\\"$exported_namespace\\\"}[2m])) by (le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P80\",\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"histogram_quantile(0.90, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\\\"\\\",controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\",exported_namespace=~\\\"$exported_namespace\\\"}[2m])) by (le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P90\",\n          \"refId\": \"D\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\\\"\\\",controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\",exported_namespace=~\\\"$exported_namespace\\\"}[2m])) by (le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P99\",\n          \"refId\": \"E\"\n        }\n      ],\n      \"title\": \"Ingress Percentile Response Times (Ingress Namespaces)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"cards\": {},\n      \"color\": {\n        \"cardColor\": \"#b4ff00\",\n        \"colorScale\": \"sqrt\",\n        \"colorScheme\": \"interpolateWarm\",\n        \"exponent\": 0.5,\n        \"mode\": \"spectrum\"\n      },\n      \"dataFormat\": \"tsbuckets\",\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            }\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 24\n      },\n      \"heatmap\": {},\n      \"hideZeroBuckets\": false,\n      \"highlightCards\": true,\n      \"id\": 89,\n      \"legend\": {\n        \"show\": true\n      },\n      \"options\": {\n        \"calculate\": false,\n        \"calculation\": {},\n        \"cellGap\": 2,\n        \"cellValues\": {},\n        \"color\": {\n          \"exponent\": 0.5,\n          \"fill\": \"#b4ff00\",\n          \"mode\": \"scheme\",\n          \"reverse\": false,\n          \"scale\": \"exponential\",\n          \"scheme\": \"Warm\",\n          \"steps\": 128\n        },\n        \"exemplars\": {\n          \"color\": \"rgba(255,0,255,0.7)\"\n        },\n        \"filterValues\": {\n          \"le\": 1e-9\n        },\n        \"legend\": {\n          \"show\": true\n        },\n        \"rowsFrame\": {\n          \"layout\": \"auto\"\n        },\n        \"showValue\": \"never\",\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"showColorScale\": false,\n          \"yHistogram\": true\n        },\n        \"yAxis\": {\n          \"axisPlacement\": \"left\",\n          \"reverse\": false,\n          \"unit\": \"s\"\n        }\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"reverseYBuckets\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(increase(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\\\"\\\",controller_pod=~\\\"$controller\\\",controller_class=~\\\"$controller_class\\\",controller_namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\",exported_namespace=~\\\"$exported_namespace\\\"}[2m])) by (le)\",\n          \"format\": \"heatmap\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{le}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Ingress Request Latency Heatmap (Ingress Namespaces)\",\n      \"tooltip\": {\n        \"show\": true,\n        \"showHistogram\": true\n      },\n      \"type\": \"heatmap\",\n      \"xAxis\": {\n        \"show\": true\n      },\n      \"yAxis\": {\n        \"format\": \"s\",\n        \"logBase\": 1,\n        \"show\": true\n      },\n      \"yBucketBound\": \"auto\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"cellOptions\": {\n              \"type\": \"auto\"\n            },\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"displayName\": \"\",\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Last *\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"TTL\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              },\n              {\n                \"id\": \"custom.cellOptions\",\n                \"value\": {\n                  \"type\": \"color-background\"\n                }\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"rgba(245, 54, 54, 0.9)\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"rgba(237, 129, 40, 0.89)\",\n                      \"value\": 0\n                    },\n                    {\n                      \"color\": \"rgba(50, 172, 45, 0.97)\",\n                      \"value\": 691200\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Field\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"Host\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 31\n      },\n      \"id\": 85,\n      \"options\": {\n        \"cellHeight\": \"sm\",\n        \"footer\": {\n          \"countRows\": false,\n          \"enablePagination\": false,\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"10.4.3\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"avg(nginx_ingress_controller_ssl_expire_time_seconds{kubernetes_pod_name=~\\\"$controller\\\",namespace=~\\\"$namespace\\\",ingress=~\\\"$ingress\\\"}) by (host) - time()\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ host }}\",\n          \"metric\": \"gke_letsencrypt_cert_expiration\",\n          \"refId\": \"A\",\n          \"step\": 1\n        }\n      ],\n      \"title\": \"Ingress Certificate Expiry\",\n      \"transformations\": [\n        {\n          \"id\": \"reduce\",\n          \"options\": {\n            \"includeTimeField\": false,\n            \"labelsToFields\": false,\n            \"reducers\": [\n              \"lastNotNull\"\n            ]\n          }\n        }\n      ],\n      \"type\": \"table\"\n    }\n  ],\n  \"refresh\": \"5s\",\n  \"schemaVersion\": 39,\n  \"tags\": [\n    \"nginx\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"Prometheus\",\n          \"value\": \"${DS_PROMETHEUS}\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"datasource\",\n        \"multi\": false,\n        \"name\": \"DS_PROMETHEUS\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"allValue\": \".*\",\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${DS_PROMETHEUS}\"\n        },\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Namespace\",\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": \"label_values(nginx_ingress_controller_config_hash, controller_namespace)\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": \".*\",\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${DS_PROMETHEUS}\"\n        },\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Controller Class\",\n        \"multi\": false,\n        \"name\": \"controller_class\",\n        \"options\": [],\n        \"query\": \"label_values(nginx_ingress_controller_config_hash{namespace=~\\\"$namespace\\\"}, controller_class) \",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": \".*\",\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${DS_PROMETHEUS}\"\n        },\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Controller\",\n        \"multi\": false,\n        \"name\": \"controller\",\n        \"options\": [],\n        \"query\": \"label_values(nginx_ingress_controller_config_hash{namespace=~\\\"$namespace\\\",controller_class=~\\\"$controller_class\\\"}, controller_pod) \",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": \".*\",\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${DS_PROMETHEUS}\"\n        },\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Ingress Namespace\",\n        \"multi\": false,\n        \"name\": \"exported_namespace\",\n        \"options\": [],\n        \"query\": \"label_values(nginx_ingress_controller_requests{namespace=~\\\"$namespace\\\",controller_class=~\\\"$controller_class\\\",controller_pod=~\\\"$controller\\\"}, exported_namespace) \",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": \".*\",\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${DS_PROMETHEUS}\"\n        },\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Ingress\",\n        \"multi\": false,\n        \"name\": \"ingress\",\n        \"options\": [],\n        \"query\": \"label_values(nginx_ingress_controller_requests{namespace=~\\\"$namespace\\\",controller_class=~\\\"$controller_class\\\",controller_pod=~\\\"$controller\\\",exported_namespace=~\\\"$exported_namespace\\\"}, ingress) \",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-1h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"2m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"NGINX Ingress controller\",\n  \"uid\": \"nginx\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "roles/cluster-addon/templates/ingress-nginx/values.yaml.j2",
    "content": "global:\n  image:\n    registry: easzlab.io.local:5000\n\ncontroller:\n  image:\n    image: easzlab/ingress-nginx-controller\n    tag: \"v1.13.0\"\n    digest: ''\n  dnsPolicy: ClusterFirstWithHostNet\n  reportNodeInternalIp: true\n  hostNetwork: true \n\n  # Limit the scope of the controller to a specific namespace\n  scope:\n    enabled: false\n\n  # -- Node labels for controller pod assignment\n  nodeSelector:\n    kubernetes.io/os: linux\n    ingress-controller/provider: ingress-nginx\n\n  resources:\n    limits:\n      cpu: 200m\n      memory: 200Mi\n\n  config:\n    proxy-body-size: \"0\"\n\n  admissionWebhooks:\n    enabled: false\n    patch:\n      enabled: true\n      image:\n        image: easzlab/kube-webhook-certgen\n        tag: v1.6.0\n        digest: ''\n    certManager:\n      enabled: false\n\n  metrics:\n    port: 10254\n    portName: metrics\n    # if this port is changed, change healthz-port: in extraArgs: accordingly\n    enabled: {% if ingress_nginx_metrics_enabled %}true{% else %}false{% endif %} \n    serviceMonitor:\n      enabled: true\n      additionalLabels:\n        release: \"prometheus\" \n    prometheusRule:\n      enabled: true \n      rules:\n        - alert: NGINXConfigFailed\n          expr: count(nginx_ingress_controller_config_last_reload_successful == 0) > 0\n          for: 1s\n          labels:\n            severity: critical\n          annotations:\n            description: bad ingress config - nginx config test failed\n            summary: uninstall the latest ingress changes to allow config reloads to resume\n        - alert: NGINXCertificateExpiry\n          expr: (avg(nginx_ingress_controller_ssl_expire_time_seconds{host!=\"_\"}) by (host) - time()) < 604800\n          for: 1s\n          labels:\n            severity: critical\n          annotations:\n            description: ssl certificate(s) will expire in less then a week\n            summary: renew expiring certificates to avoid downtime\n        - alert: NGINXTooMany500s\n          expr: 100 * ( sum( nginx_ingress_controller_requests{status=~\"5.+\"} ) / sum(nginx_ingress_controller_requests) ) > 5\n          for: 1m\n          labels:\n            severity: warning\n          annotations:\n            description: Too many 5XXs\n            summary: More than 5% of all requests returned 5XX, this requires your attention\n        - alert: NGINXTooMany400s\n          expr: 100 * ( sum( nginx_ingress_controller_requests{status=~\"4.+\"} ) / sum(nginx_ingress_controller_requests) ) > 5\n          for: 1m\n          labels:\n            severity: warning\n          annotations:\n            description: Too many 4XXs\n            summary: More than 5% of all requests returned 4XX, this requires your attention\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/clickhouse/001.standalone.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: clickhouse-standalone\nspec:\n  clusterDef: clickhouse\n  topology: standalone\n  terminationPolicy: Delete\n  componentSpecs:\n    - name: clickhouse\n      replicas: 1\n      resources:\n        limits:\n          cpu: '1'\n          memory: 2Gi\n        requests:\n          cpu: '1'\n          memory: 2Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"openebs-hostpath\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/clickhouse/002.cluster.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: clickhouse-cluster\nspec:\n  clusterDef: clickhouse\n  topology: cluster\n  terminationPolicy: Delete\n  componentSpecs:\n    - name: clickhouse\n      replicas: 2\n      resources:\n        limits:\n          cpu: '1'\n          memory: 2Gi\n        requests:\n          cpu: '1'\n          memory: 2Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"openebs-hostpath\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 10Gi\n    - name: ch-keeper\n      replicas: 1\n      resources:\n        limits:\n          cpu: '1'\n          memory: 2Gi\n        requests:\n          cpu: '1'\n          memory: 2Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"openebs-hostpath\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 10Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/clickhouse/108.reconf.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: ch-reconfiguring\nspec:\n  clusterName: clickhouse-cluster\n  # Instructs the system to bypass pre-checks (including cluster state checks and customized pre-conditions hooks) and immediately execute the opsRequest, except for the opsRequest of 'Start' type, which will still undergo pre-checks even if `force` is true.  Note: Once set, the `force` field is immutable and cannot be updated.\n  force: false\n  reconfigures:\n  - componentName: clickhouse\n    parameters:\n      # Represents the name of the parameter that is to be updated.\n    - key: clickhouse.profiles.web.max_bytes_to_read\n      # Represents the parameter values that are to be updated.\n      # If set to nil, the parameter defined by the Key field will be removed from the configuration file.\n      value: '200000000000'\n  # Specifies the maximum number of seconds the OpsRequest will wait for its start conditions to be met before aborting. If set to 0 (default), the start conditions must be met immediately for the OpsRequest to proceed.\n  preConditionDeadlineSeconds: 0\n  type: Reconfiguring\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/clickhouse/131.pod-monitor.yaml",
    "content": "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n  name: clickhouse-pod-monitor\n  namespace: monitor    # prometheus namespace\n  labels:               # this is labels set in `prometheus.spec.podMonitorSelector`\n    release: prometheus\nspec:\n  jobLabel: app.kubernetes.io/managed-by\n  # defines the labels which are transferred from the\n  # associated Kubernetes `Pod` object onto the ingested metrics\n  # set the lables w.r.t you own needs\n  podTargetLabels:\n  - app.kubernetes.io/instance\n  - app.kubernetes.io/managed-by\n  - apps.kubeblocks.io/component-name\n  - apps.kubeblocks.io/pod-name\n  podMetricsEndpoints:\n    - path: /metrics\n      port: http-metrics\n      scheme: http\n  namespaceSelector:\n    matchNames:\n      - default \n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: clickhouse-cluster # set cluster name\n      apps.kubeblocks.io/component-name: clickhouse\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/clickhouse/clickhouse-conn.py",
    "content": "import clickhouse_connect\nfrom clickhouse_connect.driver.exceptions import ClickHouseError\n\nCLICKHOUSE_HOST = 'localhost'\nCLICKHOUSE_PORT = 8123 # for http port, use 8443 when TLS is enabled\nCLICKHOUSE_USER = 'admin'\nCLICKHOUSE_PASSWORD = 'password123'\nCLICKHOUSE_DATABASE = 'default'\n\ntry:\n  client = clickhouse_connect.get_client(\n          host=CLICKHOUSE_HOST,\n          port=CLICKHOUSE_PORT,\n          user=CLICKHOUSE_USER,\n          password=CLICKHOUSE_PASSWORD,\n          database=CLICKHOUSE_DATABASE\n      )\n  print(\"connected to clickhouse\")\n\n  create_local_table_query = \"\"\"\n  CREATE TABLE my_table ON CLUSTER default (\n    id UInt32,\n    sku_id String,\n    total_amount Decimal(16,2),\n    create_time  Datetime\n  ) ENGINE=ReplicatedMergeTree('/clickhouse/tables/{shard}/my_table', '{replica}')\n    PARTITION BY toYYYYMMDD(create_time)\n    PRIMARY KEY (id)\n    ORDER BY (id, sku_id);\n  \"\"\"\n\n  create_distributed_table_query = \"\"\"\n  CREATE TABLE my_table_dist ON CLUSTER default (\n    id UInt32,\n    sku_id String,\n    total_amount Decimal(16,2),\n    create_time  Datetime\n  ) ENGINE=Distributed(default, default, my_table, hiveHash(sku_id));\n  \"\"\"\n\n  # create table\n  client.command(create_local_table_query)\n  client.command(create_distributed_table_query)\n\n  insert_query = \"\"\"\n  INSERT INTO my_table_dist (id, sku_id, total_amount, create_time) VALUES\n  (1, 'SKU001', 100.00, '2023-10-01 10:00:00'),\n  (2, 'SKU002', 150.50, '2023-10-01 10:05:00'),\n  (3, 'SKU003', 200.75, '2023-10-01 10:10:00'),\n  (4, 'SKU004', 250.00, '2023-10-01 10:15:00'),\n  (5, 'SKU005', 300.25, '2023-10-01 10:20:00'),\n  (6, 'SKU006', 350.50, '2023-10-01 10:25:00'),\n  (7, 'SKU007', 400.00, '2023-10-01 10:30:00'),\n  (8, 'SKU008', 450.75, '2023-10-01 10:35:00'),\n  (9, 'SKU009', 500.00, '2023-10-01 10:40:00'),\n  (10, 'SKU010', 550.25, '2023-10-01 10:45:00');\n  \"\"\"\n\n  # inesert sql\n  client.command(insert_query)\n\n  # get data\n  select_query = \"SELECT * FROM my_table_dist ORDER BY id\"\n  result = client.query(select_query)\n\n  # print result\n  for row in result.result_rows:\n      print(row)\n\n\n  client.command(\"DROP TABLE IF EXISTS my_table_dist ON CLUSTER default sync\")\n  client.command(\"DROP TABLE IF EXISTS my_table ON CLUSTER default sync\")\n\n  # close connection\n  client.close()\n\nexcept ClickHouseError as e:\n    print(f\"An error occurred while connecting to ClickHouse: {e}\")\nexcept Exception as e:\n    print(f\"An unexpected error occurred: {e}\")\nfinally:\n    # drop tables\n    if 'client' in locals():\n        client.close()\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/clickhouse/clickhouse.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      },\n      {\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"enable\": true,\n        \"expr\": \"resets(ClickHouseAsyncMetrics_Uptime{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval])\",\n        \"hide\": false,\n        \"iconColor\": \"rgba(255, 96, 96, 1)\",\n        \"name\": \"Restarts\",\n        \"showIn\": 0,\n        \"step\": \"60s\",\n        \"tagKeys\": \"instance\",\n        \"titleFormat\": \"Restart\",\n        \"useValueForTime\": false\n      }\n    ]\n  },\n  \"description\": \"ClickHouse internal exporter metrics\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"gnetId\": 14192,\n  \"graphTooltip\": 1,\n  \"id\": null,\n  \"links\": [\n    {\n      \"asDropdown\": false,\n      \"icon\": \"external link\",\n      \"includeVars\": false,\n      \"keepTime\": false,\n      \"tags\": [],\n      \"targetBlank\": true,\n      \"title\": \"ClickHouse monitoring docs\",\n      \"tooltip\": \"\",\n      \"type\": \"link\",\n      \"url\": \"https://clickhouse.tech/docs/en/operations/monitoring/\"\n    }\n  ],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"displayMode\": \"auto\",\n            \"filterable\": false,\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"uptime\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 14,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"frameIndex\": 1,\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"ClickHouseMetrics_VersionInteger{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"ClickHouseMetrics_Revision{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"ClickHouseAsyncMetrics_NumberOfTables{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"ClickHouseAsyncMetrics_Uptime{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"D\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"ClickHouseAsyncMetrics_NumberOfDatabases{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"E\"\n        }\n      ],\n      \"title\": \"Nodes\",\n      \"transformations\": [\n        {\n          \"id\": \"seriesToColumns\",\n          \"options\": {\n            \"byField\": \"instance\"\n          }\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time 1\": true,\n              \"Time 2\": true,\n              \"Time 3\": true,\n              \"Time 4\": true,\n              \"Time 5\": true,\n              \"__name__ 1\": true,\n              \"__name__ 2\": true,\n              \"__name__ 3\": true,\n              \"__name__ 4\": true,\n              \"__name__ 5\": true,\n              \"job 1\": true,\n              \"job 2\": true,\n              \"job 3\": true,\n              \"job 4\": true,\n              \"job 5\": true,\n              \"pod 2\": true,\n              \"pod 3\": true,\n              \"pod 4\": true,\n              \"pod 5\": true, \"app_kubernetes_io_instance 2\": true,\n              \"kubeblocks_component_name 2\": true,\n              \"apps_kubeblocks_io_component_name 2\": true,\n              \"app_kubernetes_io_instance 3\": true,\n              \"kubeblocks_component_name 3\": true,\n              \"apps_kubeblocks_io_component_name 3\": true,\n              \"app_kubernetes_io_instance 4\": true,\n              \"kubeblocks_component_name 4\": true,\n              \"apps_kubeblocks_io_component_name 4\": true,\n              \"app_kubernetes_io_instance 5\": true,\n              \"kubeblocks_component_name 5\": true,\n              \"apps_kubeblocks_io_component_name 5\": true,\n              \"app_kubernetes_io_component\": true,\n              \"app_kubernetes_io_managed_by\": true,\n              \"app_kubernetes_io_name\": true,\n              \"app_kubernetes_io_version\": true,\n              \"http_scheme\": true,\n              \"kubeblocks_clusterdefinition\": true,\n              \"kubeblocks_componentdefinition\": true,\n              \"kubeblocks_instance\": true,\n              \"kubeblocks_role\": true,\n              \"namespace\": true,\n              \"net_host_name\": true,\n              \"net_host_port\": true,\n              \"node\": true,\n              \"replicas\": true,\n              \"server_address\": true,\n              \"server_port\": true,\n              \"service_instance_id\": true,\n              \"service_name\": true,\n              \"url_scheme\": true\n            },\n            \"indexByName\": {\n              \"namespace\": 0,\n              \"cluster\": 1,\n              \"component\": 2,\n              \"instance\": 3,\n              \"version\": 4,\n              \"revision\": 5,\n              \"tables\": 6,\n              \"uptime\": 7,\n              \"databases\": 8\n            },\n            \"renameByName\": {\n              \"Value #A\": \"version\",\n              \"Value #B\": \"revision\",\n              \"Value #C\": \"tables\",\n              \"Value #D\": \"uptime\",\n              \"Value #E\": \"databases\"\n            }\n          }\n        }\n      ],\n      \"transparent\": true,\n      \"type\": \"table\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Total amount of memory (bytes) allocated by the server.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"hiddenSeries\": false,\n      \"id\": 29,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"ClickHouseMetrics_MemoryTracking{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{instance}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Memory\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"bytes\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Number of connections to TCP server (clients with native interface), also included server-server distributed query connections. \\nNumber of connections to HTTP server\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"hiddenSeries\": false,\n      \"id\": 73,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"ClickHouseMetrics_TCPConnection{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"tcp - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"ClickHouseMetrics_HTTPConnection{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"http - {{instance}}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Connections\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Number of times the number of query processing threads was lowered due to slow reads.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 13\n      },\n      \"hiddenSeries\": false,\n      \"id\": 72,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time((irate(ClickHouseProfileEvents_ReadBackoff{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseProfileEvents_ReadBackoff{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Read backoff\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"cps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Number of reads from a file that were slow. This indicate system overload. Thresholds are controlled by read_backoff_* settings.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 13\n      },\n      \"hiddenSeries\": false,\n      \"id\": 71,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_SlowRead{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseProfileEvents_SlowRead{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Slow reads\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"cps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 12,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Queries\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Number of queries to be interpreted and potentially executed. Does not include queries that failed to parse or were rejected due to AST size limits, quota limits or limits on the number of simultaneously running queries. May include internal queries initiated by ClickHouse itself. Does not count subqueries.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 19\n      },\n      \"hiddenSeries\": false,\n      \"id\": 2,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_Query{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseProfileEvents_Query{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Queries\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"reqps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Same as Queries, but only for SELECT queries.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 19\n      },\n      \"hiddenSeries\": false,\n      \"id\": 3,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_SelectQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseProfileEvents_SelectQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"SELECT queries\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"reqps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Same as Queries, but only for INSERT queries.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 27\n      },\n      \"hiddenSeries\": false,\n      \"id\": 4,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_InsertQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseProfileEvents_InsertQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"INSERT queries\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"reqps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Same as Failed queries, but only for SELECT queries.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 27\n      },\n      \"hiddenSeries\": false,\n      \"id\": 6,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_FailedSelectQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseProfileEvents_FailedSelectQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Failed SELECT queries\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"reqps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Number of failed queries.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 35\n      },\n      \"hiddenSeries\": false,\n      \"id\": 5,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_FailedQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseProfileEvents_FailedQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Failed queries\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"reqps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Number of times when memory limit exceeded for query.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 35\n      },\n      \"hiddenSeries\": false,\n      \"id\": 85,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_QueryMemoryLimitExceeded{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseProfileEvents_QueryMemoryLimitExceeded{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Queries memory limit\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"reqps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Number of queries that are stopped and waiting due to 'priority' setting.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 43\n      },\n      \"hiddenSeries\": false,\n      \"id\": 86,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time( (irate(ClickHouseMetrics_QueryPreempted{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseMetrics_QueryPreempted{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Query preemted\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"reqps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Same as Failed queries, but only for INSERT queries.\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 43\n      },\n      \"hiddenSeries\": false,\n      \"id\": 7,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_FailedInsertQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n          \"interval\": \"\",\n          \"legendFormat\": \"peaks - {{instance}}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"rate(ClickHouseProfileEvents_FailedInsertQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"trend - {{instance}}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Failed INSERT queries\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"reqps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Avg queries latencies\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 51\n      },\n      \"hiddenSeries\": false,\n      \"id\": 8,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null as zero\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"increase(ClickHouseProfileEvents_QueryTimeMicroseconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) / increase(ClickHouseProfileEvents_Query{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) or (increase(ClickHouseProfileEvents_Query{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) == 0) * 0\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{instance}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Query latencies (avg)\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"µs\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": 1\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Avg SELECT queries latencies\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 51\n      },\n      \"hiddenSeries\": false,\n      \"id\": 9,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null as zero\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"9.2.4\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"increase(ClickHouseProfileEvents_SelectQueryTimeMicroseconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) / increase(ClickHouseProfileEvents_SelectQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) or (increase(ClickHouseProfileEvents_SelectQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval])==0) * 0\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{instance}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"SELECT query latencies (avg)\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"µs\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Avg INSERT queries latencies\",\n      \"fill\": 0,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 59\n      },\n      \"hiddenSeries\": false,\n      \"id\": 10,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"maxDataPoints\": 200,\n      \"nullPointMode\": \"null as zero\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.5.2\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": false,\n          \"expr\": \"increase(ClickHouseProfileEvents_InsertQueryTimeMicroseconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) / increase(ClickHouseProfileEvents_InsertQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) or (increase(ClickHouseProfileEvents_InsertQuery{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval])==0) * 0\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{instance}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"INSERT query latencies (avg)\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transparent\": true,\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:176\",\n          \"format\": \"µs\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:177\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 67\n      },\n      \"id\": 64,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of rows INSERTed to all tables.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 30\n          },\n          \"hiddenSeries\": false,\n          \"id\": 62,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_InsertedRows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_InsertedRows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Inserted rows\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of bytes (uncompressed; for columns as they stored in memory) INSERTed to all tables.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 30\n          },\n          \"hiddenSeries\": false,\n          \"id\": 65,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_InsertedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_InsertedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Inserted bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times the INSERT of a block to a MergeTree table was throttled due to high number of active data parts for partition.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 38\n          },\n          \"hiddenSeries\": false,\n          \"id\": 66,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_DelayedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_DelayedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Delayed inserts\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times the INSERT of a block to a MergeTree table was rejected with 'Too many parts' exception due to high number of active data parts for partition.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 38\n          },\n          \"hiddenSeries\": false,\n          \"id\": 67,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_RejectedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_RejectedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Rejected inserts\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Total number of milliseconds spent while the INSERT of a block to a MergeTree table was throttled due to high number of active data parts for partition.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 46\n          },\n          \"hiddenSeries\": false,\n          \"id\": 69,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null as zero\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"increase(ClickHouseProfileEvents_DelayedInsertsMilliseconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) / increase(ClickHouseProfileEvents_DelayedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) or (increase(ClickHouseProfileEvents_DelayedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval])==0) * 0\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Delayed inserts blocks (avg)\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"µs\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": 1\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Insert\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 68\n      },\n      \"id\": 125,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of data parts selected to read from a MergeTree table.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 27\n          },\n          \"hiddenSeries\": false,\n          \"id\": 126,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_SelectedParts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_SelectedParts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Parts\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of (non-adjacent) ranges in all data parts selected to read from a MergeTree table.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 27\n          },\n          \"hiddenSeries\": false,\n          \"id\": 127,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_SelectedRanges{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_SelectedRanges{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Ranges\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of marks (index granules) selected to read from a MergeTree table.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 35\n          },\n          \"hiddenSeries\": false,\n          \"id\": 128,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_SelectedMarks{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_SelectedMarks{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Marks\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of rows SELECTed from all tables.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 35\n          },\n          \"hiddenSeries\": false,\n          \"id\": 129,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_SelectedRows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_SelectedRows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Rows\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of bytes (uncompressed; for columns as they stored in memory) SELECTed from all tables.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 43\n          },\n          \"hiddenSeries\": false,\n          \"id\": 130,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_SelectedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_SelectedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Select\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 69\n      },\n      \"id\": 17,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times the 'lseek' function was called.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 33\n          },\n          \"hiddenSeries\": false,\n          \"id\": 20,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_Seek{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_Seek{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"lseek\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"ops\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of files opened\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 33\n          },\n          \"hiddenSeries\": false,\n          \"id\": 19,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_FileOpen{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_FileOpen{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Open Files\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"ops\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of reads (read/pread) from a file descriptor. Does not include sockets.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 41\n          },\n          \"hiddenSeries\": false,\n          \"id\": 22,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReadBufferFromFileDescriptorRead{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReadBufferFromFileDescriptorRead{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Read from FD\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"ops\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of writes (write/pwrite) to a file descriptor. Does not include sockets.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 41\n          },\n          \"hiddenSeries\": false,\n          \"id\": 23,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_WriteBufferFromFileDescriptorWrite{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_WriteBufferFromFileDescriptorWrite{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Write to FD\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"ops\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times the read (read/pread) from a file descriptor have failed.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 49\n          },\n          \"hiddenSeries\": false,\n          \"id\": 24,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReadBufferFromFileDescriptorReadFailed{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReadBufferFromFileDescriptorReadFailed{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Read from FD failed\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"ops\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times the read (read/pread) from a file descriptor have failed.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 49\n          },\n          \"hiddenSeries\": false,\n          \"id\": 25,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReadBufferFromFileDescriptorReadFailed{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReadBufferFromFileDescriptorReadFailed{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Read from FD failed\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"ops\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of bytes read from file descriptors. If the file is compressed, this will show the compressed data size.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 57\n          },\n          \"hiddenSeries\": false,\n          \"id\": 21,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReadBufferFromFileDescriptorReadBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReadBufferFromFileDescriptorReadBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Read bytes from FD\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of bytes written to file descriptors. If the file is compressed, this will show compressed data size.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 57\n          },\n          \"hiddenSeries\": false,\n          \"id\": 26,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_WriteBufferFromFileDescriptorWriteBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_WriteBufferFromFileDescriptorWriteBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Write bytes to FD\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of bytes (the number of bytes before decompression) read from compressed sources (files, network).\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 65\n          },\n          \"hiddenSeries\": false,\n          \"id\": 51,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReadCompressedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReadCompressedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Read compressed bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of uncompressed bytes (the number of bytes after decompression) read from compressed sources (files, network).\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 65\n          },\n          \"hiddenSeries\": false,\n          \"id\": 53,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_CompressedReadBufferBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_CompressedReadBufferBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Read uncompressed bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of compressed blocks (the blocks of data that are compressed independent of each other) read from compressed sources (files, network).\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 73\n          },\n          \"hiddenSeries\": false,\n          \"id\": 52,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_CompressedReadBufferBlocks{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_CompressedReadBufferBlocks{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Compressed blocks\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"IO\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 70\n      },\n      \"id\": 56,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of Replicated tables that are currently in readonly state due to re-initialization after ZooKeeper session loss or due to startup without ZooKeeper configured.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 31\n          },\n          \"hiddenSeries\": false,\n          \"id\": 74,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_ReadonlyReplica{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Readonly replica\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times a data part was failed to download from replica of a ReplicatedMergeTree table.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 31\n          },\n          \"hiddenSeries\": false,\n          \"id\": 58,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReplicatedPartFailedFetches{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReplicatedPartFailedFetches{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Replicated part failed fetches\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times a data part was downloaded from replica of a ReplicatedMergeTree table.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 39\n          },\n          \"hiddenSeries\": false,\n          \"id\": 57,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReplicatedPartFetches{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReplicatedPartFetches{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Replicated part fetches\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times we prefer to download already merged part from replica of ReplicatedMergeTree table instead of performing a merge ourself (usually we prefer doing a merge ourself to save network traffic). This happens when we have not all source parts to perform a merge or when the data part is old enough.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 39\n          },\n          \"hiddenSeries\": false,\n          \"id\": 60,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReplicatedPartFetchesOfMerged{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReplicatedPartFetchesOfMerged{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Replicated part fetches or merges\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times data parts of ReplicatedMergeTree tables were successfully merged.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 47\n          },\n          \"hiddenSeries\": false,\n          \"id\": 59,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReplicatedPartMerges{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReplicatedPartMerges{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Replicated part merges\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times a data part that we wanted doesn't exist on any replica (even on replicas that are offline right now). That data parts are definitely lost. This is normal due to asynchronous replication (if quorum inserts were not enabled), when the replica on which the data part was written was failed and when it became online after fail it doesn't contain that data part.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 47\n          },\n          \"hiddenSeries\": false,\n          \"id\": 61,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ReplicatedDataLoss{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ReplicatedDataLoss{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Replicated part data loss\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Replicas\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 71\n      },\n      \"id\": 76,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of launched background merges.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 29\n          },\n          \"hiddenSeries\": false,\n          \"id\": 77,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_Merge{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_Merge{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Merge\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Rows read for background merges. This is the number of rows before merge.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 29\n          },\n          \"hiddenSeries\": false,\n          \"id\": 78,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_MergedRows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_MergedRows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Merged rows\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Uncompressed bytes (for columns as they stored in memory) that was read for background merges. This is the number before merge.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 37\n          },\n          \"hiddenSeries\": false,\n          \"id\": 79,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_MergedUncompressedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_MergedUncompressedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Merge uncompressed bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Avg merge duration\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 37\n          },\n          \"hiddenSeries\": false,\n          \"id\": 80,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null as zero\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"increase(ClickHouseProfileEvents_MergesTimeMilliseconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) / increase(ClickHouseProfileEvents_Merge{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Merge duration (avg)\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"µs\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": 1\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of rows INSERTed to MergeTree tables.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 45\n          },\n          \"hiddenSeries\": false,\n          \"id\": 81,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_MergeTreeDataWriterRows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_MergeTreeDataWriterRows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"MergeTree rows\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of blocks INSERTed to MergeTree tables. Each block forms a data part of level zero.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 45\n          },\n          \"hiddenSeries\": false,\n          \"id\": 82,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_MergeTreeDataWriterBlocks{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_MergeTreeDataWriterBlocks{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"MergeTree blocks\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Uncompressed bytes (for columns as they stored in memory) INSERTed to MergeTree tables.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 53\n          },\n          \"hiddenSeries\": false,\n          \"id\": 83,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_MergeTreeDataWriterUncompressedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_MergeTreeDataWriterUncompressedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"MergeTree uncompressed bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Bytes written to filesystem for data INSERTed to MergeTree tables.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 53\n          },\n          \"hiddenSeries\": false,\n          \"id\": 84,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_MergeTreeDataWriterCompressedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_MergeTreeDataWriterCompressedBytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"MergeTree compressed bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Disk space reserved for currently running background merges. It is slightly more than the total size of currently merging parts.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 61\n          },\n          \"hiddenSeries\": false,\n          \"id\": 123,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_DiskSpaceReservedForMerge{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Reserved space\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"bytes\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Merge\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 72\n      },\n      \"id\": 92,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 26\n          },\n          \"hiddenSeries\": false,\n          \"id\": 102,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_UncompressedCacheHits{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_UncompressedCacheHits{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Uncompressed Cache Hits\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 26\n          },\n          \"hiddenSeries\": false,\n          \"id\": 103,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_UncompressedCacheMisses{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_UncompressedCacheMisses{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Uncompressed Cache Misses\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 34\n          },\n          \"hiddenSeries\": false,\n          \"id\": 104,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_MarkCacheHits{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_MarkCacheHits{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Mark Cache Hits\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 34\n          },\n          \"hiddenSeries\": false,\n          \"id\": 105,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_MarkCacheMisses{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_MarkCacheMisses{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Mark Cache Misses\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cache\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 73\n      },\n      \"id\": 90,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"The part is generating now, it is not in data_parts list.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 27\n          },\n          \"hiddenSeries\": false,\n          \"id\": 114,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_PartsTemporary{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Temporary\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"The part is in data_parts, but not used for SELECTs.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 27\n          },\n          \"hiddenSeries\": false,\n          \"id\": 115,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_PartsPreCommitted{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Pre commited\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"The part is in data_parts, but not used for SELECTs.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 35\n          },\n          \"hiddenSeries\": false,\n          \"id\": 116,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_PartsCommitted{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Commited\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Not active data part, but could be used by only current SELECTs, could be deleted after SELECTs finishes.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 35\n          },\n          \"hiddenSeries\": false,\n          \"id\": 117,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_PartsOutdated{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Outdated\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Not active data part with identity refcounter, it is deleting right now by a cleaner.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 43\n          },\n          \"hiddenSeries\": false,\n          \"id\": 118,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_PartsDeleting\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Deleting\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Part was moved to another disk and should be deleted in own destructor.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 43\n          },\n          \"hiddenSeries\": false,\n          \"id\": 119,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_PartsDeleteOnDestroy\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Delete on destroy\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Wide parts.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 51\n          },\n          \"hiddenSeries\": false,\n          \"id\": 120,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_PartsWide{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Wide\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Compact parts.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 51\n          },\n          \"hiddenSeries\": false,\n          \"id\": 122,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_PartsCompact{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Compact\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Parts\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 74\n      },\n      \"id\": 94,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of connections to remote servers sending data that was INSERTed into Distributed tables. Both synchronous and asynchronous mode.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 25\n          },\n          \"hiddenSeries\": false,\n          \"id\": 112,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_DistributedSend{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Send\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of pending files to process for asynchronous insertion into Distributed tables. Number of files for every shard is summed.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 25\n          },\n          \"hiddenSeries\": false,\n          \"id\": 113,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_DistributedFilesToInsert{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Files to insert\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times the INSERT of a block to a Distributed table was throttled due to high number of pending bytes.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 33\n          },\n          \"hiddenSeries\": false,\n          \"id\": 106,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_DistributedDelayedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_DistributedDelayedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Distributed delayed inserts\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times the INSERT of a block to a Distributed table was rejected with 'Too many bytes' exception due to high number of pending bytes.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 33\n          },\n          \"hiddenSeries\": false,\n          \"id\": 107,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_DistributedRejectedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_DistributedRejectedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Distributed rejected inserts\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Total number of milliseconds spent while the INSERT of a block to a Distributed table was throttled due to high number of pending bytes.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 41\n          },\n          \"hiddenSeries\": false,\n          \"id\": 108,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null as zero\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"increase(ClickHouseProfileEvents_DistributedDelayedInsertsMilliseconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) / increase(ClickHouseProfileEvents_DistributedDelayedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) or (increase(ClickHouseProfileEvents_DistributedDelayedInserts{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval])==0) * 0\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Distributed delayed inserts blocks (avg)\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"µs\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false,\n            \"alignLevel\": 1\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Total count when distributed connection fails with retry\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 41\n          },\n          \"hiddenSeries\": false,\n          \"id\": 109,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_DistributedConnectionFailTry{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_DistributedConnectionFailTry{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Distributed connection fail try\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Total count when distributed connection fails after all retries finished\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 49\n          },\n          \"hiddenSeries\": false,\n          \"id\": 110,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_DistributedConnectionFailAtAll{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_DistributedConnectionFailAtAll{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Distributed connection fail at all\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 49\n          },\n          \"hiddenSeries\": false,\n          \"id\": 111,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_DistributedSyncInsertionTimeoutExceeded{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_DistributedSyncInsertionTimeoutExceeded{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Distributed sync insertation timeout\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Distributed\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 75\n      },\n      \"id\": 88,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of active merges and mutations in an associated background pool\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 28\n          },\n          \"hiddenSeries\": false,\n          \"id\": 95,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_BackgroundMergesAndMutationsPoolTask\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"BackgroundPool task\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of active tasks in BackgroundFetchesPool\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 28\n          },\n          \"hiddenSeries\": false,\n          \"id\": 96,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_BackgroundFetchesPoolTask{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"BackgroundFetchesPool task\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of active tasks in BackgroundProcessingPool for moves\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 36\n          },\n          \"hiddenSeries\": false,\n          \"id\": 97,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_BackgroundMovePoolTask{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"BackgroundMovePool task\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of active tasks in BackgroundSchedulePool. This pool is used for periodic ReplicatedMergeTree tasks, like cleaning old data parts, altering data parts, replica re-initialization, etc.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 36\n          },\n          \"hiddenSeries\": false,\n          \"id\": 98,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_BackgroundSchedulePoolTask{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"BackgroundSchedulePool task\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of active tasks in BackgroundBufferFlushSchedulePool. This pool is used for periodic Buffer flushes\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 44\n          },\n          \"hiddenSeries\": false,\n          \"id\": 99,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_BackgroundBufferFlushSchedulePoolTask{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"BackgroundBufferFlushSchedulePool task\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of active tasks in BackgroundDistributedSchedulePool. This pool is used for distributed sends that is done in background.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 44\n          },\n          \"hiddenSeries\": false,\n          \"id\": 100,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_BackgroundDistributedSchedulePoolTask{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"BackgroundDistributedSchedulePool task\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of active tasks in BackgroundProcessingPool for message streaming\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 52\n          },\n          \"hiddenSeries\": false,\n          \"id\": 101,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_BackgroundMessageBrokerSchedulePoolTask{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"BackgroundMessageBrokerSchedulePool task\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Background pool\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 76\n      },\n      \"id\": 28,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 29\n          },\n          \"hiddenSeries\": false,\n          \"id\": 30,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperInit{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperInit{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Init\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 29\n          },\n          \"hiddenSeries\": false,\n          \"id\": 31,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperTransactions{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperTransactions{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Transactions\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 37\n          },\n          \"hiddenSeries\": false,\n          \"id\": 32,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperList{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperList{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"List\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 37\n          },\n          \"hiddenSeries\": false,\n          \"id\": 33,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperCreate{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperCreate{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Create\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 45\n          },\n          \"hiddenSeries\": false,\n          \"id\": 34,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperRemove{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperRemove{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Remove\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 45\n          },\n          \"hiddenSeries\": false,\n          \"id\": 35,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperExists{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperExists{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Exists\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 53\n          },\n          \"hiddenSeries\": false,\n          \"id\": 36,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperGet{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperGet{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Get\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 53\n          },\n          \"hiddenSeries\": false,\n          \"id\": 37,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperSet{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperSet{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Set\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 61\n          },\n          \"hiddenSeries\": false,\n          \"id\": 38,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperMulti{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperMulti{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Multi\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 61\n          },\n          \"hiddenSeries\": false,\n          \"id\": 39,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperCheck{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperCheck{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Check\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 69\n          },\n          \"hiddenSeries\": false,\n          \"id\": 40,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperClose{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperClose{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Close\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 69\n          },\n          \"hiddenSeries\": false,\n          \"id\": 41,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperWatchResponse{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperWatchResponse{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Watch response\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"reqps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 77\n          },\n          \"hiddenSeries\": false,\n          \"id\": 42,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperUserExceptions{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperUserExceptions{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"User Exceptions\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 77\n          },\n          \"hiddenSeries\": false,\n          \"id\": 43,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperHardwareExceptions{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperHardwareExceptions{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Hardware Exceptions\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 85\n          },\n          \"hiddenSeries\": false,\n          \"id\": 46,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperBytesReceived{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperBytesReceived{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Bytes received\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 85\n          },\n          \"hiddenSeries\": false,\n          \"id\": 45,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_ZooKeeperBytesSent{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_ZooKeeperBytesSent{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Bytes sent\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"binBps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of sessions (connections) to ZooKeeper. Should be no more than one, because using more than one connection to ZooKeeper may lead to bugs due to lack of linearizability (stale reads) that ZooKeeper consistency model allows.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 93\n          },\n          \"hiddenSeries\": false,\n          \"id\": 48,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_ZooKeeperSession\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Sessions\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of ephemeral nodes hold in ZooKeeper.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 93\n          },\n          \"hiddenSeries\": false,\n          \"id\": 47,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_EphemeralNode\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Ephemeral Node\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of watches (event subscriptions) in ZooKeeper.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 101\n          },\n          \"hiddenSeries\": false,\n          \"id\": 50,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_ZooKeeperWatch\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Watches\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of requests to ZooKeeper in fly.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 101\n          },\n          \"hiddenSeries\": false,\n          \"id\": 49,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"ClickHouseMetrics_ZooKeeperRequest\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{instance}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Requests\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Number of times an error happened while trying to remove ephemeral node. This is not an issue, because our implementation of ZooKeeper library guarantee that the session will expire and the node will be removed.\",\n          \"fieldConfig\": {\n            \"defaults\": {},\n            \"overrides\": []\n          },\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 109\n          },\n          \"hiddenSeries\": false,\n          \"id\": 70,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": false,\n            \"current\": false,\n            \"max\": false,\n            \"min\": false,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": false\n          },\n          \"lines\": true,\n          \"linewidth\": 2,\n          \"maxDataPoints\": 200,\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.5.2\",\n          \"pointradius\": 2,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"max_over_time( (irate(ClickHouseProfileEvents_CannotRemoveEphemeralNode{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[2m]))[$__rate_interval:15s] ) * $peaks\",\n              \"interval\": \"\",\n              \"legendFormat\": \"peaks - {{instance}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": false,\n              \"expr\": \"rate(ClickHouseProfileEvents_CannotRemoveEphemeralNode{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\", apps_kubeblocks_io_component_name=~\\\"$component\\\", pod=~\\\"$instance\\\"}[$__rate_interval]) * $trends\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"trend - {{instance}}\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Remove ephemeral node failed\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"transparent\": true,\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"$$hashKey\": \"object:176\",\n              \"format\": \"cps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"$$hashKey\": \"object:177\",\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Zookeeper\",\n      \"type\": \"row\"\n    }\n  ],\n  \"refresh\": \"30s\",\n  \"schemaVersion\": 37,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"apps\",\n    \"db\",\n    \"clickhouse\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"Prometheus\",\n          \"value\": \"Prometheus\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"DataSource\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": true,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"label_values(ClickHouseAsyncMetrics_Uptime,namespace)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"namespace\",\n        \"multi\": true,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(ClickHouseAsyncMetrics_Uptime,namespace)\",\n          \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": true,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(ClickHouseAsyncMetrics_Uptime{namespace=\\\"$namespace\\\"},app_kubernetes_io_instance)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"cluster\",\n        \"multi\": true,\n        \"name\": \"cluster\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(ClickHouseAsyncMetrics_Uptime{namespace=\\\"$namespace\\\"},app_kubernetes_io_instance)\",\n          \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 5,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": true,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"label_values(ClickHouseAsyncMetrics_Uptime{namespace=\\\"$namespace\\\", app_kubernetes_io_instance=\\\"$cluster\\\"},apps_kubeblocks_io_component_name)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"component\",\n        \"multi\": true,\n        \"name\": \"component\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(ClickHouseAsyncMetrics_Uptime{namespace=\\\"$namespace\\\", app_kubernetes_io_instance=\\\"$cluster\\\"},apps_kubeblocks_io_component_name)\",\n          \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": true,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"label_values(ClickHouseAsyncMetrics_Uptime{namespace=\\\"$namespace\\\", app_kubernetes_io_instance=\\\"$cluster\\\", apps_kubeblocks_io_component_name=\\\"$component\\\"},pod)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"instance\",\n        \"multi\": true,\n        \"name\": \"instance\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(ClickHouseAsyncMetrics_Uptime{namespace=\\\"$namespace\\\", app_kubernetes_io_instance=\\\"$cluster\\\", apps_kubeblocks_io_component_name=\\\"$component\\\"},pod)\",\n          \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"Yes\",\n          \"value\": \"1\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Show trends\",\n        \"multi\": false,\n        \"name\": \"trends\",\n        \"options\": [\n          {\n            \"selected\": true,\n            \"text\": \"Yes\",\n            \"value\": \"1\"\n          },\n          {\n            \"selected\": false,\n            \"text\": \"No\",\n            \"value\": \"null\"\n          }\n        ],\n        \"query\": \"Yes : 1, No : null\",\n        \"queryValue\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"custom\"\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"No\",\n          \"value\": \"null\"\n        },\n        \"description\": \"Be aware of the points limit per timeseries for Grafana. This option may not work for a time range > 24h\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Show peaks\",\n        \"multi\": false,\n        \"name\": \"peaks\",\n        \"options\": [\n          {\n            \"selected\": false,\n            \"text\": \"Yes\",\n            \"value\": \"1\"\n          },\n          {\n            \"selected\": true,\n            \"text\": \"No\",\n            \"value\": \"null\"\n          }\n        ],\n        \"query\": \"Yes : 1, No : null\",\n        \"queryValue\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"custom\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-3h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"APPS / ClickHouse Metrics\",\n  \"uid\": \"clickhouse\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/clickhouse/readme.md",
    "content": "## 常用操作\n\n1. 客户端连接\n\n`clickhouse-client -h clickhouse-cluster-clickhouse.db.svc -u admin --port 9000 --password`\n\n2. 查看集群状态\n\n`clickhouse-client --format=Pretty --query=\"SELECT * FROM system.clusters\"`\n\n3. 查看库表磁盘占用\n\n```\nclickhouse-client --format=Pretty --query=\"\nSELECT database, table, formatReadableSize(sum(bytes)) AS size\nFROM system.parts\nGROUP BY database, table\nORDER BY sum(bytes) DESC\"\n```\n\n4. 备份与恢复\n\n```\n## 备份\n#!/bin/bash\nDATE=$(date +%Y%m%d)\nBACKUP_DIR=/data/clickhouse/backups/$DATE\nmkdir -p $BACKUP_DIR\n\nclickhouse-client --query=\"BACKUP DATABASE production_db TO Disk('backup_disk', '$BACKUP_DIR/production_db')\"\necho \"Backup completed at $BACKUP_DIR\"\n\n## 恢复\nRESTORE DATABASE production_db FROM Disk('backup_disk', '/backups/20240101/production_db')\n```\n\n5. 慢查询\n\n```\n# 检查慢查询\nSELECT query_id, user, query_duration_ms, normalized_query_hash \nFROM system.query_log\nWHERE event_date = today() AND query_duration_ms > 10000\nORDER BY query_duration_ms DESC\nLIMIT 20\n\n# 终止异常查询\nKILL QUERY WHERE query_id = 'abcd-efgh-ijkl'\n```\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/001.standalone.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: es-singlenode\nspec:\n  terminationPolicy: Delete\n  componentSpecs:\n    - name: mdit\n      componentDef: elasticsearch-8\n      serviceVersion: 8.8.2\n      replicas: 1\n      configs:\n        - name: es-cm\n          variables:\n            mode: \"single-node\"\n      resources:\n        limits:\n          cpu: \"1\"\n          memory: \"2Gi\"\n        requests:\n          cpu: \"1\"\n          memory: \"2Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 10Gi\n            storageClassName: \"openebs-hostpath\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/002.es-multinode.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: es-multinode\nspec:\n  terminationPolicy: Delete\n  componentSpecs:\n    - name: dit\n      componentDef: elasticsearch-8\n      serviceVersion: 8.8.2\n      configs:\n        - name: es-cm\n          variables:\n            roles: data,ingest,transform\n      replicas: 3\n      disableExporter: false\n      resources:\n        limits:\n          cpu: \"1\"\n          memory: \"2Gi\"\n        requests:\n          cpu: \"1\"\n          memory: \"2Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"openebs-hostpath\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n    - name: master\n      componentDef: elasticsearch-8\n      serviceVersion: 8.8.2\n      configs:\n        - name: es-cm\n          variables:\n            roles: master\n      replicas: 3\n      disableExporter: false\n      resources:\n        limits:\n          cpu: \"1\"\n          memory: \"2Gi\"\n        requests:\n          cpu: \"1\"\n          memory: \"2Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"openebs-hostpath\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 10Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/101.stop.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: es-multinode-stop-ops\nspec:\n  clusterName: es-multinode\n  type: Stop\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/102.start.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: es-multinode-start-ops\nspec:\n  # Specifies the name of the Cluster resource that this operation is targeting.\n  clusterName: es-multinode\n  type: Start\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/103.restart.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: es-multinode-restart-ops\nspec:\n  clusterName: es-multinode\n  type: Restart\n  restart:\n  - componentName: dit\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/104.vscale.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: es-multinode-vscale-ops\nspec:\n  clusterName: es-multinode\n  type: VerticalScaling\n  verticalScaling:\n  - componentName: dit\n    requests:\n      cpu: '1'\n      memory: 1Gi\n    limits:\n      cpu: '1'\n      memory: 1Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/105.hscale.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: es-multinode-scale-out-ops\nspec:\n  clusterName: es-multinode\n  type: HorizontalScaling\n  horizontalScaling:\n  - componentName: dit\n    # Specifies the replica changes for scaling in components\n    scaleOut:\n      # Specifies the replica changes for the component.\n      # add one more replica to current component\n      replicaChanges: 1\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/106.api-expose.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: es-multinode\nspec:\n  terminationPolicy: Delete\n  services:\n    - componentSelector: master\n      name: master-internet\n      serviceName: master-internet\n      spec:\n        ports:\n        - name: es-http\n          port: 9200\n          protocol: TCP\n          targetPort: es-http\n        type: NodePort\n  componentSpecs:\n    - name: dit\n      componentDef: elasticsearch-8\n      serviceVersion: 8.8.2\n      configs:\n        - name: es-cm\n          variables:\n            roles: data,ingest,transform\n      replicas: 3\n      disableExporter: false\n      resources:\n        limits:\n          cpu: \"1\"\n          memory: \"2Gi\"\n        requests:\n          cpu: \"1\"\n          memory: \"2Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"openebs-hostpath\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n    - name: master\n      componentDef: elasticsearch-8\n      serviceVersion: 8.8.2\n      configs:\n        - name: es-cm\n          variables:\n            roles: master\n      replicas: 3\n      disableExporter: false\n      resources:\n        limits:\n          cpu: \"1\"\n          memory: \"2Gi\"\n        requests:\n          cpu: \"1\"\n          memory: \"2Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"openebs-hostpath\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 10Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/106.expose.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: es-multinode-expose-enable-ops\nspec:\n  type: Expose\n  clusterName: es-multinode\n  expose:\n  - componentName: master\n    services:\n    - name: external\n      serviceType: NodePort \n      ports:\n      - name: es-http\n        port: 9200\n        protocol: TCP\n        targetPort: es-http\n    switch: Enable\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/107.decommission.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: es-multinode-decommission-ops\nspec:\n  clusterName: es-multinode\n  type: HorizontalScaling\n  horizontalScaling:\n  - componentName: dit\n    scaleIn:\n      onlineInstancesToOffline:\n        - 'es-multinode-dit-1'  # Specifies the instance names that need to be taken offline\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/131.pod-monitor.yaml",
    "content": "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n  name: elasticsearch-jmx-pod-monitor\n  namespace: monitor    # Note: this is namespace for prometheus operator \n  labels:               # match labels in `prometheus.spec.podMonitorSelector`\n    release: prometheus\nspec:\n  jobLabel: app.kubernetes.io/managed-by\n  podMetricsEndpoints:\n    - path: /metrics\n      port: metrics\n      scheme: http\n  namespaceSelector:\n    matchNames:\n      - default\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: es-multinode\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/elasticsearch.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"A quickstart to setup the Prometheus Elasticsearch Exporter with preconfigured dashboards, alerting rules, and recording rules.\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"gnetId\": 14191,\n  \"graphTooltip\": 1,\n  \"id\": 16,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 90,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"KPI\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"1\": {\n                  \"text\": \"Red\"\n                },\n                \"3\": {\n                  \"text\": \"Yellow\"\n                },\n                \"5\": {\n                  \"text\": \"Green\"\n                }\n              },\n              \"type\": \"value\"\n            },\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"#d44a3a\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 2\n              },\n              {\n                \"color\": \"#299c46\",\n                \"value\": 4\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 53,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_status{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\",color=\\\"red\\\"}==1 or (elasticsearch_cluster_health_status{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\",color=\\\"green\\\"}==1)+4 or (elasticsearch_cluster_health_status{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\",color=\\\"yellow\\\"}==1)+22\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cluster health\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"N/A\": {\n                  \"color\": \"#299c46\",\n                  \"text\": \"0\"\n                },\n                \"no value\": {\n                  \"color\": \"#299c46\",\n                  \"text\": \"0\"\n                }\n              },\n              \"type\": \"value\"\n            },\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"color\": \"#299c46\",\n                  \"text\": \"0\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"#299c46\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 1\n              },\n              {\n                \"color\": \"#d44a3a\",\n                \"value\": 2\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 4,\n        \"y\": 1\n      },\n      \"id\": 81,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"count(elasticsearch_breakers_tripped{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}>0)\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Tripped for breakers\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 70\n              },\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 6,\n        \"y\": 1\n      },\n      \"id\": 51,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"sum (elasticsearch_process_cpu_percent{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"} ) / count (elasticsearch_process_cpu_percent{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"} )\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"CPU usage Avg.\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 70\n              },\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 10,\n        \"y\": 1\n      },\n      \"id\": 50,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"sum (elasticsearch_jvm_memory_used_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}) / sum (elasticsearch_jvm_memory_max_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}) * 100\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"JVM memory used Avg.\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of nodes in the cluster\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 14,\n        \"y\": 1\n      },\n      \"id\": 10,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_number_of_nodes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Nodes\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Number of data nodes in the cluster\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 16,\n        \"y\": 1\n      },\n      \"id\": 9,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_number_of_data_nodes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Data nodes\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Cluster level changes which have not yet been executed\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 1\n              },\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": 5\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 18,\n        \"y\": 1\n      },\n      \"hideTimeOverride\": true,\n      \"id\": 16,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_number_of_pending_tasks{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Pending tasks\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 20,\n        \"y\": 1\n      },\n      \"id\": 89,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"sum (elasticsearch_process_open_files_count{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"})\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Open file descriptors per cluster\",\n      \"type\": \"stat\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 4\n      },\n      \"id\": 91,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Shards\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"The number of primary shards in your cluster. This is an aggregate total across all indices.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 5\n      },\n      \"id\": 11,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"repeat\": \"shard_type\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_active_primary_shards{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Active primary shards\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Aggregate total of all shards across all indices, which includes replica shards\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 4,\n        \"y\": 5\n      },\n      \"id\": 39,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_active_shards{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Active shards\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Count of shards that are being freshly created\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 8,\n        \"y\": 5\n      },\n      \"id\": 40,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_initializing_shards{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Initializing shards\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"The number of shards that are currently moving from one node to another node.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 12,\n        \"y\": 5\n      },\n      \"id\": 41,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_relocating_shards{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Relocating shards\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Shards delayed to reduce reallocation overhead\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 16,\n        \"y\": 5\n      },\n      \"id\": 42,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_delayed_unassigned_shards{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"} \",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Delayed shards\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"The number of shards that exist in the cluster state, but cannot be found in the cluster itself\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"fixedColor\": \"rgb(31, 120, 193)\",\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 20,\n        \"y\": 5\n      },\n      \"id\": 82,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"expr\": \"elasticsearch_cluster_health_unassigned_shards{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"} \",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Unassigned shards\",\n      \"type\": \"stat\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 92,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 9\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 7,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_jvm_gc_collection_seconds_count{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}} - {{gc}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 10\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"GC count\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": \"GCs\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 9\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 27,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_jvm_gc_collection_seconds_sum{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}} - {{gc}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 10\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"GC time\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"s\",\n              \"label\": \"Time\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"JVM Garbage Collection\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 93,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 10\n          },\n          \"hiddenSeries\": false,\n          \"id\": 77,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": true,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_translog_operations{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Total translog operations\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 10\n          },\n          \"hiddenSeries\": false,\n          \"id\": 78,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_translog_size_in_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Total translog size in bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Translog\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 10\n      },\n      \"id\": 94,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 11\n          },\n          \"hiddenSeries\": false,\n          \"id\": 79,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_breakers_tripped{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: {{breaker}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Tripped for breakers\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 18\n          },\n          \"hiddenSeries\": false,\n          \"id\": 80,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_breakers_estimated_size_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: {{breaker}}\",\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_breakers_limit_size_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: limit for {{breaker}}\",\n              \"refId\": \"B\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Estimated size in bytes of breaker\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Breakers\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 11\n      },\n      \"id\": 95,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 12\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 30,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_os_load1{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"load1: {{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_os_load5{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"load5: {{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_os_load15{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"load15: {{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"C\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Load average\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": \"CPU usage\",\n              \"logBase\": 1,\n              \"max\": 100,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 12\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 88,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_process_cpu_percent{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"CPU usage\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"percent\",\n              \"label\": \"CPU usage\",\n              \"logBase\": 1,\n              \"max\": 100,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 23\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 31,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_jvm_memory_used_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}} used: {{area}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_jvm_memory_max_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}} max: {{area}}\",\n              \"refId\": \"C\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_jvm_memory_pool_peak_used_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}} peak used pool: {{pool}}\",\n              \"refId\": \"D\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"JVM memory usage\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": \"Memory\",\n              \"logBase\": 1,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 0,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 23\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 54,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_jvm_memory_committed_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}} committed: {{area}}\",\n              \"refId\": \"B\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_jvm_memory_max_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}} max: {{area}}\",\n              \"refId\": \"C\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"JVM memory committed\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": \"Memory\",\n              \"logBase\": 1,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CPU and Memory\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"id\": 96,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 7\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 32,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"current\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"1-(elasticsearch_filesystem_data_available_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}/elasticsearch_filesystem_data_size_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: {{path}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [\n            {\n              \"colorMode\": \"custom\",\n              \"fill\": true,\n              \"fillColor\": \"rgba(216, 200, 27, 0.27)\",\n              \"op\": \"gt\",\n              \"value\": 0.8\n            },\n            {\n              \"colorMode\": \"custom\",\n              \"fill\": true,\n              \"fillColor\": \"rgba(234, 112, 112, 0.22)\",\n              \"op\": \"gt\",\n              \"value\": 0.9\n            }\n          ],\n          \"timeRegions\": [],\n          \"title\": \"Disk usage\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"percentunit\",\n              \"label\": \"Disk Usage %\",\n              \"logBase\": 1,\n              \"max\": 1,\n              \"min\": 0,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 7\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 47,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [\n            {\n              \"alias\": \"sent\",\n              \"transform\": \"negative-Y\"\n            }\n          ],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_transport_tx_size_bytes_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: sent \",\n              \"refId\": \"D\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"-irate(elasticsearch_transport_rx_size_bytes_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: received\",\n              \"refId\": \"C\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Network usage\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"Bps\",\n              \"label\": \"Bytes/sec\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"pps\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Disk and Network\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 13\n      },\n      \"id\": 97,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"decimals\": 2,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 36\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 1,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_docs{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Documents count on node\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"decimals\": 2,\n              \"format\": \"short\",\n              \"label\": \"\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 36\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 24,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_indexing_index_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Documents indexed rate\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": \"index calls/s\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"Count of deleted documents on this node\",\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 47\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 25,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_docs_deleted{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Documents deleted rate\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": \"Documents/s\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"decimals\": 2,\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 47\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 26,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_merges_docs_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Documents merged rate\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"decimals\": 2,\n              \"format\": \"short\",\n              \"label\": \"Documents/s\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 47\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 52,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_merges_total_size_bytes_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Documents merged bytes\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"decbytes\",\n              \"label\": \"Bytes/s\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Documents\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 14\n      },\n      \"id\": 98,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 59\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 33,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_search_query_time_seconds{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval]) \",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 10\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Query time\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"s\",\n              \"label\": \"Time\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 59\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 5,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_indexing_index_time_seconds_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 10\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Indexing time\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"s\",\n              \"label\": \"Time\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 70\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 3,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_merges_total_time_seconds_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 10\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Merging time\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"s\",\n              \"label\": \"Time\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 70\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 87,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_store_throttle_time_seconds_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 10\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Throttle time for index store\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"s\",\n              \"label\": \"Time\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Times\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 15\n      },\n      \"id\": 99,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 82\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 48,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": true,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_indexing_index_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: indexing\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_search_query_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: query\",\n              \"refId\": \"B\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_search_fetch_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: fetch\",\n              \"refId\": \"C\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_merges_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: merges\",\n              \"refId\": \"D\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_refresh_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: refresh\",\n              \"refId\": \"E\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_flush_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: flush\",\n              \"refId\": \"F\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_get_exists_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: get_exists\",\n              \"refId\": \"G\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_get_missing_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: get_missing\",\n              \"refId\": \"H\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_get_tota{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: get\",\n              \"refId\": \"I\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_indexing_delete_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: indexing_delete\",\n              \"refId\": \"J\",\n              \"step\": 10\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Total Operations  rate\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": \"Operations/s\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 93\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 49,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": true,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_indexing_index_time_seconds_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: indexing\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_search_query_time_seconds{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: query\",\n              \"refId\": \"B\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_search_fetch_time_seconds{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: fetch\",\n              \"refId\": \"C\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_merges_total_time_seconds_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: merges\",\n              \"refId\": \"D\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_refresh_time_seconds_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: refresh\",\n              \"refId\": \"E\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_flush_time_seconds{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: flush\",\n              \"refId\": \"F\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_get_exists_time_seconds{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: get_exists\",\n              \"refId\": \"G\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_get_time_seconds{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: get_time\",\n              \"refId\": \"H\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_get_missing_time_seconds{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: get_missing\",\n              \"refId\": \"I\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_indexing_delete_time_seconds_total{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: indexing_delete\",\n              \"refId\": \"J\",\n              \"step\": 10\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_indices_get_time_seconds{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: get\",\n              \"refId\": \"K\",\n              \"step\": 10\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Total Operations time\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"s\",\n              \"label\": \"Time\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total Operations stats\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 100,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 20,\n            \"w\": 6,\n            \"x\": 0,\n            \"y\": 11\n          },\n          \"hiddenSeries\": false,\n          \"id\": 45,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"hideZero\": true,\n            \"max\": true,\n            \"min\": true,\n            \"show\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_thread_pool_rejected_count{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: {{ type }}\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Thread Pool operations rejected\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 20,\n            \"w\": 6,\n            \"x\": 6,\n            \"y\": 11\n          },\n          \"hiddenSeries\": false,\n          \"id\": 46,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"hideZero\": true,\n            \"max\": true,\n            \"min\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_thread_pool_active_count{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: {{ type }}\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Thread Pool operations queued\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 20,\n            \"w\": 6,\n            \"x\": 12,\n            \"y\": 11\n          },\n          \"height\": \"\",\n          \"hiddenSeries\": false,\n          \"id\": 43,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"hideZero\": true,\n            \"max\": true,\n            \"min\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_thread_pool_active_count{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: {{ type }}\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Thread Pool threads active\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 20,\n            \"w\": 6,\n            \"x\": 18,\n            \"y\": 11\n          },\n          \"hiddenSeries\": false,\n          \"id\": 44,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"hideZero\": true,\n            \"max\": true,\n            \"min\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"irate(elasticsearch_thread_pool_completed_count{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}: {{ type }}\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Thread Pool operations completed\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Thread Pool\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 17\n      },\n      \"id\": 101,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 18\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 4,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_fielddata_memory_size_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Field data memory size\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": \"Memory\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 18\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 34,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_fielddata_evictions{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Field data evictions\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": \"Evictions/s\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 29\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 35,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_query_cache_memory_size_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Query cache size\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"label\": \"Size\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 29\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 36,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_query_cache_evictions{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Query cache evictions\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": \"Evictions/s\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editable\": true,\n          \"error\": false,\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"grid\": {},\n          \"gridPos\": {\n            \"h\": 11,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 29\n          },\n          \"height\": \"400\",\n          \"hiddenSeries\": false,\n          \"id\": 84,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": true,\n            \"hideEmpty\": false,\n            \"hideZero\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": false,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"connected\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"rate(elasticsearch_indices_filter_cache_evictions{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Evictions from filter cache\",\n          \"tooltip\": {\n            \"msResolution\": false,\n            \"shared\": true,\n            \"sort\": 0,\n            \"value_type\": \"cumulative\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"label\": \"Evictions/s\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Caches\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 102,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 13\n          },\n          \"hiddenSeries\": false,\n          \"id\": 85,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_segments_count{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Count of index segments\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"custom\": {}\n            },\n            \"overrides\": []\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 20\n          },\n          \"hiddenSeries\": false,\n          \"id\": 86,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"7.3.6\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": true,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_segments_memory_bytes{pod=~\\\"$instance\\\",cluster=\\\"$cluster\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{name}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Current memory size of segments in bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Segments\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 19\n      },\n      \"id\": 103,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 20\n          },\n          \"hiddenSeries\": false,\n          \"id\": 75,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_docs_primary{pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{index}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Count of documents with only primary shards\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 27\n          },\n          \"hiddenSeries\": false,\n          \"id\": 83,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_store_size_bytes_primary{pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{index}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Total size of stored index data in bytes with only primary shards on all nodes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 34\n          },\n          \"hiddenSeries\": false,\n          \"id\": 76,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_store_size_bytes_total{pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{index}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Total size of stored index data in bytes with all shards on all nodes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Indices: Count of documents and Total size\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"id\": 106,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 21\n          },\n          \"hiddenSeries\": false,\n          \"id\": 57,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_segment_doc_values_memory_bytes_primary{pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{index}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Doc values with only primary shards on all nodes in bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 28\n          },\n          \"hiddenSeries\": false,\n          \"id\": 58,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_segment_doc_values_memory_bytes_total{pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{index}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Doc values with all shards on all nodes in bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Indices: Doc values\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P4169E866C3094E38\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 21\n      },\n      \"id\": 107,\n      \"panels\": [\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 22\n          },\n          \"hiddenSeries\": false,\n          \"id\": 59,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_segment_fields_memory_bytes_primary{pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{index}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Size of fields with only primary shards on all nodes in bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        },\n        {\n          \"aliasColors\": {},\n          \"bars\": false,\n          \"dashLength\": 10,\n          \"dashes\": false,\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"fill\": 1,\n          \"fillGradient\": 0,\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 29\n          },\n          \"hiddenSeries\": false,\n          \"id\": 60,\n          \"legend\": {\n            \"alignAsTable\": true,\n            \"avg\": true,\n            \"current\": false,\n            \"max\": true,\n            \"min\": true,\n            \"rightSide\": true,\n            \"show\": true,\n            \"sort\": \"avg\",\n            \"sortDesc\": true,\n            \"total\": false,\n            \"values\": true\n          },\n          \"lines\": true,\n          \"linewidth\": 1,\n          \"links\": [],\n          \"nullPointMode\": \"null\",\n          \"options\": {\n            \"alertThreshold\": true\n          },\n          \"percentage\": false,\n          \"pluginVersion\": \"10.1.1\",\n          \"pointradius\": 5,\n          \"points\": false,\n          \"renderer\": \"flot\",\n          \"seriesOverrides\": [],\n          \"spaceLength\": 10,\n          \"stack\": false,\n          \"steppedLine\": false,\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"elasticsearch_indices_segment_fields_memory_bytes_total{pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"{{index}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"thresholds\": [],\n          \"timeRegions\": [],\n          \"title\": \"Size of fields with all shards on all nodes in bytes\",\n          \"tooltip\": {\n            \"shared\": true,\n            \"sort\": 2,\n            \"value_type\": \"individual\"\n          },\n          \"type\": \"graph\",\n          \"xaxis\": {\n            \"mode\": \"time\",\n            \"show\": true,\n            \"values\": []\n          },\n          \"yaxes\": [\n            {\n              \"format\": \"bytes\",\n              \"logBase\": 1,\n              \"show\": true\n            },\n            {\n              \"format\": \"short\",\n              \"logBase\": 1,\n              \"show\": false\n            }\n          ],\n          \"yaxis\": {\n            \"align\": false\n          }\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P4169E866C3094E38\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Indices: Fields\",\n      \"type\": \"row\"\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"elasticsearch\",\n    \"App\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"VictoriaMetrics\",\n          \"value\": \"P4169E866C3094E38\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"vic\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"tansy-856d8f64b4\",\n          \"value\": \"tansy-856d8f64b4\"\n        },\n        \"datasource\": {\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(elasticsearch_indices_docs,cluster)\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"\",\n        \"multi\": false,\n        \"name\": \"cluster\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(elasticsearch_indices_docs,cluster)\",\n          \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"tansy-856d8f64b4-mdit-0\",\n          \"value\": \"tansy-856d8f64b4-mdit-0\"\n        },\n        \"datasource\": {\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(elasticsearch_indices_docs{cluster=\\\"$cluster\\\"},pod)\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"\",\n        \"multi\": false,\n        \"name\": \"instance\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(elasticsearch_indices_docs{cluster=\\\"$cluster\\\"},pod)\",\n          \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"type\": \"query\",\n        \"useTags\": false\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-1h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"Elasticsearch\",\n  \"uid\": \"elasticsearch\",\n  \"version\": 2,\n  \"weekStart\": \"\"\n}\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/elasticsearch/readme.md",
    "content": "# 常用维护操作\n\n1. 查看集群健康概况\n`curl -XGET \"http://127.0.0.1:9200/_cluster/health?pretty\"`\n关键字段：\n  ● green: 所有主分片和副本分片均正常。\n  ● yellow: 主分片正常，部分副本分片未分配。\n  ● red: 存在未分配的主分片。\n  ● number_of_nodes: 当前在线节点数。\n  ● active_shards: 活跃分片数量。\n  ● unassigned_shards: 未分配的分片数（若 >0 需排查原因）。\n\n2. 查看所有节点信息\n`curl -XGET \"http://127.0.0.1:9200/_cat/nodes?v\"`\n关键列：\n  ● heap.percent: JVM堆内存使用率（>75% 需关注）。\n  ● cpu: CPU使用率。\n  ● role: 节点角色（如 mdi 表示主+数据+ingest节点）。\n\n3. 列出所有索引及状态\n`curl -XGET \"http://127.0.0.1:9200/_cat/indices?v\"`\n  ● 关注 health 状态（红/黄/绿）及 docs.count（文档数）。\n\n4. 检查索引分片分布\n`curl -XGET \"http://127.0.0.1:9200/_cat/indices/<index-name>?v&h=index,shard,prirep,state,node\"`\n  ● 确认主分片（p）和副本分片（r）是否均衡分布在节点间。\n\n5. 分片分配详情\n`curl -XGET \"http://127.0.0.1:9200/_cat/shards?v\"`\n● 检查是否有 UNASSIGNED 分片，及其对应的索引和原因。\n\n6. 查看未分配分片原因\n`curl -XGET \"http://127.0.0.1:9200/_cluster/allocation/explain?pretty\"`\n● 输出会提示分片未分配的具体原因（如磁盘不足、节点离线）。\n● 磁盘空间不足：清理旧数据或扩容磁盘。\n● 节点离线：恢复节点或手动分配分片。\n● 配置限制：调整 cluster.routing.allocation 相关设置。\n\n7. 实时查看线程池状态\ncurl -XGET \"http://127.0.0.1:9200/_cat/thread_pool?v\"\n● 关注 bulk、search 队列是否堆积（queue > 0）。\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/kb-values.yaml.j2",
    "content": "## KubeBlocks container image settings\nimage:\n  registry: easzlab.io.local:5000\n\n## Resource settings\nresources:\n  cpu: 500m\n  memory: 1Gi\n\n# dynamically replace instance's registry. ref: https://github.com/apecloud/kubeblocks/pull/8018\nregistryConfig:\n  defaultRegistry: easzlab.io.local:5000\n  defaultNamespace: apecloud\n\n## Data protection settings\ndataProtection:\n  enabled: true\n\n## @param autoInstalledAddons - the list of auto-installed addons when install and upgrade.\nautoInstalledAddons:\n  - \"mongodb\"\n  - \"mysql\"\n  - \"postgresql\"\n  - \"redis\"\n\ncontrollers:\n  apps:\n    enabled: true\n  workloads:\n    enabled: true\n  operations:\n    enabled: true\n  experimental:\n    enabled: false\n  trace:\n    enabled: false\n\nfeatureGates:\n  ignoreConfigTemplateDefaultMode:\n    enabled: false\n  ignorePodVerticalScaling:\n    enabled: false\n  componentReplicasAnnotation:\n    enabled: true\n  inPlacePodVerticalScaling:\n    enabled: false\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/minio/minio-cluster-custom.yaml",
    "content": "apiVersion: v1\nkind: Namespace\nmetadata:\n  name: minio\n\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: minio-cluster-custom-aksk\n  namespace: minio\ntype: Opaque\nimmutable: true\nstringData:\n  # minio secretKey\n  password: sFdw9xOlb19e46dd3aea61ca94177xQ\n  # minio accessKey\n  username: wx9aFJ4U29cwBa1KW2xow9z\n\n---\napiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: minio-cluster-custom-instance\n  namespace: minio\nspec:\n  terminationPolicy: DoNotTerminate\n  componentSpecs:\n    - componentDef: minio\n      name: minio\n      replicas: 4\n      systemAccounts:\n        - name: root\n          secretRef:\n            name: minio-cluster-custom-aksk\n            namespace: minio\n      env:\n        - name: MINIO_BUCKETS\n          value: \"deap,test,data\"\n      resources:\n        requests:\n          cpu: \"0.5\"\n          memory: \"1Gi\"\n        limits:\n          cpu: \"1\"\n          memory: \"2Gi\"\n      instances:\n        - name: tpl1\n          replicas: 1\n          ordinals:\n            ranges:\n              - start: 101\n                end: 200\n          volumeClaimTemplates:\n            - name: data\n              spec:\n                storageClassName: \"lvm-data1\"\n                accessModes:\n                  - ReadWriteOnce\n                resources:\n                  requests:\n                    storage: 500Gi\n        - name: tpl2\n          replicas: 1\n          ordinals:\n            ranges:\n              - start: 201\n                end: 300\n          volumeClaimTemplates:\n            - name: data\n              spec:\n                storageClassName: \"lvm-data3\"\n                accessModes:\n                  - ReadWriteOnce\n                resources:\n                  requests:\n                    storage: 500Gi\n        - name: tpl3\n          replicas: 1\n          ordinals:\n            ranges:\n              - start: 301\n                end: 400\n          volumeClaimTemplates:\n            - name: data\n              spec:\n                storageClassName: \"lvm-data5\"\n                accessModes:\n                  - ReadWriteOnce\n                resources:\n                  requests:\n                    storage: 500Gi\n        - name: tpl4\n          replicas: 1\n          ordinals:\n            ranges:\n              - start: 401\n                end: 500\n          volumeClaimTemplates:\n            - name: data\n              spec:\n                storageClassName: \"lvm-data7\"\n                accessModes:\n                  - ReadWriteOnce\n                resources:\n                  requests:\n                    storage: 500Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/minio/minio-cluster.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: minio-cluster\nspec:\n  terminationPolicy: Delete\n  componentSpecs:\n    - componentDef: minio\n      name: minio\n      replicas: 2\n      env:\n        - name: MINIO_BUCKETS\n          value: \"data,test,logs\"\n      resources:\n        limits:\n          cpu: \"1\"\n          memory: \"1Gi\"\n        requests:\n          cpu: \"1\"\n          memory: \"1Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"host-lvm\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/minio/minio.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"MinIO Grafana Dashboard - https://min.io/\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"gnetId\": 13502,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [\n    {\n      \"icon\": \"external link\",\n      \"includeVars\": true,\n      \"keepTime\": true,\n      \"tags\": [\n        \"minio\"\n      ],\n      \"type\": \"dashboards\"\n    }\n  ],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"percentage\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"dtdurations\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 1,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"time() - max(minio_node_process_starttime_seconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{instance}}\",\n          \"metric\": \"process_start_time_seconds\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 0\n      },\n      \"id\": 65,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"last\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (instance) (minio_s3_traffic_received_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{instance}}\",\n          \"metric\": \"process_start_time_seconds\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Total S3 Ingress\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            }\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Free\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"green\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Used\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"orange\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 4,\n        \"x\": 6,\n        \"y\": 0\n      },\n      \"id\": 50,\n      \"interval\": \"1m\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"displayLabels\": [],\n        \"legend\": {\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true,\n          \"values\": [\n            \"percent\"\n          ]\n        },\n        \"pieType\": \"donut\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"8.2.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"topk(1, sum(minio_cluster_capacity_usable_total_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}) by (instance)) - topk(1, sum(minio_cluster_capacity_usable_free_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}) by (instance))\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"1m\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Used\",\n          \"refId\": \"A\",\n          \"step\": 300\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"topk(1, sum(minio_cluster_capacity_usable_free_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}) by (instance)) \",\n          \"hide\": false,\n          \"interval\": \"1m\",\n          \"legendFormat\": \"Free\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Capacity\",\n      \"type\": \"piechart\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Objects\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"blue\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"Usage\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": true\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 6,\n        \"x\": 10,\n        \"y\": 0\n      },\n      \"id\": 68,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"8.2.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"max(minio_cluster_usage_total_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Usage\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Data Usage Growth\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"continuous-GrYlRd\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 5,\n        \"x\": 16,\n        \"y\": 0\n      },\n      \"id\": 52,\n      \"links\": [],\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"disableTextWrap\": false,\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"minio_cluster_objects_size_distribution{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"fullMetaSearch\": false,\n          \"includeNullMetadata\": true,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{range}}\",\n          \"refId\": \"A\",\n          \"step\": 300,\n          \"useBackend\": false\n        }\n      ],\n      \"title\": \"Object Size Distribution\",\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 25,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 21,\n        \"y\": 0\n      },\n      \"id\": 61,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"hidden\",\n          \"placement\": \"right\",\n          \"showLegend\": false\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"10.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"minio_node_file_descriptor_open_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{server}}\",\n          \"metric\": \"process_start_time_seconds\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Open FDs \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 3\n      },\n      \"id\": 64,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"last\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (instance) (minio_s3_traffic_sent_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"metric\": \"process_start_time_seconds\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Total S3 Egress\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 25,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 21,\n        \"y\": 3\n      },\n      \"id\": 62,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"hidden\",\n          \"placement\": \"right\",\n          \"showLegend\": false\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"10.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"minio_node_go_routine_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{server}}\",\n          \"metric\": \"process_start_time_seconds\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Goroutines\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bool_on_off\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 6\n      },\n      \"id\": 94,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"disableTextWrap\": false,\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"minio_cluster_health_status{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"fullMetaSearch\": false,\n          \"includeNullMetadata\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"Pool: {{pool}} Set: {{set}}\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"useBackend\": false\n        }\n      ],\n      \"title\": \"Cluster Health Status\",\n      \"transformations\": [],\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"percentage\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 6\n      },\n      \"id\": 78,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"max(minio_cluster_drive_online_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \".\",\n          \"metric\": \"process_start_time_seconds\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 60\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"max(minio_cluster_drive_offline_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": true,\n          \"legendFormat\": \".\",\n          \"range\": false,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Total Online/Offline Drives\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"dark-yellow\",\n                \"value\": 75000000\n              },\n              {\n                \"color\": \"dark-red\",\n                \"value\": 100000000\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 6\n      },\n      \"id\": 66,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"max(minio_cluster_bucket_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"1m\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Number of Buckets\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 25,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"binBps\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 7,\n        \"x\": 9,\n        \"y\": 6\n      },\n      \"id\": 63,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"hidden\",\n          \"placement\": \"right\",\n          \"showLegend\": false\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"10.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (server) (rate(minio_s3_traffic_received_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]))\",\n          \"interval\": \"1m\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Data Received [{{server}}]\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"S3 API Ingress Rate \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 25,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"binBps\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 6\n      },\n      \"id\": 70,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"hidden\",\n          \"placement\": \"right\",\n          \"showLegend\": false\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"10.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (server) (rate(minio_s3_traffic_sent_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]))\",\n          \"interval\": \"1m\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Data Sent [{{server}}]\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"S3 API Egress Rate \",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 53,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"max(minio_cluster_nodes_online_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"metric\": \"process_start_time_seconds\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Total Online Servers\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"dark-yellow\",\n                \"value\": 75000000\n              },\n              {\n                \"color\": \"dark-red\",\n                \"value\": 100000000\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 9\n      },\n      \"id\": 44,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"max(minio_cluster_usage_object_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"1m\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Number of Objects\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"ns\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 10\n      },\n      \"id\": 80,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"last\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"max(minio_heal_time_last_activity_nano_seconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"metric\": \"process_start_time_seconds\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Time Since Last Heal\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"ns\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 10\n      },\n      \"id\": 81,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"last\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"max(minio_usage_last_activity_nano_seconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"metric\": \"process_start_time_seconds\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"Time Since Last Scan\",\n      \"type\": \"stat\"\n    },\n    {\n      \"aliasColors\": {\n        \"S3 Errors\": \"light-red\",\n        \"S3 Requests\": \"light-green\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 9,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"hiddenSeries\": false,\n      \"id\": 60,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.1.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (server,api) (increase(minio_s3_requests_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]))\",\n          \"interval\": \"1m\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{server,api}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"S3 API Request Rate\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:331\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:332\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"S3 Errors\": \"light-red\",\n        \"S3 Requests\": \"light-green\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 7,\n        \"x\": 9,\n        \"y\": 12\n      },\n      \"hiddenSeries\": false,\n      \"id\": 88,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.1.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (server,api) (increase(minio_s3_requests_4xx_errors_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]))\",\n          \"interval\": \"1m\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{server,api}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"S3 API Request Error Rate (4xx)\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:331\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:332\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"S3 Errors\": \"light-red\",\n        \"S3 Requests\": \"light-green\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 12\n      },\n      \"hiddenSeries\": false,\n      \"id\": 86,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.1.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (server,api) (increase(minio_s3_requests_5xx_errors_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]))\",\n          \"interval\": \"1m\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{server,api}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"S3 API Request Error Rate (5xx)\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:331\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:332\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"fixed\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 99,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"disableTextWrap\": false,\n          \"editorMode\": \"builder\",\n          \"expr\": \"minio_cluster_health_erasure_set_online_drives{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"fullMetaSearch\": false,\n          \"hide\": false,\n          \"includeNullMetadata\": true,\n          \"instant\": false,\n          \"legendFormat\": \"Pool {{pool}} / Set {{set}} - Online Drives\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"useBackend\": false\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"disableTextWrap\": false,\n          \"editorMode\": \"builder\",\n          \"expr\": \"minio_cluster_health_erasure_set_read_quorum{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"fullMetaSearch\": false,\n          \"hide\": false,\n          \"includeNullMetadata\": true,\n          \"instant\": false,\n          \"legendFormat\": \"Pool {{pool}} / Set {{set}} - Read Quorum\",\n          \"range\": true,\n          \"refId\": \"B\",\n          \"useBackend\": false\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"disableTextWrap\": false,\n          \"editorMode\": \"builder\",\n          \"expr\": \"minio_cluster_health_erasure_set_write_quorum{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"fullMetaSearch\": false,\n          \"hide\": false,\n          \"includeNullMetadata\": true,\n          \"instant\": false,\n          \"legendFormat\": \"Pool {{pool}} / Set {{set}} - Write Quorum\",\n          \"range\": true,\n          \"refId\": \"C\",\n          \"useBackend\": false\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"disableTextWrap\": false,\n          \"editorMode\": \"builder\",\n          \"expr\": \"minio_cluster_health_erasure_set_healing_drives{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"fullMetaSearch\": false,\n          \"hide\": false,\n          \"includeNullMetadata\": true,\n          \"instant\": false,\n          \"legendFormat\": \"Pool {{pool}} / Set {{set}} - Healing Drives\",\n          \"range\": true,\n          \"refId\": \"D\",\n          \"useBackend\": false\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"disableTextWrap\": false,\n          \"editorMode\": \"builder\",\n          \"expr\": \"minio_cluster_health_erasure_set_status{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"fullMetaSearch\": false,\n          \"hide\": false,\n          \"includeNullMetadata\": true,\n          \"instant\": false,\n          \"legendFormat\": \"Pool {{pool}} / Set {{set}} - Status\",\n          \"range\": true,\n          \"refId\": \"E\",\n          \"useBackend\": false\n        }\n      ],\n      \"title\": \"Health Breakdown\",\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"continuous-GrYlRd\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 18\n      },\n      \"id\": 76,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"10.1.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"minio_node_process_resident_memory_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{server}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Memory Usage \",\n      \"type\": \"bargauge\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": true,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 26\n      },\n      \"hiddenSeries\": false,\n      \"id\": 73,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_io_rchar_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Node RChar [{{server}}]\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_io_wchar_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Node WChar [{{server}}]\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Read, Write I/O\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:381\",\n          \"format\": \"bytes\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:382\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"percentage\",\n            \"steps\": [\n              {\n                \"color\": \"green\"\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 70\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 85\n              }\n            ]\n          },\n          \"unit\": \"s\",\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 26\n      },\n      \"id\": 77,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"10.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_process_cpu_total_seconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{server}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CPU Usage\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Total number of bytes received and sent on MinIO cluster\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 25,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\"\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\",\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 33\n      },\n      \"id\": 17,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"hidden\",\n          \"placement\": \"right\",\n          \"showLegend\": false\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"10.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_inter_node_traffic_sent_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Internode Bytes Received [{{server}}]\",\n          \"metric\": \"minio_http_requests_duration_seconds_count\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 4\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_inter_node_traffic_received_bytes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Internode Bytes Sent [{{server}}]\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Internode Traffic\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"aliasColors\": {\n        \"available 10.13.1.25:9000\": \"green\",\n        \"used 10.13.1.25:9000\": \"blue\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"links\": [],\n          \"unit\": \"bytes\",\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 33\n      },\n      \"hiddenSeries\": false,\n      \"id\": 8,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"minio_node_file_descriptor_open_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Open FDs [{{server}}]\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"File Descriptors\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:212\",\n          \"format\": \"bytes\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:213\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"Offline 10.13.1.25:9000\": \"dark-red\",\n        \"Total 10.13.1.25:9000\": \"blue\"\n      },\n      \"bars\": true,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Number of online drives per MinIO Server\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"links\": [],\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 40\n      },\n      \"hiddenSeries\": false,\n      \"id\": 11,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": false,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_syscall_read_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Read Syscalls [{{server}}]\",\n          \"metric\": \"process_start_time_seconds\",\n          \"refId\": \"A\",\n          \"step\": 60\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_syscall_write_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Write Syscalls [{{server}}]\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Syscalls\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:185\",\n          \"decimals\": 0,\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:186\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 40\n      },\n      \"hiddenSeries\": false,\n      \"id\": 95,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_scanner_objects_scanned{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"interval\": \"1m\",\n          \"legendFormat\": \"[{{server}}]\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Scanned Objects\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:212\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:213\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 47\n      },\n      \"hiddenSeries\": false,\n      \"id\": 75,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_scanner_versions_scanned{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"interval\": \"1m\",\n          \"legendFormat\": \"[{{server}}]\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Scanned Versions\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:212\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:213\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 47\n      },\n      \"hiddenSeries\": false,\n      \"id\": 96,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_scanner_directories_scanned{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"interval\": \"1m\",\n          \"legendFormat\": \"[{{server}}]\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Scanned Directories\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:212\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:213\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"percentage\",\n            \"steps\": [\n              {\n                \"color\": \"green\"\n              }\n            ]\n          },\n          \"unit\": \"dtdurations\",\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 54\n      },\n      \"id\": 89,\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"minio_cluster_kms_uptime{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{instance}}\",\n          \"metric\": \"minio_cluster_kms_uptime\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"title\": \"KMS Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"aliasColors\": {\n        \"S3 Errors\": \"light-red\",\n        \"S3 Requests\": \"light-green\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 4,\n        \"x\": 4,\n        \"y\": 54\n      },\n      \"hiddenSeries\": false,\n      \"id\": 91,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (server) (increase(minio_cluster_kms_request_error{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]))\",\n          \"interval\": \"1m\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{server}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"KMS Request 4xx Error Rate\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:331\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:332\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unit\": \"bool_on_off\",\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 4,\n        \"x\": 8,\n        \"y\": 54\n      },\n      \"hiddenSeries\": false,\n      \"id\": 90,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (server) (minio_cluster_kms_online{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"interval\": \"1m\",\n          \"legendFormat\": \"{{server}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"KMS Online(1)/Offline(0)\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:212\",\n          \"format\": \"bool_on_off\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:213\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 54\n      },\n      \"hiddenSeries\": false,\n      \"id\": 98,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_scanner_bucket_scans_finished{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"interval\": \"1m\",\n          \"legendFormat\": \"[{{server}}]\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Bucket Scans Finished\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:212\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:213\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"S3 Errors\": \"light-red\",\n        \"S3 Requests\": \"light-green\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 58\n      },\n      \"hiddenSeries\": false,\n      \"id\": 92,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (server) (increase(minio_cluster_kms_request_failure{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]))\",\n          \"interval\": \"1m\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{server}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"KMS Request 5xx Error Rate\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:331\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:332\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"S3 Errors\": \"light-red\",\n        \"S3 Requests\": \"light-green\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 58\n      },\n      \"hiddenSeries\": false,\n      \"id\": 93,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum by (server) (rate(minio_cluster_kms_request_success{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]))\",\n          \"interval\": \"1m\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"KMS Request Success [{{server}}]\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"KMS Request Success Rate \",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:331\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:332\",\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"unitScale\": true\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 61\n      },\n      \"hiddenSeries\": false,\n      \"id\": 97,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"10.3.1\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(minio_node_scanner_bucket_scans_started{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n          \"interval\": \"1m\",\n          \"legendFormat\": \"[{{server}}]\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Bucket Scans Started\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:212\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:213\",\n          \"format\": \"none\",\n          \"logBase\": 1,\n          \"min\": \"0\",\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    }\n  ],\n  \"refresh\": \"\",\n  \"schemaVersion\": 38,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"minio\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {},\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"data source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"label_values(minio_cluster_health_status,namespace)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"namespace\",\n        \"multi\": true,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(minio_cluster_health_status,namespace)\",\n          \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"label_values(minio_cluster_health_status{namespace=\\\"$namespace\\\"},app_kubernetes_io_instance)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"cluster\",\n        \"multi\": true,\n        \"name\": \"cluster\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(minio_cluster_health_status{namespace=\\\"$namespace\\\"},app_kubernetes_io_instance)\",\n          \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 5,\n        \"type\": \"query\"\n      },\n      {\n        \"current\": {\n          \"selected\": true,\n          \"text\": [\n            \"cre70-5d65d75b8b-minio-1\"\n          ],\n          \"value\": [\n            \"cre70-5d65d75b8b-minio-1\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"label_values(minio_cluster_health_status{namespace=\\\"$namespace\\\", app_kubernetes_io_instance=\\\"$cluster\\\"},pod)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"instance\",\n        \"multi\": true,\n        \"name\": \"instance\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(minio_cluster_health_status{namespace=\\\"$namespace\\\", app_kubernetes_io_instance=\\\"$cluster\\\"},pod)\",\n          \"refId\": \"PrometheusVariableQueryEditor-VariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"\",\n  \"title\": \"MinIO Dashboard\",\n  \"uid\": \"TgmJnqnnk\",\n  \"version\": 16,\n  \"weekStart\": \"\"\n}\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/minio/restart.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: minio-restart\nspec:\n  # Specifies the name of the Cluster resource that this operation is targeting.\n  clusterName: minio-cluster\n  type: Restart\n  # Lists Components to be restarted. ComponentOps specifies the Component to be operated on.\n  restart:\n    # Specifies the name of the Component.\n  - componentName: minio\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/minio/scale-out.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: minio-scale-out\nspec:\n  # Specifies the name of the Cluster resource that this operation is targeting.\n  clusterName: minio-cluster\n  type: HorizontalScaling\n  # Lists HorizontalScaling objects, each specifying scaling requirements for a Component, including desired total replica counts, configurations for new instances, modifications for existing instances, and instance downscaling options\n  horizontalScaling:\n    # Specifies the name of the Component.\n  - componentName: minio\n    # Specifies the replica changes for scaling in components\n    scaleOut:\n      # Specifies the replica changes for the component.\n      # add one more replica to current component\n      replicaChanges: 2\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/minio/start.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: minio-start\nspec:\n  # Specifies the name of the Cluster resource that this operation is targeting.\n  clusterName: minio-cluster\n  type: Start\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/minio/stop.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: minio-stop\nspec:\n  # Specifies the name of the Cluster resource that this operation is targeting.\n  clusterName: minio-cluster\n  force: true\n  type: Stop\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/minio/verticalscale.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: minio-verticalscaling\nspec:\n  # Specifies the name of the Cluster resource that this operation is targeting.\n  clusterName: minio-cluster\n  type: VerticalScaling\n  # Lists VerticalScaling objects, each specifying a component and its desired compute resources for vertical scaling.\n  verticalScaling:\n  - componentName: minio\n    # VerticalScaling refers to the process of adjusting the compute resources (e.g., CPU, memory) allocated to a Component. It defines the parameters required for the operation.\n    requests:\n      cpu: '1'\n      memory: 1Gi\n    limits:\n      cpu: '1'\n      memory: 1Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/001.semisync-cluster.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: semisync-mysql-cluster\nspec:\n  clusterDef: mysql\n  topology: semisync\n  terminationPolicy: Delete\n  componentSpecs:\n    - name: mysql\n      componentDef: \"mysql-8.0-1.0.0\"\n      disableExporter: false\n      serviceVersion: 8.0.39\n      stop: false \n      replicas: 2\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      env:\n        - name: SEMI_SYNC_TIMEOUT\n          value: \"5000\"\n        - name: LANG\n          value: \"C.UTF-8\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/002.semisync-proxy-cluster.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: semisync-proxysql-mysql-cluster\nspec:\n  clusterDef: mysql\n  topology: semisync-proxysql\n  terminationPolicy: Delete\n  componentSpecs:\n    - name: mysql\n      serviceVersion: 8.0.39\n      replicas: 2\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n    - name: proxysql\n      serviceVersion: 2.4.4\n      replicas: 2\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/003.semisync-cluster-custom-instance.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: semisync-mysql-cluster\nspec:\n  clusterDef: mysql\n  topology: semisync\n  terminationPolicy: Delete\n  componentSpecs:\n    - name: mysql\n      disableExporter: false\n      serviceVersion: 8.0.39\n      stop: false \n      replicas: 2\n      resources:\n        limits:\n          cpu: '2'\n          memory: 2Gi\n      env:\n        - name: SEMI_SYNC_TIMEOUT\n          value: \"5000\"\n        - name: LANG\n          value: \"C.UTF-8\"\n        - name: TZ\n          value: Asia/Shanghai\n      instances:\n        - name: tpl1         # first template\n          replicas: 1\n          ordinals:\n            ranges:\n              - start: 1\n                end: 100\n          volumeClaimTemplates: # tpl1's vct\n            - name: data\n              spec:\n                storageClassName: \"host-lvm\"\n                accessModes:\n                  - ReadWriteOnce\n                resources:\n                  requests:\n                    storage: 10Gi\n        - name: tpl2  # second template\n          replicas: 1\n          ordinals:\n            ranges:\n              - start: 101\n                end: 200\n          resources:\n            limits:\n              cpu: '1'\n              memory: 1Gi\n          volumeClaimTemplates: # tpl2's vct\n            - name: data\n              spec:\n                storageClassName: \"host-path\"\n                accessModes:\n                  - ReadWriteOnce\n                resources:\n                  requests:\n                    storage: 10Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/101.stop.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-cluster-stop-ops\nspec:\n  clusterName: semisync-mysql-cluster\n  type: Stop\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/102.start.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-cluster-start-ops\nspec:\n  clusterName: semisync-mysql-cluster\n  type: Start\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/103.restart.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-cluster-restart-ops\nspec:\n  clusterName: semisync-mysql-cluster \n  type: Restart\n  restart:\n  - componentName: mysql\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/104.vscale.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-cluster-vscale-ops\nspec:\n  clusterName: semisync-mysql-cluster\n  type: VerticalScaling\n  verticalScaling:\n  - componentName: mysql\n    requests:\n      cpu: '1'\n      memory: 1Gi\n    limits:\n      cpu: '1'\n      memory: 1Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/105.hscale.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-cluster-scale-out-ops\nspec:\n  # Specifies the name of the Cluster resource that this operation is targeting.\n  clusterName: semisync-mysql-cluster\n  type: HorizontalScaling\n  # Lists HorizontalScaling objects, each specifying scaling requirements for a Component, including desired total replica counts, configurations for new instances, modifications for existing instances, and instance downscaling options\n  horizontalScaling:\n    # Specifies the name of the Component.\n  - componentName: mysql\n    # Specifies the replica changes for scaling in components\n    scaleOut:\n      # Specifies the replica changes for the component.\n      # add one more replica to current component\n      replicaChanges: 1\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/106.api-expose.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: semisync-mysql-cluster\nspec:\n  clusterDef: mysql\n  topology: semisync\n  terminationPolicy: Delete\n  services:\n    - componentSelector: mysql\n      name: mysql-external\n      serviceName: mysql-external\n      roleSelector: primary\n      spec:\n        ipFamilyPolicy: PreferDualStack\n        ports:\n          - name: tcp-mysql\n            port: 3306\n            protocol: TCP\n            targetPort: mysql\n        type: NodePort\n    - componentSelector: mysql\n      name: mysql-bk-external\n      serviceName: mysql-bk-external\n      roleSelector: secondary\n      spec:\n        ipFamilyPolicy: PreferDualStack\n        ports:\n          - name: tcp-mysql\n            port: 3306\n            protocol: TCP\n            targetPort: mysql\n        type: NodePort\n  componentSpecs:\n    - name: mysql\n      componentDef: \"mysql-8.0-1.0.0\"\n      disableExporter: false\n      serviceVersion: 8.0.39\n      stop: false \n      replicas: 2\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      env:\n        - name: SEMI_SYNC_TIMEOUT\n          value: \"5000\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/106.expose.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-cluster-expose-enable-ops\nspec:\n  type: Expose\n  clusterName: semisync-mysql-cluster\n  expose:\n  - componentName: mysql\n    services:\n    - name: internet\n      # Valid options are 'ClusterIP', 'NodePort', and 'LoadBalancer'.\n      serviceType: NodePort\n      # Contains cloud provider related parameters if ServiceType is LoadBalancer.\n      #annotations:\n        #service.beta.kubernetes.io/aws-load-balancer-type: nlb\n        #service.beta.kubernetes.io/aws-load-balancer-internal: \"false\"\n      # Specifies a role to target with the service.\n      # If specified, the service will only be exposed to pods with the matching role.\n      roleSelector: primary\n    switch: Enable\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/107.reconf-dynamic.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: mysql-reconfigure-dynamic\nspec:\n  clusterName: semisync-mysql-cluster\n  force: false\n  reconfigures:\n  - componentName: mysql\n    parameters:\n      - key: max_connections\n        value: '200'\n  preConditionDeadlineSeconds: 0\n  type: Reconfiguring\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/108.reconf-static.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: mysql-reconfigure-static\nspec:\n  clusterName: semisync-mysql-cluster \n  force: false\n  reconfigures:\n  - componentName: mysql\n    parameters:\n    - key: performance_schema\n      value: 'ON'\n  preConditionDeadlineSeconds: 0\n  type: Reconfiguring\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/109.switchover.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-switchover-ops\nspec:\n  clusterName: semisync-mysql-cluster \n  type: Switchover\n  switchover:\n  - componentName: mysql\n    # Specifies the instance (Pod) that is primary or leader before a switchover operation.\n    instanceName: semisync-mysql-cluster-mysql-1 \n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/110.repair.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-ops-rebuild-replica-inplace\nspec:\n  clusterName: semisync-mysql-cluster \n  type: RebuildInstance\n  force: true\n  rebuildFrom:\n  - componentName: mysql\n    inPlace: true\n    instances:\n      # the instance name (Pod name) that will be repaired \n      - name: semisync-mysql-cluster-mysql-1\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/121.backup-repo.yaml",
    "content": "# Create a secret to save the access key for MinIO\n#kubectl create secret generic minio-credential-for-backuprepo \\\n#  -n kb-system \\\n#  --from-literal=accessKeyId=<ACCESS KEY> \\\n#  --from-literal=secretAccessKey=<SECRET KEY>\n\n# Create the BackupRepo resource\napiVersion: dataprotection.kubeblocks.io/v1alpha1\nkind: BackupRepo\nmetadata:\n  name: my-repo\n  annotations:\n    dataprotection.kubeblocks.io/is-default-repo: \"true\"\nspec:\n  storageProviderRef: minio\n  accessMethod: Tool\n  pvReclaimPolicy: Retain\n  volumeCapacity: 50Gi\n  config:\n    bucket: db-backup\n    mountOptions: \"\"\n    endpoint: http://minio.minio.svc\n  credential:\n    name: minio-credential-for-backuprepo\n    namespace: kb-system\n  pathPrefix: \"\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/122.full-backup.yaml",
    "content": "apiVersion: dataprotection.kubeblocks.io/v1alpha1\nkind: Backup\nmetadata:\n  name: example-mysql-cluster-backup\nspec:\n  # Specifies the backup method name that is defined in the backup policy.\n  # - xtrabackup\n  # - volume-snapshot\n  backupMethod: xtrabackup\n  backupPolicyName: semisync-mysql-cluster-mysql-backup-policy\n  # Determines whether the backup contents stored in the backup repository should be deleted when the backup custom resource(CR) is deleted. Supported values are 'Retain' and 'Delete'.\n  # - 'Retain' means that the backup content and its physical snapshot on backup repository are kept.\n  # - 'Delete' means that the backup content and its physical snapshot on backup repository are deleted.\n  deletionPolicy: Delete\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/123.scheduled-backup.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: semisync-mysql-cluster\nspec:\n  clusterDef: mysql\n  topology: semisync\n  terminationPolicy: Delete\n  componentSpecs:\n    - name: mysql\n      componentDef: \"mysql-8.0-1.0.0\"\n      disableExporter: false\n      serviceVersion: 8.0.39\n      stop: false \n      replicas: 2\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      env:\n        - name: SEMI_SYNC_TIMEOUT\n          value: \"5000\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n\n  backup:\n    enabled: true\n    retentionPeriod: 7d\n    method: xtrabackup\n    # note: use UTC time\n    cronExpression: '10 11 * * *'\n    repoName: my-repo\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/124.scheduled-continuous-backup.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: semisync-mysql-cluster\nspec:\n  clusterDef: mysql\n  topology: semisync\n  terminationPolicy: Delete\n  componentSpecs:\n    - name: mysql\n      componentDef: \"mysql-8.0-1.0.0\"\n      disableExporter: false\n      serviceVersion: 8.0.39\n      stop: false \n      replicas: 2\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      env:\n        - name: SEMI_SYNC_TIMEOUT\n          value: \"5000\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n\n  backup:\n    enabled: true\n    retentionPeriod: 7d\n    method: xtrabackup\n    # note: use UTC time\n    cronExpression: '59 12 * * *'\n    repoName: my-repo\n    pitrEnabled: true\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/125.restore.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-cluster-restore\nspec:\n  clusterName: example-mysql-cluster-restored\n  force: false\n  restore:\n    backupName: example-mysql-cluster-backup \n    backupNamespace: demo\n  type: Restore\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/126.restore-pitr.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: example-mysql-cluster-restore-pitr\nspec:\n  clusterName: mysql-cluster-restore-pitr\n  force: false\n  restore:\n    backupName: semisync-mysql-cluster-xtrabackup-20250708125900 \n    backupNamespace: demo\n    # note: use UTC time\n    restorePointInTime: 2025-07-09T01:55:00Z\n  type: Restore\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/131.pod-monitor.yaml",
    "content": "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n  name: mysql-cluster-pod-monitor\n  namespace: monitor    # Note: this is namespace for prometheus operator\n  labels:               # this is labels set in 'prometheus.spec.podMonitorSelector'\n    release: prometheus\nspec:\n  jobLabel: app.kubernetes.io/managed-by\n  # defines the labels which are transferred from the\n  # associated Kubernetes 'Pod' object onto the ingested metrics\n  # set the lables w.r.t you own needs\n  podTargetLabels:\n  - app.kubernetes.io/instance\n  - app.kubernetes.io/managed-by\n  - apps.kubeblocks.io/component-name\n  - apps.kubeblocks.io/pod-name\n  podMetricsEndpoints:\n    - path: /metrics\n      port: http-metrics\n      scheme: http\n  namespaceSelector:\n    matchNames:\n      - demo\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: semisync-mysql-cluster\n      apps.kubeblocks.io/component-name: mysql\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/132.alert-rules.yaml",
    "content": "apiVersion: monitoring.coreos.com/v1\nkind: PrometheusRule\nmetadata:\n  name: mysql-alert-rules\n  labels:\n    release: prometheus\nspec:\n  groups:\n    - name: MysqldExporter\n      rules:\n        - alert: MysqlDown\n          expr: \"max_over_time(mysql_up[1m]) == 0\"\n          for: 0m\n          labels:\n            severity: critical\n          annotations:\n            summary: \"MySQL is down\"\n            description: \"MySQL is down. (instance: {{ $labels.pod }})\"\n\n        - alert: MysqlRestarted\n          expr: \"mysql_global_status_uptime < 60\"\n          for: 0m\n          labels:\n            severity: info\n          annotations:\n            summary: \"MySQL has just been restarted (< 60s)\"\n            description: 'MySQL has just been restarted {{ $value | printf \"%.1f\" }} seconds ago. (instance: {{ $labels.pod }})'\n\n        - alert: MysqlTooManyConnections\n          expr: \"sum(max_over_time(mysql_global_status_threads_connected[1m]) / mysql_global_variables_max_connections) BY (namespace,app_kubernetes_io_instance,pod) * 100 > 80\"\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"MySQL has too many connections (> 80%)\"\n            description: '{{ $value | printf \"%.2f\" }} percent of MySQL connections are in use. (instance: {{ $labels.pod }})'\n\n        - alert: MysqlConnectionErrors\n          expr: \"sum(increase(mysql_global_status_connection_errors_total[1m])) BY (namespace,app_kubernetes_io_instance,pod) > 0\"\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"MySQL connection errors\"\n            description: 'MySQL has connection errors and the value is {{ $value | printf \"%.2f\" }}. (instance: {{ $labels.pod }})'\n\n        - alert: MysqlHighThreadsRunning\n          expr: \"sum(max_over_time(mysql_global_status_threads_running[1m]) / mysql_global_variables_max_connections) BY (namespace,app_kubernetes_io_instance,pod) * 100 > 60\"\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"MySQL high threads running (> 60%)\"\n            description: '{{ $value | printf \"%.2f\" }} percent of MySQL connections are in running state. (instance: {{ $labels.pod }})'\n\n        - alert: MysqlSlowQueries\n          expr: \"sum(increase(mysql_global_status_slow_queries[1m])) BY (namespace,app_kubernetes_io_instance,pod) > 0\"\n          for: 2m\n          labels:\n            severity: info\n          annotations:\n            summary: \"MySQL slow queries\"\n            description: 'MySQL server has {{ $value | printf \"%.2f\" }} slow query. (instance: {{ $labels.pod }})'\n\n        - alert: MysqlInnodbLogWaits\n          expr: \"sum(rate(mysql_global_status_innodb_log_waits[5m])) BY (namespace,app_kubernetes_io_instance,pod) > 10\"\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"MySQL InnoDB log waits (> 10)\"\n            description: 'MySQL innodb log writes stalling and the value is {{ $value | printf \"%.2f\" }}. (instance: {{ $labels.pod }})'\n\n        - alert: MysqlInnodbBufferPoolHits\n          expr: \"sum(rate(mysql_global_status_innodb_buffer_pool_reads[5m]) / rate(mysql_global_status_innodb_buffer_pool_read_requests[5m])) BY (namespace,app_kubernetes_io_instance,pod) * 100 > 5\"\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"MySQL InnoDB high read requests rate hitting disk (> 5%)\"\n            description: 'High number of logical reads that InnoDB could not satisfy from the buffer pool, and had to read directly from disk. The value is {{ $value | printf \"%.2f\" }} percent. (instance: {{ $labels.pod }})'\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/benchmark.py",
    "content": "import subprocess\nimport argparse\nimport mysql.connector\nfrom mysql.connector import Error\n\n###############################################################################\n###############################################################################\n# README.md\n# This is a simple test for MySQL using sysbench\n#\n# Prerequisites\n# - Sysbench installed\n#   - `sudo apt-get install sysbench` on Ubuntu\n#   - `brew install sysbench` on MacOS\n# - Python 3.6+\n# - MySQL client libraries (`python3 -m pip install mysql-connector-python`)\n#\n# Run test\n# - python3 benchmark.py --host <host> --user <user> --password <password>\n###############################################################################\n###############################################################################\n\n# Configuration variables\nMYSQL_HOST = \"127.0.0.1\"\nMYSQL_PORT = 3306\nMYSQL_USER = \"<USERNAME>\" #\nMYSQL_PASSWORD = \"<PASSWD>\"\n\nSYSBENCH_DB_NAME = \"sysbench_test\"\nSYSBENCH_USER = \"sysbench_user\"\nSYSBENCH_PASSWORD = \"SysbenchPass123!\"\n\nTABLE_SIZE = 100000\nTHREADS = [4, 8, 16]  # Different thread counts to test\nDURATION = 60  # Test duration in seconds\n\ndef create_mysql_user_and_db(host, port, root_user, root_password):\n    try:\n        connection = mysql.connector.connect(\n            host=host,\n            user=root_user,\n            password=root_password,\n            port=port,\n            auth_plugin='caching_sha2_password'\n        )\n\n        cursor = connection.cursor()\n\n        # Create database\n        cursor.execute(f\"CREATE DATABASE IF NOT EXISTS {SYSBENCH_DB_NAME}\")\n\n        # Create user and grant privileges\n        cursor.execute(f\"\"\"\n            CREATE USER IF NOT EXISTS '{SYSBENCH_USER}'@'%'\n            IDENTIFIED BY '{SYSBENCH_PASSWORD}'\n        \"\"\")\n        cursor.execute(f\"\"\"\n            GRANT ALL PRIVILEGES ON {SYSBENCH_DB_NAME}.*\n            TO '{SYSBENCH_USER}'@'%'\n        \"\"\")\n        connection.commit()\n\n        print(\"MySQL user and database created successfully\")\n\n    except Error as e:\n        print(f\"Error creating MySQL user/database: {e}\")\n        exit(1)\n    finally:\n        if connection.is_connected():\n            cursor.close()\n            connection.close()\n\ndef check_dependencies():\n    try:\n        subprocess.run([\"sysbench\", \"--version\"], check=True, capture_output=True)\n    except (subprocess.CalledProcessError, FileNotFoundError):\n        print(\"Error: sysbench is not installed. Please install it first.\")\n        print(\"For Ubuntu/Debian: sudo apt-get install sysbench\")\n        print(\"For CentOS/RHEL: sudo yum install sysbench\")\n        exit(1)\n\ndef run_sysbench(command, test_type):\n    try:\n        print(f\"Running {test_type} test...\")\n        result = subprocess.run(\n            command,\n            check=True,\n            shell=True,\n            capture_output=True,\n            text=True\n        )\n        print(result.stdout)\n        print(f\"✅ {test_type} test completed successfully\")\n        return True\n    except subprocess.CalledProcessError as e:\n        print(f\"❌ Error during {test_type} test:\")\n        print(e.stderr)\n        return False\n\ndef main():\n    # Create database if not exists\n    # Create MySQL user and database\n    create_mysql_user_and_db(MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD)\n\n    # Prepare command\n    prepare_cmd = (\n        f\"sysbench oltp_read_write \"\n        f\"--db-driver=mysql \"\n        f\"--mysql-host={MYSQL_HOST} \"\n        f\"--mysql-port={MYSQL_PORT} \"\n        f\"--mysql-user={SYSBENCH_USER} \"\n        f\"--mysql-password={SYSBENCH_PASSWORD} \"\n        f\"--mysql-db={SYSBENCH_DB_NAME} \"\n        f\"--table-size={TABLE_SIZE} \"\n        f\"--report-interval=1 \"\n        f\"prepare\"\n    )\n\n    if not run_sysbench(prepare_cmd, \"Prepare\"):\n        return\n\n    # Run benchmark for different thread counts\n    for threads in THREADS:\n        print(f\"\\n🏁 Starting benchmark with {threads} threads\")\n        run_cmd = (\n            f\"sysbench oltp_read_write \"\n            f\"--db-driver=mysql \"\n            f\"--mysql-host={MYSQL_HOST} \"\n            f\"--mysql-port={MYSQL_PORT} \"\n            f\"--mysql-user={SYSBENCH_USER} \"\n            f\"--mysql-password={SYSBENCH_PASSWORD} \"\n            f\"--mysql-db={SYSBENCH_DB_NAME} \"\n            f\"--table-size={TABLE_SIZE} \"\n            f\"--threads={threads} \"\n            f\"--time={DURATION} \"\n            f\"--report-interval=1 \"\n            f\"run\"\n        )\n\n        if run_sysbench(run_cmd, f\"Runtime ({threads} threads)\"):\n            print(f\"📊 Results for {threads} threads:\")\n            print(\"--------------------------------\")\n\n    # Cleanup\n    cleanup_cmd = (\n        f\"sysbench oltp_read_write \"\n        f\"--db-driver=mysql \"\n        f\"--mysql-host={MYSQL_HOST} \"\n        f\"--mysql-port={MYSQL_PORT} \"\n        f\"--mysql-user={SYSBENCH_USER} \"\n        f\"--mysql-password={SYSBENCH_PASSWORD} \"\n        f\"--mysql-db={SYSBENCH_DB_NAME} \"\n        f\"--table-size={TABLE_SIZE} \"\n        f\"--report-interval=1 \"\n        f\"cleanup\"\n    )\n    run_sysbench(cleanup_cmd, \"Cleanup\")\n\nif __name__ == \"__main__\":\n    # Verify dependencies\n    check_dependencies()\n\n    parser = argparse.ArgumentParser(description='MySQL Sysbench Runner')\n    parser.add_argument('--host', help='MySQL Host', default=MYSQL_HOST)\n    parser.add_argument('--port', help='MySQL Port', default=MYSQL_PORT)\n    parser.add_argument('--user', help='MySQL User', default=MYSQL_USER)\n    parser.add_argument('--password', help='MySQL Password', default=MYSQL_PASSWORD)\n    args = parser.parse_args()\n\n    MYSQL_HOST = args.host\n    MYSQL_PORT = args.port\n    MYSQL_USER = args.user\n    MYSQL_PASSWORD = args.password\n\n    main()\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/mysql.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": 307,\n  \"links\": [\n    {\n      \"asDropdown\": false,\n      \"icon\": \"cloud\",\n      \"includeVars\": false,\n      \"keepTime\": false,\n      \"tags\": [],\n      \"targetBlank\": true,\n      \"title\": \"ApeCloud\",\n      \"tooltip\": \"Improved productivity, cost-efficiency and business continuity.\",\n      \"type\": \"link\",\n      \"url\": \"https://kubeblocks.io/\"\n    },\n    {\n      \"asDropdown\": false,\n      \"icon\": \"external link\",\n      \"includeVars\": false,\n      \"keepTime\": false,\n      \"tags\": [],\n      \"targetBlank\": true,\n      \"title\": \"KubeBlocks\",\n      \"tooltip\": \"An open-source and cloud-neutral DBaaS with Kubernetes.\",\n      \"type\": \"link\",\n      \"url\": \"https://github.com/apecloud/kubeblocks\"\n    }\n  ],\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 382,\n      \"panels\": [],\n      \"title\": \"Summary\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**Uptime**\\n\\nThe amount of time since the last restart of the MySQL server process.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 1,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 300\n              },\n              {\n                \"color\": \"dark-green\",\n                \"value\": 3600\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 12,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"min(sum(mysql_global_status_uptime{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod))\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 300\n        }\n      ],\n      \"title\": \"Min Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**Current QPS**\\n\\nBased on the queries reported by MySQL's ``SHOW STATUS`` command, it is the number of statements executed by the server within the last second. This variable includes statements executed within stored programs, unlike the Questions variable. It does not count \\n``COM_PING`` or ``COM_STATISTICS`` commands.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 1\n      },\n      \"id\": 13,\n      \"links\": [\n        {\n          \"targetBlank\": true,\n          \"title\": \"MySQL Server Status Variables\",\n          \"url\": \"https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html#statvar_Queries\"\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"sum(rate(mysql_global_status_queries{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval]))\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total QPS\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**InnoDB Buffer Pool Size**\\n\\nInnoDB maintains a storage area called the buffer pool for caching data and indexes in memory.  Knowing how the InnoDB buffer pool works, and taking advantage of it to keep frequently accessed data in memory, is one of the most important aspects of MySQL tuning. The goal is to keep the working set in memory. In most cases, this should be between 60%-90% of available memory on a dedicated database host, but depends on many factors.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 1\n      },\n      \"id\": 51,\n      \"links\": [\n        {\n          \"targetBlank\": true,\n          \"title\": \"Tuning the InnoDB Buffer Pool Size\",\n          \"url\": \"https://www.percona.com/blog/2015/06/02/80-ram-tune-innodb_buffer_pool_size/\"\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"min(sum(mysql_global_variables_innodb_buffer_pool_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod))\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 300\n        }\n      ],\n      \"title\": \"InnoDB Buffer Pool\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"auto\",\n            \"cellOptions\": {\n              \"type\": \"auto\"\n            },\n            \"inspect\": false\n          },\n          \"decimals\": 1,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"uptime\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.cellOptions\",\n                \"value\": {\n                  \"type\": \"color-text\"\n                }\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"current qps\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.cellOptions\",\n                \"value\": {\n                  \"type\": \"color-text\"\n                }\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"innodb buffer size\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.cellOptions\",\n                \"value\": {\n                  \"type\": \"color-text\"\n                }\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"bytes\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 15,\n        \"x\": 9,\n        \"y\": 1\n      },\n      \"id\": 403,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"cellHeight\": \"sm\",\n        \"footer\": {\n          \"countRows\": false,\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"sum(mysql_global_status_uptime{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 300\n        },\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"sum(rate(mysql_global_status_queries{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"B\",\n          \"step\": 300\n        },\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"sum(mysql_global_variables_innodb_buffer_pool_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"C\",\n          \"step\": 300\n        }\n      ],\n      \"title\": \"Clusters && Instances\",\n      \"transformations\": [\n        {\n          \"id\": \"joinByField\",\n          \"options\": {\n            \"byField\": \"pod\",\n            \"mode\": \"outer\"\n          }\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time 1\": true,\n              \"Time 2\": true,\n              \"Time 3\": true,\n              \"app_kubernetes_io_instance 2\": true,\n              \"app_kubernetes_io_instance 3\": true,\n              \"namespace 2\": true,\n              \"namespace 3\": true\n            },\n            \"indexByName\": {\n              \"Time 1\": 3,\n              \"Time 2\": 5,\n              \"Time 3\": 9,\n              \"Value #A\": 4,\n              \"Value #B\": 8,\n              \"Value #C\": 12,\n              \"app_kubernetes_io_instance 1\": 1,\n              \"app_kubernetes_io_instance 2\": 6,\n              \"app_kubernetes_io_instance 3\": 10,\n              \"namespace 1\": 0,\n              \"namespace 2\": 7,\n              \"namespace 3\": 11,\n              \"pod\": 2\n            },\n            \"renameByName\": {\n              \"Value #A\": \"uptime\",\n              \"Value #B\": \"current qps\",\n              \"Value #C\": \"innodb buffer size\",\n              \"app_kubernetes_io_instance 1\": \"cluster\",\n              \"namespace 1\": \"namespace\",\n              \"pod\": \"instance\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 6\n      },\n      \"id\": 383,\n      \"panels\": [],\n      \"title\": \"Connections\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**Max Connections** \\n\\nMax Connections is the maximum permitted number of simultaneous client connections. By default, this is 151. Increasing this value increases the number of file descriptors that mysqld requires. If the required number of descriptors are not available, the server reduces the value of Max Connections.\\n\\nmysqld actually permits Max Connections + 1 clients to connect. The extra connection is reserved for use by accounts that have the SUPER privilege, such as root.\\n\\nMax Used Connections is the maximum number of connections that have been in use simultaneously since the server started.\\n\\nConnections is the number of connection attempts (successful or not) to the MySQL server.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Max Connections\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 92,\n      \"links\": [\n        {\n          \"targetBlank\": true,\n          \"title\": \"MySQL Server System Variables\",\n          \"url\": \"https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_connections\"\n        }\n      ],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"sum(max_over_time(mysql_global_status_threads_connected{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Connections | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(mysql_global_status_max_used_connections{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Max Used Connections | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 20,\n          \"target\": \"\"\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(mysql_global_variables_max_connections{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Max Connections | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 20,\n          \"target\": \"\"\n        }\n      ],\n      \"title\": \"MySQL Connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**MySQL Active Threads**\\n\\nThreads Connected is the number of open connections, while Threads Running is the number of threads not sleeping.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"Threads\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Peak Threads Running\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#E24D42\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.lineWidth\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.pointSize\",\n                \"value\": 4\n              },\n              {\n                \"id\": \"custom.showPoints\",\n                \"value\": \"always\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Peak Threads Connected\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#1F78C1\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Avg Threads Running\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#EAB839\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 7\n      },\n      \"id\": 10,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"sum(max_over_time(mysql_global_status_threads_connected{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Peak Threads Connected | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"sum(max_over_time(mysql_global_status_threads_running{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Peak Threads Running | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"B\",\n          \"step\": 20\n        },\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(avg_over_time(mysql_global_status_threads_running{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Avg Threads Running | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"range\": true,\n          \"refId\": \"C\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"MySQL Client Thread Activity\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**MySQL Thread Cache**\\n\\nThe thread_cache_size variable sets how many threads the server should cache to reuse. When a client disconnects, the client's threads are put in the cache if the cache is not full. It is autosized in MySQL 5.6.8 and above (capped to 100). Requests for threads are satisfied by reusing threads taken from the cache if possible, and only when the cache is empty is a new thread created.\\n\\n* *Threads_created*: The number of threads created to handle connections.\\n* *Threads_cached*: The number of threads in the thread cache.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Threads Created\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 7\n      },\n      \"id\": 11,\n      \"links\": [\n        {\n          \"title\": \"Tuning information\",\n          \"url\": \"https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_thread_cache_size\"\n        }\n      ],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(mysql_global_variables_thread_cache_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Thread Cache Size | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(mysql_global_status_threads_cached{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Threads Cached | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_threads_created{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Threads Created | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"MySQL Thread Cache\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**Aborted Connections**\\n\\nWhen a given host connects to MySQL and the connection is interrupted in the middle (for example due to bad credentials), MySQL keeps that info in a system table (since 5.6 this table is exposed in performance_schema).\\n\\nIf the amount of failed requests without a successful connection reaches the value of max_connect_errors, mysqld assumes that something is wrong and blocks the host from further connection.\\n\\nTo allow connections from that host again, you need to issue the ``FLUSH HOSTS`` statement.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 14\n      },\n      \"id\": 47,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_aborted_connects{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Aborted Connects (attempts) | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_aborted_clients{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Aborted Clients (timeout) | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 20,\n          \"target\": \"\"\n        }\n      ],\n      \"title\": \"MySQL Aborted Connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 21\n      },\n      \"id\": 384,\n      \"panels\": [],\n      \"title\": \"Queries\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**MySQL Questions**\\n\\nThe number of statements executed by the server. This includes only statements sent to the server by clients and not statements executed within stored programs, unlike the Queries used in the QPS calculation. \\n\\nThis variable does not count the following commands:\\n* ``COM_PING``\\n* ``COM_STATISTICS``\\n* ``COM_STMT_PREPARE``\\n* ``COM_STMT_CLOSE``\\n* ``COM_STMT_RESET``\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 22\n      },\n      \"id\": 53,\n      \"links\": [\n        {\n          \"targetBlank\": true,\n          \"title\": \"MySQL Queries and Questions\",\n          \"url\": \"https://www.percona.com/blog/2014/05/29/how-mysql-queries-and-questions-are-measured/\"\n        }\n      ],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_questions{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"MySQL Questions\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**MySQL Slow Queries**\\n\\nSlow queries are defined as queries being slower than the long_query_time setting. For example, if you have long_query_time set to 3, all queries that take longer than 3 seconds to complete will show on this graph.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 22\n      },\n      \"id\": 48,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_slow_queries{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Slow Queries | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"MySQL Slow Queries\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**MySQL Select Types**\\n\\nAs with most relational databases, selecting based on indexes is more efficient than scanning an entire table's data. Here we see the counters for selects not done with indexes.\\n\\n* ***Select Scan*** is how many queries caused full table scans, in which all the data in the table had to be read and either discarded or returned.\\n* ***Select Range*** is how many queries used a range scan, which means MySQL scanned all rows in a given range.\\n* ***Select Full Join*** is the number of joins that are not joined on an index, this is usually a huge performance hit.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 22\n      },\n      \"id\": 311,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_select_full_join{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Select Full Join | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_select_full_range_join{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Select Full Range Join | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_select_range{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Select Range | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_select_range_check{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Select Range Check | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"D\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_select_scan{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Select Scan | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"E\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"MySQL Select Types\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"**MySQL Sorts**\\n\\nDue to a query's structure, order, or other requirements, MySQL sorts the rows before returning them. For example, if a table is ordered 1 to 10 but you want the results reversed, MySQL then has to sort the rows to return 10 to 1.\\n\\nThis graph also shows when sorts had to scan a whole table or a given range of a table in order to return the results and which could not have been sorted via an index.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 29\n      },\n      \"id\": 30,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_sort_rows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Sort Rows | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_sort_range{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Sort Range | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_sort_merge_passes{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Sort Merge Passes | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_sort_scan{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Sort Scan | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"D\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"MySQL Sort Rows\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 29\n      },\n      \"id\": 22,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_created_tmp_tables{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Created Tmp Tables | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"A\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_created_tmp_disk_tables{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Created Tmp Disk Tables | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"errors\": {},\n          \"expr\": \"sum(rate(mysql_global_status_created_tmp_files{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Created Tmp Files | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"refId\": \"C\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"MySQL Temporary Objects\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 36\n      },\n      \"id\": 390,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"**Top Command Counters**\\n\\nThe Com_{{xxx}} statement counter variables indicate the number of times each xxx statement has been executed. There is one status variable for each type of statement. For example, Com_delete and Com_update count [``DELETE``](https://dev.mysql.com/doc/refman/5.7/en/delete.html) and [``UPDATE``](https://dev.mysql.com/doc/refman/5.7/en/update.html) statements, respectively. Com_delete_multi and Com_update_multi are similar but apply to [``DELETE``](https://dev.mysql.com/doc/refman/5.7/en/delete.html) and [``UPDATE``](https://dev.mysql.com/doc/refman/5.7/en/update.html) statements that use multiple-table syntax.\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 69\n          },\n          \"id\": 14,\n          \"links\": [\n            {\n              \"title\": \"Server Status Variables (Com_xxx)\",\n              \"url\": \"https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html#statvar_Com_xxx\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"right\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"topk(15, rate(mysql_global_status_commands_total{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])>0)\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Com_{{ command }} | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Top Command Counters\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"**MySQL Handlers**\\n\\nHandler statistics are internal statistics on how MySQL is selecting, updating, inserting, and modifying rows, tables, and indexes.\\n\\nThis is in fact the layer between the Storage Engine and MySQL.\\n\\n* `read_rnd_next` is incremented when the server performs a full table scan and this is a counter you don't really want to see with a high value.\\n* `read_key` is incremented when a read is done with an index.\\n* `read_next` is incremented when the storage engine is asked to 'read the next index entry'. A high value means a lot of index scans are being done.\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 76\n          },\n          \"id\": 8,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"right\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum(rate(mysql_global_status_handlers_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",handler!~\\\"commit|rollback|savepoint.*|prepare\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod,handler)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ handler }} | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"J\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"MySQL Handlers\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 83\n          },\n          \"id\": 28,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"right\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum(rate(mysql_global_status_handlers_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",handler=~\\\"commit|rollback|savepoint.*|prepare\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod,handler)\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ handler }} | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"MySQL Transaction Handlers\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Command, Handlers, Processes\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 37\n      },\n      \"id\": 405,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"**MySQL Network Traffic**\\n\\nHere we can see how much network traffic is generated by MySQL. Outbound is network traffic sent from MySQL and Inbound is network traffic MySQL has received.\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 60,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"Bps\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 24,\n            \"x\": 0,\n            \"y\": 70\n          },\n          \"id\": 9,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"right\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum(rate(mysql_global_status_bytes_received{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Inbound | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum(rate(mysql_global_status_bytes_sent{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Outbound | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Network Traffic\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Traffic\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 38\n      },\n      \"id\": 388,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 60,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"System Memory\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": false,\n                      \"mode\": \"normal\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 71\n          },\n          \"id\": 407,\n          \"links\": [\n            {\n              \"title\": \"Detailed descriptions about metrics\",\n              \"url\": \"https://www.percona.com/doc/percona-monitoring-and-management/dashboard.mysql-overview.html#mysql-internal-memory-overview\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(rate(mysql_global_status_innodb_buffer_pool_read_requests{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Buffers Pool Read\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 60,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"System Memory\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": false,\n                      \"mode\": \"normal\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 71\n          },\n          \"id\": 408,\n          \"links\": [\n            {\n              \"title\": \"Detailed descriptions about metrics\",\n              \"url\": \"https://www.percona.com/doc/percona-monitoring-and-management/dashboard.mysql-overview.html#mysql-internal-memory-overview\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(rate(mysql_global_status_innodb_buffer_pool_reads{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Disk Read\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 60,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"System Memory\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": false,\n                      \"mode\": \"normal\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 71\n          },\n          \"id\": 409,\n          \"links\": [\n            {\n              \"title\": \"Detailed descriptions about metrics\",\n              \"url\": \"https://www.percona.com/doc/percona-monitoring-and-management/dashboard.mysql-overview.html#mysql-internal-memory-overview\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(rate(mysql_global_status_innodb_buffer_pool_write_requests{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Buffers Pool Write\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 60,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"System Memory\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": false,\n                      \"mode\": \"normal\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 79\n          },\n          \"id\": 50,\n          \"links\": [\n            {\n              \"title\": \"Detailed descriptions about metrics\",\n              \"url\": \"https://www.percona.com/doc/percona-monitoring-and-management/dashboard.mysql-overview.html#mysql-internal-memory-overview\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"mysql_global_status_innodb_page_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} * on (namespace,app_kubernetes_io_instance,pod) mysql_global_status_buffer_pool_pages{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\", state=\\\"data\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Data | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"mysql_global_status_innodb_page_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} * on (namespace,app_kubernetes_io_instance,pod) mysql_global_status_buffer_pool_pages{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\", state=\\\"free\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Free | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"mysql_global_status_innodb_page_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} * on (namespace,app_kubernetes_io_instance,pod) mysql_global_status_buffer_pool_pages{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\", state=\\\"dirty\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Dirty | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"mysql_global_status_innodb_page_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} * on (namespace,app_kubernetes_io_instance,pod) mysql_global_status_buffer_pool_pages{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\", state=\\\"misc\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Misc | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"mysql_global_status_innodb_page_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} * on (namespace,app_kubernetes_io_instance,pod) mysql_global_status_buffer_pool_dirty_pages{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Dirty | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"E\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Buffer Pool Size\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 60,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"System Memory\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": false,\n                      \"mode\": \"normal\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 79\n          },\n          \"id\": 406,\n          \"links\": [\n            {\n              \"title\": \"Detailed descriptions about metrics\",\n              \"url\": \"https://www.percona.com/doc/percona-monitoring-and-management/dashboard.mysql-overview.html#mysql-internal-memory-overview\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(mysql_global_variables_innodb_log_buffer_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"InnoDB Log Buffer Size | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"sum(mysql_global_variables_innodb_additional_mem_pool_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 2,\n              \"legendFormat\": \"InnoDB Additional Memory Pool Size | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"refId\": \"H\",\n              \"step\": 40\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(mysql_global_status_innodb_mem_dictionary{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"InnoDB Dictionary Size | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"F\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"sum(mysql_global_variables_key_buffer_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Key Buffer Size | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"refId\": \"B\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"sum(mysql_global_variables_query_cache_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Query Cache Size | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"refId\": \"C\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"sum(mysql_global_status_innodb_mem_adaptive_hash{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Adaptive Hash Index Size | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"refId\": \"E\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"sum(mysql_global_variables_tokudb_cache_size{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"TokuDB Cache Size | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"refId\": \"I\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Other Buffers Size\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Buffers\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 39\n      },\n      \"id\": 413,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"**Table Locks**\\n\\nMySQL takes a number of different locks for varying reasons. In this graph we see how many Table level locks MySQL has requested from the storage engine. In the case of InnoDB, many times the locks could actually be row locks as it only takes table level locks in a few specific cases.\\n\\nIt is most useful to compare Locks Immediate and Locks Waited. If Locks waited is rising, it means you have lock contention. Otherwise, Locks Immediate rising and falling is normal activity.\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 72\n          },\n          \"id\": 32,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"errors\": {},\n              \"expr\": \"sum(rate(mysql_global_status_table_locks_immediate{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Table Locks Immediate | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"errors\": {},\n              \"expr\": \"sum(rate(mysql_global_status_table_locks_waited{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Table Locks Waited | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"MySQL Table Locks\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 60,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"System Memory\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": false,\n                      \"mode\": \"normal\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 72\n          },\n          \"id\": 410,\n          \"links\": [\n            {\n              \"title\": \"Detailed descriptions about metrics\",\n              \"url\": \"https://www.percona.com/doc/percona-monitoring-and-management/dashboard.mysql-overview.html#mysql-internal-memory-overview\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(rate(mysql_global_status_innodb_row_lock_waits{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Innodb Row Lock Waits\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 60,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"ms\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"System Memory\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": false,\n                      \"mode\": \"normal\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 72\n          },\n          \"id\": 411,\n          \"links\": [\n            {\n              \"title\": \"Detailed descriptions about metrics\",\n              \"url\": \"https://www.percona.com/doc/percona-monitoring-and-management/dashboard.mysql-overview.html#mysql-internal-memory-overview\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(rate(mysql_global_status_innodb_row_lock_time{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod) / sum(rate(mysql_global_status_innodb_row_lock_waits{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Innodb Row Lock Avg Time\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Locks\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 40\n      },\n      \"id\": 392,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 73\n          },\n          \"id\": 41,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum(mysql_global_status_open_files{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Open Files | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"errors\": {},\n              \"expr\": \"sum(mysql_global_variables_open_files_limit{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Open Files Limit | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"refId\": \"D\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"sum(mysql_global_status_innodb_num_open_files{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"InnoDB Open Files | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"MySQL Open Files\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"**MySQL Open Tables**\\n\\nThe recommendation is to set the `table_open_cache_instances` to a loose correlation to virtual CPUs, keeping in mind that more instances means the cache is split more times. If you have a cache set to 500 but it has 10 instances, each cache will only have 50 cached.\\n\\nThe `table_definition_cache` and `table_open_cache` can be left as default as they are auto-sized MySQL 5.6 and above (ie: do not set them to any value).\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 73\n          },\n          \"id\": 42,\n          \"links\": [\n            {\n              \"title\": \"Server Status Variables (table_open_cache)\",\n              \"url\": \"http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_table_open_cache\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum(mysql_global_status_open_tables{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Open Tables | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"errors\": {},\n              \"expr\": \"sum(mysql_global_variables_table_open_cache{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Table Open Cache | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"refId\": \"C\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"MySQL Open Tables\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"**MySQL Table Definition Cache**\\n\\nThe recommendation is to set the `table_open_cache_instances` to a loose correlation to virtual CPUs, keeping in mind that more instances means the cache is split more times. If you have a cache set to 500 but it has 10 instances, each cache will only have 50 cached.\\n\\nThe `table_definition_cache` and `table_open_cache` can be left as default as they are auto-sized MySQL 5.6 and above (ie: do not set them to any value).\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 73\n          },\n          \"id\": 54,\n          \"links\": [\n            {\n              \"title\": \"Server Status Variables (table_open_cache)\",\n              \"url\": \"http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_table_open_cache\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"errors\": {},\n              \"expr\": \"sum(mysql_global_status_open_table_definitions{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Open Table Definitions | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"refId\": \"B\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"errors\": {},\n              \"expr\": \"sum(mysql_global_variables_table_definition_cache{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Table Definitions Cache Size | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"refId\": \"C\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"expr\": \"sum(rate(mysql_global_status_opened_table_definitions{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Opened Table Definitions | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"MySQL Table Definition Cache\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"**MySQL Table Open Cache**\\n\\nThe recommendation is to set the `table_open_cache_instances` to a loose correlation to virtual CPUs, keeping in mind that more instances means the cache is split more times. If you have a cache set to 500 but it has 10 instances, each cache will only have 50 cached.\\n\\nThe `table_definition_cache` and `table_open_cache` can be left as default as they are auto-sized MySQL 5.6 and above (ie: do not set them to any value).\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 7,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 80\n          },\n          \"id\": 44,\n          \"links\": [\n            {\n              \"title\": \"Server Status Variables (table_open_cache)\",\n              \"url\": \"http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_table_open_cache\"\n            }\n          ],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(rate(mysql_global_status_table_open_cache_hits{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Hits | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(rate(mysql_global_status_table_open_cache_misses{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Misses | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 20\n            },\n            {\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(rate(mysql_global_status_table_open_cache_overflows{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Misses due to Overflows | {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"MySQL Table Open Cache\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Files and Tables\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 41\n      },\n      \"id\": 415,\n      \"panels\": [],\n      \"title\": \"Replication\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 42\n      },\n      \"id\": 417,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"prometheus\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"max(mysql_replication_heartbeat_relay_delay_seconds{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\", replication_role=~\\\"slave\\\"}) BY (namespace,app_kubernetes_io_instance)\",\n          \"legendFormat\": \"{{namespace}}/{{app_kubernetes_io_instance}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"ReplicationLag(relay delay seconds)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 42\n      },\n      \"id\": 419,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"prometheus\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"max(mysql_slave_status_seconds_behind_master{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}) BY (namespace,app_kubernetes_io_instance,master_host)\",\n          \"legendFormat\": \"{{namespace}}/{{app_kubernetes_io_instance}} | {{master_host}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Seconds Behind Master\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 42\n      },\n      \"id\": 421,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"prometheus\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"mysql_slave_status_slave_io_running{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"legendFormat\": \"{{namespace}}/{{app_kubernetes_io_instance}}/{{pod}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Slave IO thread\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"prometheus\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 42\n      },\n      \"id\": 422,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"prometheus\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"mysql_slave_status_slave_sql_running{namespace=~\\\"$namespace\\\", app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n          \"legendFormat\": \"{{namespace}}/{{app_kubernetes_io_instance}}/{{pod}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Slave SQL thread\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"preload\": false,\n  \"refresh\": \"\",\n  \"schemaVersion\": 40,\n  \"tags\": [\n    \"mysql\",\n    \"db\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"includeAll\": false,\n        \"label\": \"data source\",\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"type\": \"datasource\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(mysql_up{job=\\\"$job\\\"}, namespace)\",\n        \"includeAll\": true,\n        \"label\": \"namespace\",\n        \"multi\": true,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(mysql_up{job=\\\"$job\\\"}, namespace)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"sort\": 5,\n        \"type\": \"query\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(mysql_up{job=\\\"$job\\\"}, app_kubernetes_io_instance)\",\n        \"includeAll\": true,\n        \"label\": \"cluster\",\n        \"multi\": true,\n        \"name\": \"cluster\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(mysql_up{job=\\\"$job\\\"}, app_kubernetes_io_instance)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"sort\": 5,\n        \"type\": \"query\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(mysql_up{job=\\\"$job\\\",namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\"}, pod)\",\n        \"includeAll\": true,\n        \"label\": \"instance\",\n        \"multi\": true,\n        \"name\": \"instance\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(mysql_up{job=\\\"$job\\\",namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\"}, pod)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"sort\": 5,\n        \"type\": \"query\"\n      },\n      {\n        \"current\": {\n          \"text\": \"kubeblocks\",\n          \"value\": \"kubeblocks\"\n        },\n        \"includeAll\": false,\n        \"label\": \"job\",\n        \"name\": \"job\",\n        \"options\": [\n          {\n            \"selected\": true,\n            \"text\": \"kubeblocks\",\n            \"value\": \"kubeblocks\"\n          }\n        ],\n        \"query\": \"kubeblocks\",\n        \"type\": \"custom\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-30m\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ]\n  },\n  \"timezone\": \"\",\n  \"title\": \"APPS / Oracle MySQL\",\n  \"uid\": \"mysql\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/mysql/readme.md",
    "content": "# 说明\n\n本目录资源涵盖使用kubeblocks创建mysql集群的各种操作，包括：集群变更、备份、恢复、监控等等；\n\n## 双机主备集群创建流程\n\n- 1.修改mysql componentdefinitions，支持修改属性\n\nkubectl annotate componentdefinitions.apps.kubeblocks.io mysql-8.0-1.0.0 apps.kubeblocks.io/skip-immutable-check=true\n\n- 2.修改mysql componentdefinitions，支持mysql容器使用hostNetwork（或者通过nodePort方式把主/备mysql服务都暴露出来）\n\nkubectl edit componentdefinitions.apps.kubeblocks.io mysql-8.0-1.0.0\n\n配置runtime.hostNetwork: true 和 runtime.dnsPolicy: ClusterFirstWithHostNet\n\n- 3.正常创建mysql集群，并验证主备状态和机器上host端口3306\n\nkubectl apply -n db -f 001.semisync-cluster.yaml\n\n- 4.登录数据库主节点，写入测试数据\n\n```\n CREATE DATABASE test;\n USE test;\n CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(255));\n INSERT INTO t1 VALUES (1, 'John Doe');\n```\n\n- 5.主节点关机；这样整个k8s集群无法访问，但是备节点上的mysql容器仍旧运行，登录备节点数据库，手动切主，提供读写服务\n\n```\nmysql> STOP REPLICA;\nmysql> SET GLOBAL super_read_only = OFF;\nmysql> SET GLOBAL read_only = OFF;\n\n# 写入新数据\n USE test;\n INSERT INTO t1 VALUES (2, 'after master down');\n\n# 主节点已故障排查，准备迎接主节点重启\nmysql> SET GLOBAL super_read_only = ON;\nmysql> SET GLOBAL read_only = ON;\n```\n\n- 6.主节点重启成功，验证mysql集群恢复，原备节点变主\n\n登录主节点mysql，验证：\n\n```\nmysql> show status like 'Rpl%_status';\n+------------------------------+-------+\n| Variable_name                | Value |\n+------------------------------+-------+\n| Rpl_semi_sync_replica_status | OFF   |\n| Rpl_semi_sync_source_status  | ON    |\n+------------------------------+-------+\n2 rows in set (0.00 sec)\n```\n\n登录备节点mysql，验证：\n\n```\nmysql> show status like 'Rpl%_status';\n+------------------------------+-------+\n| Variable_name                | Value |\n+------------------------------+-------+\n| Rpl_semi_sync_replica_status | ON    |\n| Rpl_semi_sync_source_status  | OFF   |\n+------------------------------+-------+\n2 rows in set (0.00 sec)\n```\n\n### 参考\n\n- https://kubeblocks.io/docs/release-1_0/kubeblocks-for-mysql/04-operations/11-rebuild-replica\n- https://kubeblocks.io/docs/release-1_0/kubeblocks-for-mysql/03-topologies/01-semisync\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/001.cluster.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: pg-cluster\nspec:\n  terminationPolicy: Delete\n  clusterDef: postgresql\n  topology: replication\n  componentSpecs:\n    - name: postgresql\n      serviceVersion: \"16.4.0\"\n      disableExporter: false\n      # Specifies Labels to override or add for underlying Pods, PVCs, Account... \n      labels:\n        # PostgreSQL's CMPD specifies `KUBERNETES_SCOPE_LABEL=apps.kubeblocks.postgres.patroni/scope` through ENVs\n        # The KUBERNETES_SCOPE_LABEL is used to define the label key that Patroni will use to tag Kubernetes resources.\n        # This helps Patroni identify which resources belong to the specified scope (or cluster) used to define the label key\n        # that Patroni will use to tag Kubernetes resources.\n        # This helps Patroni identify which resources belong to the specified scope (or cluster).\n        #\n        # Note: DO NOT REMOVE THIS LABEL\n        # update the value w.r.t your cluster name\n        # the value must follow the format <cluster.metadata.name>-postgresql\n        # which is pg-cluster-postgresql in this examples\n        # replace `pg-cluster` with your cluster name\n        apps.kubeblocks.postgres.patroni/scope: pg-cluster-postgresql\n      replicas: 2\n      resources:\n        limits:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n        requests:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n      # Specifies a list of PersistentVolumeClaim templates that define the storage\n      # requirements for the Component.\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/002.cluster-custom-instance.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: pg-cluster\nspec:\n  terminationPolicy: DoNotTerminate\n  clusterDef: postgresql\n  topology: replication\n  componentSpecs:\n    - name: postgresql\n      disableExporter: false\n      serviceVersion: \"16.4.0\"\n      labels:\n        apps.kubeblocks.postgres.patroni/scope: pg-cluster-postgresql\n      replicas: 2\n      env:\n        - name: LANG\n          value: \"C.UTF-8\"\n        - name: TZ\n          value: Asia/Shanghai\n      instances:\n        - name: tpl1         # first template\n          replicas: 1\n          ordinals:\n            ranges:\n              - start: 101\n                end: 200\n          resources:\n            limits:\n              cpu: '1'\n              memory: 2Gi\n          volumeClaimTemplates: # tpl1's vct\n            - name: data\n              spec:\n                storageClassName: \"lvm-data1\"\n                accessModes:\n                  - ReadWriteOnce\n                resources:\n                  requests:\n                    storage: 10Gi\n        - name: tpl2  # second template\n          replicas: 1\n          ordinals:\n            ranges:\n              - start: 201\n                end: 300\n          resources:\n            limits:\n              cpu: '1'\n              memory: 4Gi\n          volumeClaimTemplates: # tpl2's vct\n            - name: data\n              spec:\n                storageClassName: \"lvm-data2\"\n                accessModes:\n                  - ReadWriteOnce\n                resources:\n                  requests:\n                    storage: 5Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/101.stop.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-cluster-stop-ops\nspec:\n  clusterName: pg-cluster\n  type: Stop\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/102.start.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-cluster-start-ops\nspec:\n  clusterName: pg-cluster\n  type: Start\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/103.restart.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-cluster-restart-ops\nspec:\n  clusterName: pg-cluster\n  type: Restart\n  restart:\n  - componentName: postgresql\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/104.vscale.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-cluster-vscale-ops\nspec:\n  clusterName: pg-cluster\n  type: VerticalScaling\n  verticalScaling:\n  - componentName: postgresql\n    requests:\n      cpu: '1'\n      memory: 1Gi\n    limits:\n      cpu: '1'\n      memory: 1Gi\n\n# Alternatively, you may update spec.componentSpecs.resources field to the desired resources for vertical scale. \n## Note:\n#Planning:\n      #Scale during maintenance windows or low-traffic periods\n      #Verify Kubernetes cluster has sufficient resources\n      #Check for any ongoing operations before starting\n#Execution:\n      #Maintain balanced CPU-to-Memory ratios\n      #Set identical requests/limits for guaranteed QoS\n#Post-Scaling:\n      #Monitor resource utilization and application performance\n      #Consider adjusting PostgreSQL parameters if needed\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/105.hscale.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-cluster-scale-out-ops\nspec:\n  clusterName: pg-cluster\n  type: HorizontalScaling\n  horizontalScaling:\n  - componentName: postgresql\n    # Specifies the replica changes for scaling in components\n    scaleOut:\n      # Specifies the replica changes for the component.\n      # add one more replica to current component\n      replicaChanges: 1\n\n# Alternatively, you can perform a direct update to the replicas field in the Cluster resource\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/106.api-expose.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: pg-cluster\nspec:\n  terminationPolicy: Delete\n  clusterDef: postgresql\n  topology: replication\n  services:\n    - componentSelector: postgresql\n      name: postgresql-external\n      serviceName: postgresql-external\n      roleSelector: primary\n      spec:\n        ports:\n          - name: tcp-postgresql\n            port: 5432\n            protocol: TCP\n            targetPort: tcp-postgresql\n        type: NodePort \n    - componentSelector: postgresql\n      name: postgresql-bk-external\n      serviceName: postgresql-bk-external \n      roleSelector: secondary\n      spec:\n        ports:\n          - name: tcp-postgresql\n            port: 5432\n            protocol: TCP\n            targetPort: tcp-postgresql\n        type: NodePort\n  componentSpecs:\n    - name: postgresql\n      serviceVersion: \"16.4.0\"\n      disableExporter: false\n      labels:\n        apps.kubeblocks.postgres.patroni/scope: pg-cluster-postgresql\n      replicas: 2\n      resources:\n        limits:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n        requests:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/106.expose.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-cluster-expose-enable-ops\nspec:\n  type: Expose\n  clusterName: pg-cluster\n  expose:\n  - componentName: postgresql\n    services:\n    - name: internet\n      # Determines how the Service is exposed. Defaults to 'ClusterIP'.\n      # Valid options are 'ClusterIP', 'NodePort', and 'LoadBalancer'.\n      serviceType: NodePort \n      # Contains cloud provider related parameters if ServiceType is LoadBalancer.\n      # Following is an example for AWS EKS\n      annotations:\n        service.beta.kubernetes.io/aws-load-balancer-type: nlb\n        service.beta.kubernetes.io/aws-load-balancer-internal: \"false\"  # or \"true\" for an internal VPC IP\n      # Specifies a role to target with the service.\n      # If specified, the service will only be exposed to pods with the matching role.\n      roleSelector: primary\n    switch: Enable\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/107.reconf-dynamic.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-reconfigure-dynamic\nspec:\n  clusterName: pg-cluster\n  reconfigures:\n  - componentName: postgresql\n    parameters:\n      - key: max_connections\n        value: '100'\n      - key: pgaudit.log\n        value: ddl\n  type: Reconfiguring\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/108.reconf-static.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: postgresql-reconfigure-static\nspec:\n  clusterName: pg-cluster\n  force: false\n  reconfigures:\n  - componentName: postgresql\n    parameters:\n    - key: shared_buffers\n      value: '128MB'\n  preConditionDeadlineSeconds: 0\n  type: Reconfiguring\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/109.switchover.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-switchover-targeted\nspec:\n  clusterName: pg-cluster\n  type: Switchover\n  switchover:\n  - componentName: postgresql\n    # Specifies the instance whose role will be transferred.\n    # A typical usage is to transfer the leader role in a consensus system.\n    instanceName: pg-cluster-postgresql-0\n    # If CandidateName is specified, the role will be transferred to this instance.\n    # The name must match one of the pods in the component.\n    # Refer to ComponentDefinition's Swtichover lifecycle action for more details.\n    #candidateName: pg-cluster-postgresql-1\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/110.repair.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-rebuild-replica-inplace\nspec:\n  clusterName: pg-cluster\n  type: RebuildInstance\n  force: true\n  preConditionDeadlineSeconds: 0\n  rebuildFrom:\n  - componentName: postgresql\n    inPlace: true  # set inPlace to true\n    instances:\n    # the instance name (Pod name) that will be repaired, non primary pod\n    - name: pg-cluster-postgresql-1\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/111.custom-pwd.yaml",
    "content": "---\napiVersion: v1\ndata:\n  password: Y3VzdG9tcGFzc3dvcmQ= # custompassword\n  username: cm9vdA== #root\nimmutable: true\nkind: Secret\nmetadata:\n  name: custom-pg-secret\n\n---\napiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: pg-cluster\nspec:\n  terminationPolicy: Delete\n  clusterDef: postgresql\n  topology: replication\n  componentSpecs:\n    - name: postgresql\n      serviceVersion: \"16.4.0\"\n      disableExporter: false\n      # Specifies Labels to override or add for underlying Pods, PVCs, Account... \n      labels:\n        apps.kubeblocks.postgres.patroni/scope: pg-cluster-postgresql\n      replicas: 2\n      systemAccounts:\n        - name: postgres\n          secretRef:\n            name: custom-pg-secret\n            # specify the namespace of the secret\n            namespace: db\n      resources:\n        limits:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n        requests:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/121.backup-repo.yaml",
    "content": "# Create a secret to save the access key for MinIO\n#kubectl create secret generic minio-credential-for-backuprepo \\\n#  -n kb-system \\\n#  --from-literal=accessKeyId=<ACCESS KEY> \\\n#  --from-literal=secretAccessKey=<SECRET KEY>\n\n# Create the BackupRepo resource\napiVersion: dataprotection.kubeblocks.io/v1alpha1\nkind: BackupRepo\nmetadata:\n  name: my-repo\n  annotations:\n    dataprotection.kubeblocks.io/is-default-repo: \"true\"\nspec:\n  storageProviderRef: minio\n  accessMethod: Tool\n  pvReclaimPolicy: Retain\n  volumeCapacity: 50Gi\n  config:\n    bucket: db-backup\n    mountOptions: \"\"\n    endpoint: http://minio.minio.svc\n  credential:\n    name: minio-credential-for-backuprepo\n    namespace: kb-system\n  pathPrefix: \"\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/122.full-backup-2.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: pg-cluster-backup\nspec:\n  clusterName: pg-cluster\n  force: false\n  backup:\n    backupPolicyName: pg-cluster-postgresql-backup-policy\n    backupMethod: pg-basebackup\n    deletionPolicy: Delete\n    retentionPeriod: 1mo\n  type: Backup\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/122.full-backup.yaml",
    "content": "apiVersion: dataprotection.kubeblocks.io/v1alpha1\nkind: Backup\nmetadata:\n  name: pg-cluster-pg-basebackup\nspec:\n  backupMethod: pg-basebackup\n  backupPolicyName: pg-cluster-postgresql-backup-policy\n  # Determines whether the backup contents stored in the backup repository should be deleted\n  # when the backup custom resource(CR) is deleted. Supported values are `Retain` and `Delete`.\n  # - `Retain` means that the backup content and its physical snapshot on backup repository are kept.\n  # - `Delete` means that the backup content and its physical snapshot on backup repository are deleted.\n  deletionPolicy: Delete\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/123.scheduled-backup.yaml",
    "content": "#https://kubeblocks.io/docs/release-1_0/kubeblocks-for-postgresql/05-backup-restore/03-scheduled-full-backup\n#\n# kubectl edit backupschedule pg-cluster-postgresql-backup-schedule -n demo\n#\n# Update these key parameters:\n\n##schedules:\n##- backupMethod: pg-basebackup\n##  enabled: true\n##  cronExpression: \"0 18 * * *\"\n##  retentionPeriod: 7d\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/124.scheduled-continuous-backup.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: pg-cluster\nspec:\n  terminationPolicy: Delete\n  clusterDef: postgresql\n  topology: replication\n  componentSpecs:\n    - name: postgresql\n      serviceVersion: \"16.4.0\"\n      disableExporter: false\n      # Specifies Labels to override or add for underlying Pods, PVCs, Account... \n      labels:\n        # PostgreSQL's CMPD specifies `KUBERNETES_SCOPE_LABEL=apps.kubeblocks.postgres.patroni/scope` through ENVs\n        # The KUBERNETES_SCOPE_LABEL is used to define the label key that Patroni will use to tag Kubernetes resources.\n        # This helps Patroni identify which resources belong to the specified scope (or cluster) used to define the label key\n        # that Patroni will use to tag Kubernetes resources.\n        # This helps Patroni identify which resources belong to the specified scope (or cluster).\n        #\n        # Note: DO NOT REMOVE THIS LABEL\n        # update the value w.r.t your cluster name\n        # the value must follow the format <cluster.metadata.name>-postgresql\n        # which is pg-cluster-postgresql in this examples\n        # replace `pg-cluster` with your cluster name\n        apps.kubeblocks.postgres.patroni/scope: pg-cluster-postgresql\n      replicas: 2\n      resources:\n        limits:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n        requests:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n      # Specifies a list of PersistentVolumeClaim templates that define the storage\n      # requirements for the Component.\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n\n  backup:\n    retentionPeriod: 7d\n    method: pg-basebackup # full backup methnod name\n    enabled: true\n    cronExpression: 3 10 * * * # full backup scheuler\n    continuousMethod: archive-wal # continuous backup method\n    pitrEnabled: true # enable continous method or not\n    repoName: my-repo # specify backuprepo, if not specified, the BackupRepo annotated as `default` will be used.\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/125.restore.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: pg-restored\n  annotations:\n    # NOTE: replcae <FULL_BACKUP_NAME> with the backup name\n    kubeblocks.io/restore-from-backup: '{\"postgresql\":{\"name\":\"backup-default-pg-cluster-20250711030402\",\"namespace\":\"default\",\"volumeRestorePolicy\":\"Parallel\"}}'\nspec:\n  terminationPolicy: Delete\n  clusterDef: postgresql\n  topology: replication\n  componentSpecs:\n    - name: postgresql\n      serviceVersion: 16.4.0\n      disableExporter: false\n      labels:\n        apps.kubeblocks.postgres.patroni/scope: pg-restored-postgresql\n      replicas: 2\n      resources:\n        limits:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n        requests:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/126.restore-pitr.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: pg-restore-pitr\n  annotations:\n    # NOTE: replace <CONTINUOUS_BACKUP_NAME> with the continuouse backup name\n    # NOTE: replace <RESTORE_POINT_TIME>  with a valid time within the backup timeRange.\n    kubeblocks.io/restore-from-backup: '{\"postgresql\":{\"name\":\"52680802-pg-cluster-postgresql-archive-wal\",\"namespace\":\"db\",\"restoreTime\":\"2025-07-10T11:20:39Z\",\"volumeRestorePolicy\":\"Parallel\"}}'\nspec:\n  terminationPolicy: Delete\n  clusterDef: postgresql\n  topology: replication\n  componentSpecs:\n    - name: postgresql\n      serviceVersion: \"16.4.0\"\n      disableExporter: true\n      labels:\n        # NOTE: update the label accordingly\n        apps.kubeblocks.postgres.patroni/scope: pg-restore-pitr-postgresql\n      replicas: 1\n      resources:\n        limits:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n        requests:\n          cpu: \"0.5\"\n          memory: \"0.5Gi\"\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/131.pod-monitor.yaml",
    "content": "---\napiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n  name: pg-cluster-pod-monitor\n  namespace: monitor    # Note: this is namespace for prometheus operator\n  labels:               # Must match the setting in 'prometheus.spec.podMonitorSelector'\n    release: prometheus\nspec:\n  jobLabel: app.kubernetes.io/managed-by\n  # defines the labels which are transferred from the\n  # associated Kubernetes 'Pod' object onto the ingested metrics\n  # set the lables w.r.t you own needs\n  podTargetLabels:\n  - app.kubernetes.io/instance\n  - app.kubernetes.io/managed-by\n  - apps.kubeblocks.io/component-name\n  - apps.kubeblocks.io/pod-name\n  podMetricsEndpoints:\n    - path: /metrics\n      port: http-metrics   # Must match exporter port name\n      scheme: http\n  namespaceSelector:\n    matchNames:\n      - db               # Target namespace\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: pg-cluster\n      apps.kubeblocks.io/component-name: postgresql\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/132.alert-rules.yaml",
    "content": "apiVersion: monitoring.coreos.com/v1\nkind: PrometheusRule\nmetadata:\n  name: postgresql-alert-rules\n  labels:\n    release: prometheus\nspec:\n  groups:\n    - name: PostgreSQLExporter\n      rules:\n        - alert: PostgreSQLDown\n          expr: \"max_over_time(pg_up[1m]) == 0\"\n          for: 0m\n          labels:\n            severity: critical\n          annotations:\n            summary: \"PostgreSQL is down\"\n            description: \"PostgreSQL is down. (instance: {{ $labels.pod }})\"\n\n        - alert: PostgreSQLRestarted\n          expr: \"time() - pg_postmaster_start_time_seconds < 60\"\n          for: 0m\n          labels:\n            severity: info\n          annotations:\n            summary: \"PostgreSQL has just been restarted (< 60s)\"\n            description: 'PostgreSQL has just been restarted {{ $value | printf \"%.1f\" }} seconds ago. (instance: {{ $labels.pod }})'\n\n        - alert: PostgreSQLExporterError\n          expr: \"pg_exporter_last_scrape_error > 0\"\n          for: 0m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL exporter scrape error\"\n            description: 'PostgreSQL exporter has {{ $value | printf \"%.2f\" }} scrape errors. A query may be buggy in query.yaml. (instance: {{ $labels.pod }})'\n\n        - alert: PostgreSQLTooManySlowQueries\n          expr: |\n            max by(namespace,app_kubernetes_io_instance,pod,datname) (\n              max_over_time(pg_stat_activity_max_tx_duration{datname!~\"template.*\"}[2m])\n            ) > 60\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL database has high number of slow queries\"\n            description: 'PostgreSQL database has slow queries and the value is {{ $value | printf \"%.2f\" }}. (instance: {{ $labels.pod }}, database: {{ $labels.datname }})'\n\n        - alert: PostgreSQLTooManyConnections\n          expr: |\n            sum by (namespace,app_kubernetes_io_instance,pod) (pg_stat_activity_count{datname!~\"template.*\"})\n            > on(namespace,app_kubernetes_io_instance,pod)\n            (pg_settings_max_connections - pg_settings_superuser_reserved_connections) * 0.8\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL too many connections (> 80%)\"\n            description: 'PostgreSQL has too many connections and the value is {{ $value | printf \"%.2f\" }} percent. (instance: {{ $labels.pod }})'\n\n        - alert: PostgreSQLDeadLocks\n          expr: 'increase(pg_stat_database_deadlocks_total{datname!~\"template.*\", datname!=\"\"}[2m]) > 5'\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL database has dead locks (> 5)\"\n            description: 'PostgreSQL database has {{ $value | printf \"%.2f\"}} dead locks. (instance: {{ $labels.pod }}, database: {{ $labels.datname }})'\n\n        - alert: PostgreSQLHighRollbackRate\n          expr: |\n            rate(pg_stat_database_xact_rollback_total{datname!~\"template.*\", datname!=\"\"}[2m])\n            /\n            rate(pg_stat_database_xact_commit_total{datname!~\"template.*\", datname!=\"\"}[2m])\n            > 0.1\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL database has high rollback rate (> 10%)\"\n            description: 'Ratio of transactions being aborted compared to committed is {{ $value | printf \"%.2f\"}} percent. (instance: {{ $labels.pod }}, database: {{ $labels.datname }})'\n\n        - alert: PostgreSQLTooManyLocksAcquired\n          expr: |\n            sum by (namespace,app_kubernetes_io_instance,pod) (pg_locks_count)\n            / on(namespace,app_kubernetes_io_instance,pod)\n            (pg_settings_max_locks_per_transaction * pg_settings_max_connections)\n            > 0.2\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL has too many locks acquired (> 20%)\"\n            description: 'Too many locks acquired on the database and the value is {{ $value | printf \"%.2f\" }} percent. (instance: {{ $labels.pod }})'\n\n        - alert: PostgreSQLCacheHitRatio\n          expr: |\n            avg by (namespace,app_kubernetes_io_instance,pod,datname) (\n              rate(pg_stat_database_blks_hit_total{datname!~\"template.*\", datname!=\"\"}[2m])\n              /\n              (\n                rate(\n                  pg_stat_database_blks_hit_total{datname!~\"template.*\", datname!=\"\"}[2m]\n                )\n                +\n                rate(\n                  pg_stat_database_blks_read_total{datname!~\"template.*\", datname!=\"\"}[2m]\n                )\n              )\n            ) < 0.9\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL database has low cache hit rate (< 90%)\"\n            description: 'Low cache hit rate and the value is {{ $value | printf \"%.2f\" }} percent. (instance: {{ $labels.pod }}, database: {{ $labels.datname }})'\n\n        - alert: PostgreSQLMaxWriteBufferReached\n          expr: \"rate(pg_stat_bgwriter_maxwritten_clean_total[2m]) > 0\"\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL write buffers reached max\"\n            description: 'PostgreSQL background writer stops for max and the value is {{ $value | printf \"%.2f\" }}. (instance: {{ $labels.pod }})'\n\n        - alert: PostgreSQLHighWALFilesArchiveErrorRate\n          expr: |\n            rate(pg_stat_archiver_failed_count_total[2m])\n            / (\n              rate(pg_stat_archiver_archived_count_total[2m]) + rate(pg_stat_archiver_failed_count_total[2m])\n            ) > 0.1\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL has high error rate in WAL files archiver(> 10%)\"\n            description: 'PostgreSQL high error rate in WAL files archiver and the value is {{ $value | printf \"%.2f\" }} percent. (instance: {{ $labels.pod }})'\n\n        - alert: PostgreSQLTableNotAutoVacuumed\n          expr: |\n            (pg_stat_user_tables_last_autovacuum > 0)\n            and\n            (time() - pg_stat_user_tables_last_autovacuum)\n            > 24 * 60 * 60 * 10\n          for: 0m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL table in database has not been auto vacuumed for 10 days\"\n            description: \"Table {{ $labels.relname }} in database has not been auto vacuumed for 10 days. (instance: {{ $labels.pod }}, database: {{ $labels.datname }})\"\n\n        - alert: PostgreSQLTableNotAutoAnalyzed\n          expr: |\n            (pg_stat_user_tables_last_autoanalyze > 0)\n            and\n            (time() - pg_stat_user_tables_last_autoanalyze)\n            > 24 * 60 * 60 * 10\n          for: 0m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL table in database has not been auto analyzed for 10 days\"\n            description: \"Table {{ $labels.relname }} in database has not been auto analyzed for 10 days. (instance: {{ $labels.pod }}, database: {{ $labels.datname }})\"\n\n        - alert: PostgreSQLTableTooManyDeadTuples\n          expr: |\n            (pg_stat_user_tables_n_dead_tup > 10000)\n            /\n            (pg_stat_user_tables_n_live_tup + pg_stat_user_tables_n_dead_tup)\n            >= 0.1\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"PostgreSQL table in database has too many dead tuples (> 10%)\"\n            description: 'Table {{ $labels.relname }} in database dead tuples is too large and the value is {{ $value | printf \"%.2f\" }} percent. (instance: {{ $labels.pod }}, database: {{ $labels.datname }})'\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/benchmark.py",
    "content": "import subprocess\nimport argparse\nimport psycopg2\nfrom psycopg2 import sql\n\n###############################################################################\n###############################################################################\n# README.md\n# This is a simple test for PostgreSQL using sysbench\n# Prerequisites\n# - Sysbench installed\n#   - `sudo apt-get install sysbench` on Ubuntu\n#   - `brew install sysbench` on MacOS\n# - Python 3.6+\n# - PostgreSQL client libraries\n#   - `pip install psycopg2-binary`\n#\n# Run\n# - python3 benchmark.py --host <host> --user <user> --password <password>\n###############################################################################\n###############################################################################\n\n# Configuration variables\nPG_HOST = \"127.0.0.1\"\nPG_PORT = \"5432\"\nPG_USER = \"<USERNAME>\" #\nPG_PASSWORD = \"<PASSWD>\"\n\nSYSBENCH_DB_NAME = \"sysbench_test\"\nSYSBENCH_USER = \"sysbench_user\"\nSYSBENCH_PASSWORD = \"SysbenchPass123!\"\n\nTABLE_SIZE = 100000\nTHREADS = [4, 8, 16]  # Different thread counts to test\nDURATION = 60  # Test duration in seconds\n\ndef create_pg_user_and_db(host, port, root_user, root_password):\n    try:\n        connection = psycopg2.connect(\n            host=host,\n            port=port,\n            user=root_user,\n            password=root_password,\n            dbname=\"postgres\"\n        )\n        connection.autocommit = True\n        cursor = connection.cursor()\n\n        # Create database\n        # Create database\n        cursor.execute(\n            sql.SQL(\"SELECT 1 FROM pg_database WHERE datname = {}\")\n            .format(sql.Literal(SYSBENCH_DB_NAME)))\n        if not cursor.fetchone():\n            cursor.execute(\n                sql.SQL(\"CREATE DATABASE {}\")\n                .format(sql.Identifier(SYSBENCH_DB_NAME)))\n            print(f\"Created database {SYSBENCH_DB_NAME}\")\n\n        # Create user\n        cursor.execute(\n            sql.SQL(\"SELECT 1 FROM pg_roles WHERE rolname = {}\")\n            .format(sql.Literal(SYSBENCH_USER)))\n        if not cursor.fetchone():\n            cursor.execute(\n                sql.SQL(\"CREATE USER {} WITH PASSWORD {}\")\n                .format(\n                    sql.Identifier(SYSBENCH_USER),\n                    sql.Literal(SYSBENCH_PASSWORD)\n                ))\n            print(f\"Created user {SYSBENCH_USER}\")\n\n        # Grant privileges\n        cursor.execute(\n            sql.SQL(\"GRANT ALL PRIVILEGES ON DATABASE {} TO {}\")\n            .format(\n                sql.Identifier(SYSBENCH_DB_NAME),\n                sql.Identifier(SYSBENCH_USER)\n            ))\n        cursor.execute(\n            sql.SQL(\"ALTER DATABASE {} OWNER TO {}\")\n            .format(\n                sql.Identifier(SYSBENCH_DB_NAME),\n                sql.Identifier(SYSBENCH_USER)\n            ))\n\n        cursor.close()\n        connection.close()\n        print(\"PostgreSQL user and database created successfully\")\n\n    except psycopg2.Error as e:\n        print(f\"Error creating PostgreSQL user/database: {e}\")\n        exit(1)\n\ndef check_dependencies():\n    try:\n        subprocess.run([\"sysbench\", \"--version\"], check=True, capture_output=True)\n    except (subprocess.CalledProcessError, FileNotFoundError):\n        print(\"Error: sysbench is not installed. Please install it first.\")\n        print(\"For Ubuntu/Debian: sudo apt-get install sysbench\")\n        print(\"For CentOS/RHEL: sudo yum install sysbench\")\n        exit(1)\n\ndef run_sysbench(command, test_type):\n    try:\n        print(f\"Running {test_type} test...\")\n        result = subprocess.run(\n            command,\n            check=True,\n            shell=True,\n            capture_output=True,\n            text=True\n        )\n        print(result.stdout)\n        print(f\"✅ {test_type} test completed successfully\")\n        return True\n    except subprocess.CalledProcessError as e:\n        print(f\"❌ Error during {test_type} test:\")\n        print(e.stderr)\n        return False\n\ndef main():\n    # Create database if not exists\n    # Create PostgreSQL user and database\n    create_pg_user_and_db(PG_HOST, PG_PORT, PG_USER, PG_PASSWORD)\n\n    # Prepare command\n    prepare_cmd = (\n        f\"sysbench oltp_read_write \"\n        f\"--db-driver=pgsql \"\n        f\"--pgsql-host={PG_HOST} \"\n        f\"--pgsql-port={PG_PORT} \"\n        f\"--pgsql-user={SYSBENCH_USER} \"\n        f\"--pgsql-password={SYSBENCH_PASSWORD} \"\n        f\"--pgsql-db={SYSBENCH_DB_NAME} \"\n        f\"--table-size={TABLE_SIZE} \"\n        f\"--report-interval=1 \"\n        f\"prepare\"\n    )\n\n    if not run_sysbench(prepare_cmd, \"Prepare\"):\n        return\n\n    # Run benchmark for different thread counts\n    for threads in THREADS:\n        print(f\"\\n🏁 Starting benchmark with {threads} threads\")\n        run_cmd = (\n            f\"sysbench oltp_read_write \"\n            f\"--db-driver=pgsql \"\n            f\"--pgsql-host={PG_HOST} \"\n            f\"--pgsql-port={PG_PORT} \"\n            f\"--pgsql-user={SYSBENCH_USER} \"\n            f\"--pgsql-password={SYSBENCH_PASSWORD} \"\n            f\"--pgsql-db={SYSBENCH_DB_NAME} \"\n            f\"--table-size={TABLE_SIZE} \"\n            f\"--threads={threads} \"\n            f\"--time={DURATION} \"\n            f\"--report-interval=1 \"\n            f\"run\"\n        )\n\n        if run_sysbench(run_cmd, f\"Runtime ({threads} threads)\"):\n            print(f\"📊 Results for {threads} threads:\")\n            print(\"--------------------------------\")\n\n    # Cleanup\n    cleanup_cmd = (\n        f\"sysbench oltp_read_write \"\n        f\"--db-driver=pgsql \"\n        f\"--pgsql-host={PG_HOST} \"\n        f\"--pgsql-port={PG_PORT} \"\n        f\"--pgsql-user={SYSBENCH_USER} \"\n        f\"--pgsql-password={SYSBENCH_PASSWORD} \"\n        f\"--pgsql-db={SYSBENCH_DB_NAME} \"\n        f\"--table-size={TABLE_SIZE} \"\n        f\"--report-interval=1 \"\n        f\"cleanup\"\n    )\n    run_sysbench(cleanup_cmd, \"Cleanup\")\n\nif __name__ == \"__main__\":\n    # Verify dependencies\n    check_dependencies()\n\n    parser = argparse.ArgumentParser(description='PostgreSQL Sysbench Runner')\n    parser.add_argument('--host', help='PostgreSQL Host', default=PG_HOST)\n    parser.add_argument('--port', help='PostgreSQL Port', default=PG_PORT)\n    parser.add_argument('--user', help='PostgreSQL User', default=PG_USER)\n    parser.add_argument('--password', help='PostgreSQL Password', default=PG_PASSWORD)\n    args = parser.parse_args()\n\n    PG_HOST = args.host\n    PG_PORT = args.port\n    PG_USER = args.user\n    PG_PASSWORD = args.password\n\n    main()\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/postgresql/postgresql.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"gnetId\": 11323,\n  \"graphTooltip\": 0,\n  \"id\": 17,\n  \"links\": [\n    {\n      \"asDropdown\": false,\n      \"icon\": \"cloud\",\n      \"includeVars\": false,\n      \"keepTime\": false,\n      \"tags\": [],\n      \"targetBlank\": true,\n      \"title\": \"ApeCloud\",\n      \"tooltip\": \"Improved productivity, cost-efficiency and business continuity.\",\n      \"type\": \"link\",\n      \"url\": \"https://kubeblocks.io/\"\n    },\n    {\n      \"asDropdown\": false,\n      \"icon\": \"external link\",\n      \"includeVars\": false,\n      \"keepTime\": false,\n      \"tags\": [],\n      \"targetBlank\": true,\n      \"title\": \"KubeBlocks\",\n      \"tooltip\": \"An open-source and cloud-neutral DBaaS with Kubernetes.\",\n      \"type\": \"link\",\n      \"url\": \"https://github.com/apecloud/kubeblocks\"\n    }\n  ],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 382,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Summary\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 13,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"count(sum by(namespace)(pg_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})) or vector(0)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"__auto\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total Namespaces\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 1\n      },\n      \"id\": 424,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"count(sum by(namespace,app_kubernetes_io_instance)(pg_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})) or vector(0)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{label_name}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total Clusters\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 1\n      },\n      \"id\": 442,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"sum(rate(pg_stat_database_xact_commit_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]) + rate(pg_stat_database_xact_rollback_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])) or vector(0)\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{label_name}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total Tps\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"filterable\": false,\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"instances\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"lcd-gauge\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 5,\n        \"x\": 9,\n        \"y\": 1\n      },\n      \"id\": 422,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"count by(short_version)(pg_static{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{short_version}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Cluster Versions\",\n      \"transformations\": [\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true\n            },\n            \"indexByName\": {},\n            \"renameByName\": {\n              \"Value\": \"instances\",\n              \"short_version\": \"version\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"filterable\": false,\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"instance\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"links\",\n                \"value\": [\n                  {\n                    \"targetBlank\": true,\n                    \"title\": \"PostgreSQL Instance: ${__data.fields.cluster} | ${__data.fields.instance}\",\n                    \"url\": \"/d/pMEd7m0Mz/cadvisor-exporter?orgId=1&var-node=All&var-namespace=${__data.fields.namespace}﻿&var-pod=﻿${__data.fields.instance}﻿&var-container=All\"\n                  }\n                ]\n              },\n              {\n                \"id\": \"custom.align\",\n                \"value\": \"center\"\n              },\n              {\n                \"id\": \"custom.filterable\",\n                \"value\": true\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"uptime\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"dark-red\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"dark-yellow\",\n                      \"value\": 60\n                    },\n                    {\n                      \"color\": \"dark-green\",\n                      \"value\": 120\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"lcd-gauge\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"namespace\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.filterable\",\n                \"value\": true\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"cluster\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.filterable\",\n                \"value\": true\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 10,\n        \"x\": 14,\n        \"y\": 1\n      },\n      \"id\": 428,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"enablePagination\": false,\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"uptime\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod) (pg_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"__auto\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"avg by(namespace,app_kubernetes_io_instance,pod) (time() - pg_postmaster_start_time_seconds{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"__auto\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"B\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Cluster Instances\",\n      \"transformations\": [\n        {\n          \"id\": \"joinByField\",\n          \"options\": {\n            \"byField\": \"pod\",\n            \"mode\": \"outer\"\n          }\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time 1\": true,\n              \"Time 2\": true,\n              \"Value #A\": true,\n              \"app_kubernetes_io_instance 2\": true,\n              \"namespace 2\": true\n            },\n            \"indexByName\": {\n              \"Time 1\": 3,\n              \"Time 2\": 5,\n              \"Value #A\": 4,\n              \"Value #B\": 8,\n              \"app_kubernetes_io_instance 1\": 1,\n              \"app_kubernetes_io_instance 2\": 6,\n              \"namespace 1\": 0,\n              \"namespace 2\": 7,\n              \"pod\": 2\n            },\n            \"renameByName\": {\n              \"Value #B\": \"uptime\",\n              \"app_kubernetes_io_instance 1\": \"cluster\",\n              \"namespace 1\": \"namespace\",\n              \"pod\": \"instance\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 5\n      },\n      \"id\": 421,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"count(pg_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"} > 0) or vector(0)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"__auto\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total Ups\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"dark-red\",\n                \"value\": 0.5\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 5\n      },\n      \"id\": 420,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"count(pg_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"} <= 0) or vector(0)\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"__auto\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total Downs\",\n      \"transformations\": [],\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 5\n      },\n      \"id\": 443,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"sum(rate(pg_stat_statements_stats_calls_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])) or vector(0)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{label_name}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total Qps\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"tps\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"lcd-gauge\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 427,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"topk(5, sum by(namespace,app_kubernetes_io_instance) (rate(pg_stat_database_xact_commit_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval]) + rate(pg_stat_database_xact_rollback_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])))\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Top5 Transactions Clusters\",\n      \"transformations\": [\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true\n            },\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value\": 3,\n              \"app_kubernetes_io_instance\": 2,\n              \"namespace\": 1\n            },\n            \"renameByName\": {\n              \"Value\": \"tps\",\n              \"app_kubernetes_io_instance\": \"cluster\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"qps\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"lcd-gauge\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 9\n      },\n      \"id\": 438,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"topk(5, sum by(namespace,app_kubernetes_io_instance) (rate(pg_stat_statements_stats_calls_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])))\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Top5 Queries Clusters\",\n      \"transformations\": [\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true\n            },\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value\": 3,\n              \"app_kubernetes_io_instance\": 2,\n              \"namespace\": 1\n            },\n            \"renameByName\": {\n              \"Value\": \"qps\",\n              \"app_kubernetes_io_instance\": \"cluster\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"connections\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"lcd-gauge\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 9\n      },\n      \"id\": 429,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"topk(5, sum by(namespace,app_kubernetes_io_instance) (pg_stat_database_numbackends{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}))\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Top5 Connections Clusters\",\n      \"transformations\": [\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true\n            },\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value\": 3,\n              \"app_kubernetes_io_instance\": 2,\n              \"namespace\": 1\n            },\n            \"renameByName\": {\n              \"Value\": \"connections\",\n              \"app_kubernetes_io_instance\": \"cluster\",\n              \"namespace\": \"namespace\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"size\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"bytes\"\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"lcd-gauge\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 9\n      },\n      \"id\": 440,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"topk(5, sum by(namespace,app_kubernetes_io_instance) (pg_database_size_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}))\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Top5 Disk Size Clusters\",\n      \"transformations\": [\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true\n            },\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value\": 3,\n              \"app_kubernetes_io_instance\": 2,\n              \"namespace\": 1\n            },\n            \"renameByName\": {\n              \"Value\": \"size\",\n              \"app_kubernetes_io_instance\": \"cluster\",\n              \"namespace\": \"namespace\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"queryid\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"long\"\n              },\n              {\n                \"id\": \"custom.inspect\",\n                \"value\": true\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"avg exec time\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"instance\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"links\",\n                \"value\": [\n                  {\n                    \"targetBlank\": true,\n                    \"title\": \"\",\n                    \"url\": \"/d/pMEd7m0Mz/cadvisor-exporter?orgId=1&var-node=All&var-namespace=${__data.fields.namespace}﻿&var-pod=﻿${__data.fields.instance}﻿&var-container=All\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"query\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.minWidth\",\n                \"value\": 500\n              },\n              {\n                \"id\": \"custom.align\",\n                \"value\": \"left\"\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-text\"\n              },\n              {\n                \"id\": \"custom.inspect\",\n                \"value\": true\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 441,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": []\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"topk(10, pg_stat_statements_by_mean_exec_time_mean_exec_time_seconds{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"})\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Top10 Avg Exec Time Statements\",\n      \"transformations\": [\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"__name__\": true,\n              \"app_kubernetes_io_component\": true,\n              \"app_kubernetes_io_component_name\": true,\n              \"app_kubernetes_io_managed_by\": true,\n              \"app_kubernetes_io_name\": true,\n              \"app_kubernetes_io_version\": true,\n              \"apps_kubeblocks_io_component_name\": true,\n              \"helm_sh_chart\": true,\n              \"instance\": true,\n              \"job\": true,\n              \"node\": true,\n              \"receiver\": true,\n              \"rolname\": true,\n              \"server\": true,\n              \"service\": true\n            },\n            \"indexByName\": {\n              \"Time\": 1,\n              \"Value\": 12,\n              \"__name__\": 2,\n              \"app_kubernetes_io_component\": 15,\n              \"app_kubernetes_io_instance\": 3,\n              \"app_kubernetes_io_managed_by\": 4,\n              \"app_kubernetes_io_name\": 5,\n              \"app_kubernetes_io_version\": 16,\n              \"apps_kubeblocks_io_component_name\": 17,\n              \"datname\": 7,\n              \"helm_sh_chart\": 18,\n              \"instance\": 8,\n              \"job\": 9,\n              \"namespace\": 0,\n              \"node\": 19,\n              \"pod\": 6,\n              \"query\": 13,\n              \"queryid\": 14,\n              \"receiver\": 20,\n              \"rolname\": 10,\n              \"server\": 11,\n              \"service\": 21\n            },\n            \"renameByName\": {\n              \"Value\": \"avg exec time\",\n              \"app_kubernetes_io_instance\": \"cluster\",\n              \"pod\": \"instance\",\n              \"rolname\": \"tablename\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\"\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"queryid\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"long\"\n              },\n              {\n                \"id\": \"custom.inspect\",\n                \"value\": true\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"instance\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"links\",\n                \"value\": [\n                  {\n                    \"targetBlank\": true,\n                    \"title\": \"\",\n                    \"url\": \"/d/pMEd7m0Mz/cadvisor-exporter?orgId=1&var-node=All&var-namespace=${__data.fields.namespace}﻿&var-pod=﻿${__data.fields.instance}﻿&var-container=All\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"query\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.inspect\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-text\"\n              },\n              {\n                \"id\": \"custom.align\",\n                \"value\": \"left\"\n              },\n              {\n                \"id\": \"custom.minWidth\",\n                \"value\": 500\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 23\n      },\n      \"id\": 439,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"count\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"topk(10, increase(pg_stat_statements_by_calls_calls_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[10m]))\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Top10 Most Called Statements Within 10 Minites\",\n      \"transformations\": [\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"__name__\": true,\n              \"app_kubernetes_io_component\": true,\n              \"app_kubernetes_io_component_name\": true,\n              \"app_kubernetes_io_managed_by\": true,\n              \"app_kubernetes_io_name\": true,\n              \"app_kubernetes_io_version\": true,\n              \"apps_kubeblocks_io_component_name\": true,\n              \"helm_sh_chart\": true,\n              \"instance\": true,\n              \"job\": true,\n              \"node\": true,\n              \"receiver\": true,\n              \"rolname\": true,\n              \"server\": true,\n              \"service\": true\n            },\n            \"indexByName\": {\n              \"Time\": 1,\n              \"Value\": 11,\n              \"app_kubernetes_io_component\": 14,\n              \"app_kubernetes_io_instance\": 2,\n              \"app_kubernetes_io_managed_by\": 3,\n              \"app_kubernetes_io_name\": 4,\n              \"app_kubernetes_io_version\": 15,\n              \"apps_kubeblocks_io_component_name\": 16,\n              \"datname\": 6,\n              \"helm_sh_chart\": 17,\n              \"instance\": 7,\n              \"job\": 8,\n              \"namespace\": 0,\n              \"node\": 18,\n              \"pod\": 5,\n              \"query\": 12,\n              \"queryid\": 13,\n              \"receiver\": 19,\n              \"rolname\": 9,\n              \"server\": 10,\n              \"service\": 20\n            },\n            \"renameByName\": {\n              \"Value\": \"count\",\n              \"app_kubernetes_io_instance\": \"cluster\",\n              \"pod\": \"instance\",\n              \"rolname\": \"tablename\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 30\n      },\n      \"id\": 412,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 31\n          },\n          \"id\": 413,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"pg_stat_database_numbackends{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Current Connections\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 31\n          },\n          \"id\": 414,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"pg_stat_activity_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\",state=\\\"active\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Active Connections\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 39\n          },\n          \"id\": 512,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod) (pg_stat_database_numbackends{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}) / on(namespace,app_kubernetes_io_instance,pod) pg_settings_max_connections{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Used Connections Ratio\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Connections\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 31\n      },\n      \"id\": 431,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 48\n          },\n          \"id\": 432,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"exemplar\": false,\n              \"expr\": \"rate(pg_stat_user_tables_idx_scan_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}} | {{relname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Index Scans Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 48\n          },\n          \"id\": 434,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"exemplar\": false,\n              \"expr\": \"rate(pg_stat_user_tables_idx_tup_fetch_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval]) / rate(pg_stat_user_tables_idx_scan_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}} | {{relname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Average Index Tuples Fetch\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 56\n          },\n          \"id\": 433,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"exemplar\": false,\n              \"expr\": \"rate(pg_stat_user_tables_seq_scan_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}} | {{relname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Seq Scans Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 56\n          },\n          \"id\": 435,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"exemplar\": false,\n              \"expr\": \"rate(pg_stat_user_tables_seq_tup_read_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval]) / rate(pg_stat_user_tables_seq_scan_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}} | {{relname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Average Seq Tuples Read\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 64\n          },\n          \"id\": 436,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"exemplar\": false,\n              \"expr\": \"pg_stat_user_tables_n_live_tup{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}} | {{relname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Estimated Live Tuples\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 64\n          },\n          \"id\": 437,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"exemplar\": false,\n              \"expr\": \"pg_stat_user_tables_n_dead_tup{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}} | {{relname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Estimated Dead Tuples\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Queries Per Table\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 32\n      },\n      \"id\": 393,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 73\n          },\n          \"id\": 394,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_tup_fetched_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Fetched Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 73\n          },\n          \"id\": 395,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_tup_returned_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Returned Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 81\n          },\n          \"id\": 396,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_tup_inserted_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Inserted Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 81\n          },\n          \"id\": 397,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_tup_updated_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Updated Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 89\n          },\n          \"id\": 398,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_tup_deleted_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Deleted Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 89\n          },\n          \"id\": 407,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_temp_bytes_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Data Written to Temp Files Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 97\n          },\n          \"id\": 406,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_temp_files_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Temp Files Per Second\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Tuples Per Database\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 33\n      },\n      \"id\": 514,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 106\n          },\n          \"id\": 389,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_xact_commit_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Commits Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 106\n          },\n          \"id\": 390,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_xact_rollback_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Rollbacks Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 114\n          },\n          \"id\": 391,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"max without(state) (max_over_time(pg_stat_activity_max_tx_duration{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__interval]))\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Max Duration of Transactions\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Transactions Per Database\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 34\n      },\n      \"id\": 494,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 123\n          },\n          \"id\": 408,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod,state) (pg_stat_activity_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{state}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Server Process By State\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 123\n          },\n          \"id\": 489,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod,backend_type) (pg_stat_activity_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{backend_type}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Server Process By Backend Type\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 131\n          },\n          \"id\": 490,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod,wait_event_type) (pg_stat_activity_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{wait_event_type}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Server Process By Wait Event Type\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 131\n          },\n          \"id\": 491,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod,wait_event_type,wait_event) (pg_stat_activity_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{wait_event_type}} | {{wait_event}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Server Process By Wait Event\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 139\n          },\n          \"id\": 492,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod,datname) (pg_stat_activity_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Server Process By Database\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Server Processes\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 35\n      },\n      \"id\": 511,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 36\n          },\n          \"id\": 423,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_archiver_archived_count_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"success: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_archiver_failed_count_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"fail: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"WAL Files Per Second (archiver)\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 36\n          },\n          \"id\": 487,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"pg_wal_log_file_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"} * pg_settings_wal_segment_size_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"total wal disk size: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"pg_settings_wal_segment_size_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"wal_segment_size: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"WAL Files Disk Size (archiver)\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"ms\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 44\n          },\n          \"id\": 410,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_checkpoint_write_time_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Written Files to disk: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_checkpoint_sync_time_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Files Synchronization to disk: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Checkpoints Time Per Second (bgwriter)\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 44\n          },\n          \"id\": 415,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_checkpoints_timed_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Scheduled: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_checkpoints_req_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Requested: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Checkpoints Per Second (bgwriter)\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 52\n          },\n          \"id\": 403,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_buffers_alloc_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Allocated: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_buffers_backend_fsync_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Fsync calls by a backend: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_buffers_backend_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Written directly by backend: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_buffers_clean_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Written by the background writer: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_buffers_checkpoint_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Written during checkpoints: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"E\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_bgwriter_maxwritten_clean_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Written stopped by the background writer: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"F\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Buffers Written Per Second (bgwriter)\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Background Process\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 36\n      },\n      \"id\": 496,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 37\n          },\n          \"id\": 499,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod,locktype) (pg_locks_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}  | {{locktype}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Locks By Lock Type\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 37\n          },\n          \"id\": 498,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod,mode) (pg_locks_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}  | {{mode}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Locks By Mode\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 45\n          },\n          \"id\": 501,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod,datname,relation) (pg_locks_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",locktype=\\\"relation\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}  | {{datname}} | {{relation}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Locks By Relation(Table)\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"__systemRef\": \"hideSeriesFrom\",\n                \"matcher\": {\n                  \"id\": \"byNames\",\n                  \"options\": {\n                    \"mode\": \"exclude\",\n                    \"names\": [\n                      \"Lock Held: default | pg14 | pg14-postgresql-0 \"\n                    ],\n                    \"prefix\": \"All except:\",\n                    \"readOnly\": true\n                  }\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.hideFrom\",\n                    \"value\": {\n                      \"legend\": false,\n                      \"tooltip\": false,\n                      \"viz\": true\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 45\n          },\n          \"id\": 500,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod) (pg_locks_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",granted=\\\"1\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Lock Held: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} \",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod) (pg_locks_detail_count{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",granted=\\\"0\\\"})\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Lock Awaited: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} \",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Locks Held or Awaited\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 53\n          },\n          \"id\": 497,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"max by(namespace,app_kubernetes_io_instance,pod) (max_over_time(pg_locks_detail_max_wait_age_seconds{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__interval]))\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} \",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Max Lock Wait Time (Version >= 14)\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Locks\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 37\n      },\n      \"id\": 503,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 38\n          },\n          \"id\": 385,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_wal_wal_records_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"WAL Records Generated Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 38\n          },\n          \"id\": 505,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_wal_wal_fpi_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"WAL Full Page Images Generated Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 46\n          },\n          \"id\": 506,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_wal_wal_bytes_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"WAL Generated Size Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 46\n          },\n          \"id\": 507,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_wal_wal_buffers_full_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"WAL Buffer Full Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 54\n          },\n          \"id\": 508,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_wal_wal_write_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"XLogWrite: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_wal_wal_sync_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"XLogFsync: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"WAL Written To Disk Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 54\n          },\n          \"id\": 509,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_wal_wal_write_time_seconds_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"XLogWrite: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_wal_wal_sync_time_seconds_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"XLogFsync: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Time of WAL Written To Disk Per Second\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"WAL (Version >= 14)\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 38\n      },\n      \"id\": 383,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 63\n          },\n          \"id\": 386,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_conflicts_confl_bufferpin_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Pinned buffers: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_conflicts_confl_deadlock_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Deadlocks: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_conflicts_confl_lock_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Lock timeouts: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_conflicts_confl_snapshot_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Old snapshots: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 20\n            },\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_conflicts_confl_tablespace_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Dropped tablespaces: {{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"E\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Canceled Queries Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 63\n          },\n          \"id\": 504,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_conflicts_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Conflicts Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 71\n          },\n          \"id\": 384,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_deadlocks_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Deadlocks Per Second\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Conflicts & Deadlocks\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 39\n      },\n      \"id\": 400,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 64\n          },\n          \"id\": 488,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_blks_hit_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Buffer Cache Read Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 64\n          },\n          \"id\": 409,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_blks_read_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Disk Block Read Per Second\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"ms\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 72\n          },\n          \"id\": 401,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_blk_read_time_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Block Read Time\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"ms\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 72\n          },\n          \"id\": 402,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"rate(pg_stat_database_blk_write_time_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Block Write Time\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Shared Buffers & Blocks\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 40\n      },\n      \"id\": 417,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 65\n          },\n          \"id\": 418,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"pg_database_size_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",datname=~\\\"$database\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{datname}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Disk Size\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Database Size\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 41\n      },\n      \"id\": 459,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 66\n          },\n          \"id\": 486,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum(pg_replication_is_master{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}) by(namespace,app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} \",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Master Role\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 66\n          },\n          \"id\": 484,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum (pg_replication_slots_pg_wal_lsn_diff{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\"}) by(namespace,app_kubernetes_io_instance,slot_name)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{slot_name}} \",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Replication Lag Size\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 74\n          },\n          \"id\": 483,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"sum(pg_replication_lag{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}) by(namespace, app_kubernetes_io_instance,pod)\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} \",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Replication Lag Time\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"prometheus\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"auto\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 74\n          },\n          \"id\": 463,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"list\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"prometheus\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(pg_replication_slots_active{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\"}) by(namespace,app_kubernetes_io_instance)\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}}\",\n              \"range\": true,\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"Replication Slots\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 82\n          },\n          \"id\": 485,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.4\",\n          \"targets\": [\n            {\n              \"calculatedInterval\": \"2m\",\n              \"datasource\": {\n                \"uid\": \"$datasource\"\n              },\n              \"datasourceErrors\": {},\n              \"editorMode\": \"code\",\n              \"errors\": {},\n              \"expr\": \"(time() - sum(pg_stat_replication_reply_time{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\"}) by(namespace,app_kubernetes_io_instance,application_name)) < bool 2000\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{application_name}} \",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 20\n            }\n          ],\n          \"title\": \"Replication Status\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Replication\",\n      \"type\": \"row\"\n    }\n  ],\n  \"refresh\": false,\n  \"schemaVersion\": 37,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"postgres\",\n    \"db\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"data source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": true,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"label_values(pg_up{}, namespace)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"namespace\",\n        \"multi\": true,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(pg_up{}, namespace)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 5,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": true,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(pg_up{job=\\\"$job\\\"}, app_kubernetes_io_instance)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"cluster\",\n        \"multi\": true,\n        \"name\": \"cluster\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(pg_up{job=\\\"$job\\\"}, app_kubernetes_io_instance)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 5,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": true,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(pg_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\"}, pod)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"instance\",\n        \"multi\": true,\n        \"name\": \"instance\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(pg_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\"}, pod)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 5,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": true,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(pg_database_size_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}, datname)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"database\",\n        \"multi\": true,\n        \"name\": \"database\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(pg_database_size_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\"}, datname)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 5,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-30m\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"collapse\": false,\n    \"enable\": true,\n    \"hidden\": false,\n    \"notice\": false,\n    \"now\": true,\n    \"refresh_intervals\": [\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"status\": \"Stable\",\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ],\n    \"type\": \"timepicker\"\n  },\n  \"timezone\": \"\",\n  \"title\": \"APPS / PostgreSQL\",\n  \"uid\": \"postgresql\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/001.standalone.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: redis-standalone\nspec:\n  terminationPolicy: Delete\n  clusterDef: redis    # set to reids\n  topology: standalone # set topology to standalone\n  componentSpecs:\n  - name: redis\n    replicas: 1       # set replica to 1\n    serviceVersion: 7.2.7\n    resources:\n      limits:\n        cpu: \"0.5\"\n        memory: \"0.5Gi\"\n      requests:\n        cpu: \"0.5\"\n        memory: \"0.5Gi\"\n    volumeClaimTemplates:\n      - name: data\n        spec:\n          storageClassName: \"local-path\"\n          accessModes:\n            - ReadWriteOnce\n          resources:\n            requests:\n              storage: 10Gi\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/002.redis-replication.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: redis-replication\nspec:\n  terminationPolicy: Delete\n  clusterDef: redis\n  topology: replication\n  componentSpecs:\n    - name: redis\n      serviceVersion: \"7.2.7\"\n      disableExporter: false\n      replicas: 2\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 10Gi\n    - name: redis-sentinel\n      replicas: 1\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 10Gi\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/003.redis-sharding.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: redis-sharding\nspec:\n  terminationPolicy: Delete\n  shardings:\n  - name: shard\n    shards: 3\n    template:\n      name: redis\n      componentDef: redis-cluster-7\n      disableExporter: false\n      replicas: 2\n      resources:\n        limits:\n          cpu: '1'\n          memory: 1Gi\n        requests:\n          cpu: '1'\n          memory: 1Gi\n      serviceVersion: 7.2.7\n      volumeClaimTemplates:\n      - name: data\n        spec:\n          storageClassName: \"local-path\"\n          accessModes:\n          - ReadWriteOnce\n          resources:\n            requests:\n              storage: 10Gi\n      services:\n        # This is a per-pod svc, and will be used to parse advertised endpoints\n      - name: redis-advertised\n        podService: true\n        serviceType: NodePort\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/101.stop.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-replication-stop-ops\nspec:\n  clusterName: redis-replication\n  type: Stop\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/102.start.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-replication-start-ops\nspec:\n  clusterName: redis-replication\n  type: Start\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/103.restart.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-replication-restart-ops\nspec:\n  clusterName: redis-replication\n  type: Restart\n  restart:\n  - componentName: redis\n  - componentName: redis-sentinel\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/104.vscale.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-replication-vscale-ops\nspec:\n  clusterName: redis-replication\n  type: VerticalScaling\n  verticalScaling:\n  - componentName: redis\n    requests:\n      cpu: '1'\n      memory: 1Gi\n    limits:\n      cpu: '1'\n      memory: 1Gi\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/105.hscale.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-replication-scale-out-ops\nspec:\n  clusterName: redis-replication\n  type: HorizontalScaling\n  horizontalScaling:\n  - componentName: redis\n    # Specifies the replica changes for scaling in components\n    scaleOut:\n      # Specifies the replica changes for the component.\n      # add one more replica to current component\n      replicaChanges: 1\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/106.api-expose.yaml",
    "content": "apiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: redis-replication\nspec:\n  terminationPolicy: Delete\n  clusterDef: redis\n  topology: replication\n  services:\n    - componentSelector: redis\n      name: redis-external\n      serviceName: redis-external\n      roleSelector: primary\n      spec:\n        ipFamilyPolicy: PreferDualStack\n        ports:\n          - name: redis\n            port: 6379\n            protocol: TCP\n            targetPort: redis\n        type: NodePort\n  componentSpecs:\n    - name: redis\n      serviceVersion: \"7.2.7\"\n      disableExporter: false\n      replicas: 2\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 10Gi\n    - name: redis-sentinel\n      replicas: 1\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 10Gi\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/106.expose.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-replication-expose-enable-ops\nspec:\n  type: Expose\n  clusterName: redis-replication\n  expose:\n  - componentName: redis\n    services:\n    - name: internet\n      serviceType: NodePort\n      annotations:\n        service.beta.kubernetes.io/aws-load-balancer-type: nlb\n        service.beta.kubernetes.io/aws-load-balancer-internal: \"false\"  # or \"true\" for an internal VPC IP\n      # Specifies a role to target with the service.\n      # If specified, the service will only be exposed to pods with the matching\n      # role.\n      roleSelector: primary\n    switch: Enable\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/107.reconf-dynamic.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-reconf-dynamic\nspec:\n  clusterName: redis-replication\n  # Instructs the system to bypass pre-checks (including cluster state checks and customized pre-conditions hooks) and immediately execute the opsRequest, except for the opsRequest of 'Start' type, which will still undergo pre-checks even if `force` is true.  Note: Once set, the `force` field is immutable and cannot be updated.\n  force: false\n  reconfigures:\n  - componentName: redis\n   # Contains a list of ConfigurationItem objects, specifying the Component's configuration template name, upgrade policy, and parameter key-value pairs to be updated.\n    parameters:\n      # 注意：实际上这个参数调整会重启pod \n    - key: slowlog-log-slower-than\n      # Represents the parameter values that are to be updated.\n      # If set to nil, the parameter defined by the Key field will be removed from the configuration file.\n      value: '15000'\n  # Specifies the maximum number of seconds the OpsRequest will wait for its start conditions to be met before aborting. If set to 0 (default), the start conditions must be met immediately for the OpsRequest to proceed.\n  preConditionDeadlineSeconds: 0\n  type: Reconfiguring\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/108.reconf-static.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-reconfigure-static\nspec:\n  clusterName: redis-replication\n  reconfigures:\n  - componentName: redis\n    parameters:\n    - key: aof-timestamp-enabled\n      value: 'yes'\n  type: Reconfiguring\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/109.switchover.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-switchover\nspec:\n  # Specifies the name of the Cluster resource that this operation is targeting.\n  clusterName: redis-replication\n  type: Switchover\n  # Lists Switchover objects, each specifying a Component to perform the switchover operation.\n  switchover:\n    # Specifies the name of the Component.\n  - componentName: redis\n    # Specifies the instance whose role will be transferred.\n    # A typical usage is to transfer the leader role in a consensus system.\n    instanceName: redis-replication-redis-1\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/121.backup-repo.yaml",
    "content": "# Create a secret to save the access key for MinIO\n#kubectl create secret generic minio-credential-for-backuprepo \\\n#  -n kb-system \\\n#  --from-literal=accessKeyId=<ACCESS KEY> \\\n#  --from-literal=secretAccessKey=<SECRET KEY>\n\n# Create the BackupRepo resource\napiVersion: dataprotection.kubeblocks.io/v1alpha1\nkind: BackupRepo\nmetadata:\n  name: my-repo\n  annotations:\n    dataprotection.kubeblocks.io/is-default-repo: \"true\"\nspec:\n  storageProviderRef: minio\n  accessMethod: Tool\n  pvReclaimPolicy: Retain\n  volumeCapacity: 50Gi\n  config:\n    bucket: db-backup\n    mountOptions: \"\"\n    endpoint: http://minio.minio.svc\n  credential:\n    name: minio-credential-for-backuprepo\n    namespace: kb-system\n  pathPrefix: \"\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/122.full-backup.yaml",
    "content": "apiVersion: dataprotection.kubeblocks.io/v1alpha1\nkind: Backup\nmetadata:\n  name: redis-backup-datafile\nspec:\n  backupMethod: datafile\n  backupPolicyName: redis-replication-redis-backup-policy\n  # Determines whether the backup contents stored in the backup repository should be deleted\n  # when the backup custom resource(CR) is deleted. Supported values are `Retain` and `Delete`.\n  # - `Retain` means that the backup content and its physical snapshot on backup repository are kept.\n  # - `Delete` means that the backup content and its physical snapshot on backup repository are deleted.\n  deletionPolicy: Delete\n\n---\n# 两种方法使用其一即可\napiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-replication-backup\nspec:\n  clusterName: redis-replication\n  force: false\n  backup:\n    backupPolicyName: redis-replication-redis-backup-policy\n    backupMethod: datafile\n    deletionPolicy: Delete\n    retentionPeriod: 1mo\n  type: Backup\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/123.scheduled-backup.yaml",
    "content": "# 手动修改BackupSchedule\n# KubeBlocks automatically creates a BackupSchedule resource when the cluster is created.\n\n\n# kubectl edit backupschedule redis-replication-redis-backup-schedule -n demo\n    #- Update these key parameters:\n\n        #enabled: Set to true to activate scheduled backups\n        #cronExpression: Configure backup frequency using cron syntax\n        #retentionPeriod: Set how long to keep backups (e.g., 7d, 1mo)\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/124.scheduled-continuous-backup.yaml",
    "content": "---\n# cat examples/redis/reconfigure-aof.yaml\napiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-reconfigure-aof\nspec:\n  clusterName: redis-replication\n  reconfigures:\n  - componentName: redis\n    parameters:\n      # Represents the name of the parameter that is to be updated.\n    - key: aof-timestamp-enabled\n      value: 'yes'\n  type: Reconfiguring\n\n---\n# 先手动启用上面参数配置，然后修改\n# kubectl edit backupschedules.dataprotection.kubeblocks.io redis-replication-redis-backup-schedule\n\napiVersion: dataprotection.kubeblocks.io/v1alpha1\nkind: BackupSchedule\nspec:\n  backupPolicyName: redis-replication-redis-backup-policy\n  schedules:\n  - backupMethod: datafile\n    cronExpression: 0 18 * * * # update the cronExpression to your need\n    enabled: true # set to `true` to schedule base backup periodically\n    retentionPeriod: 7d # set the retention period to your need\n  - backupMethod: aof\n    cronExpression: '*/30 * * * *'\n    enabled: true   # set to `true` to enable continuous backup\n    name: aof\n    retentionPeriod: 8d # by default, retentionPeriod of continuous backup is 1d more than that of a full backup.\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/125.api-restore.yaml",
    "content": "## 恢复后的集群必须和原集群同一个namespace\napiVersion: apps.kubeblocks.io/v1\nkind: Cluster\nmetadata:\n  name: redis-replication-restore\n  annotations:\n    kubeblocks.io/restore-from-backup: '{\"redis\":{\"name\":\"redis-backup-datafile\",\"namespace\":\"default\",\"volumeRestorePolicy\":\"Parallel\"}}'\nspec:\n  terminationPolicy: Delete\n  clusterDef: redis\n  topology: replication\n  componentSpecs:\n    - name: redis\n      serviceVersion: \"7.2.7\"\n      disableExporter: false\n      replicas: 2\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n    - name: redis-sentinel\n      replicas: 1\n      resources:\n        limits:\n          cpu: '0.5'\n          memory: 0.5Gi\n        requests:\n          cpu: '0.5'\n          memory: 0.5Gi\n      volumeClaimTemplates:\n        - name: data\n          spec:\n            storageClassName: \"local-path\"\n            accessModes:\n              - ReadWriteOnce\n            resources:\n              requests:\n                storage: 20Gi\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/125.restore.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-replication-restore\nspec:\n  clusterName: pg-restored\n  force: false\n  restore:\n    backupName: <FULL_BACKUP_NAME>\n    backupNamespace: demo\n  type: Restore\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/126.restore-pitr.yaml",
    "content": "apiVersion: operations.kubeblocks.io/v1alpha1\nkind: OpsRequest\nmetadata:\n  name: redis-replication-restore\nspec:\n  clusterName: redis-replication-pitr\n  force: false\n  restore:\n    backupName: <CONTINUOUS_BACKUP_NAME>\n    backupNamespace: demo\n    restorePointInTime: <RESTORE_POINT_TIME>\n  type: Restore\n\n# https://kubeblocks.io/docs/release-1_0/kubeblocks-for-redis/05-backup-restore/06-restore-with-pitr\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/131.pod-monitor.yaml",
    "content": "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n  name: redis-replication-pod-monitor\n  namespace: monitor    # prometheus namespace\n  labels:               # Must match the setting in 'prometheus.spec.podMonitorSelector'\n    release: prometheus\nspec:\n  jobLabel: app.kubernetes.io/managed-by\n  # defines the labels which are transferred from the\n  # associated Kubernetes 'Pod' object onto the ingested metrics\n  # set the lables w.r.t you own needs\n  podTargetLabels:\n  - app.kubernetes.io/instance\n  - app.kubernetes.io/managed-by\n  - apps.kubeblocks.io/component-name\n  - apps.kubeblocks.io/pod-name\n  podMetricsEndpoints:\n    - path: /metrics\n      port: http-metrics   # Must match exporter port name\n      scheme: http\n  namespaceSelector:\n    matchNames:\n      - default # Target namespace\n  selector:\n    matchLabels:\n      app.kubernetes.io/instance: redis-replication\n      apps.kubeblocks.io/component-name: redis\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/132.alert-rules.yaml",
    "content": "apiVersion: monitoring.coreos.com/v1\nkind: PrometheusRule\nmetadata:\n  name: redis-alert-rules\n  labels:\n    release: prometheus\nspec:\n  groups:\n    - name: RedisExporter\n      rules:\n        - alert: RedisDown\n          expr: \"redis_up == 0\"\n          for: 5m\n          labels:\n            severity: critical\n          annotations:\n            summary: \"Redis is down\"\n            description: \"Redis is down. (instance: {{ $labels.pod }})\"\n\n        - alert: RedisCPUHigh\n          expr: \"(rate(redis_cpu_sys_seconds_total[1m]) + rate(redis_cpu_user_seconds_total[1m])) * 100 > 80\"\n          for: 2m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"Out of CPU (> 80%)\"\n            description: 'Redis is running out of CPU and the value is {{ $value | printf \"%.2f\" }} percent. (instance: {{ $labels.pod }})'\n\n        - alert: RedisMemoryHigh\n          expr: \"(redis_memory_max_bytes == 0 or redis_memory_used_bytes * 100 / redis_memory_max_bytes) > 90\"\n          for: 5m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"Out of memory (> 90%)\"\n            description: 'Redis is running out of memory and the value is {{ $value | printf \"%.2f\" }} percent. (instance: {{ $labels.pod }})'\n\n        - alert: RedisTooManyConnections\n          expr: \"redis_connected_clients * 100 / redis_config_maxclients > 80\"\n          for: 1m\n          labels:\n            severity: warning\n          annotations:\n            summary: \"Redis has too many connections (> 80%)\"\n            description: 'Redis has too many connections and the value is {{ $value | printf \"%.2f\" }} percent. (instance: {{ $labels.pod }})'\n\n        - alert: RedisRejectedConnections\n          expr: \"increase(redis_rejected_connections_total[1m]) > 0\"\n          for: 5m\n          labels:\n            severity: error\n          annotations:\n            summary: \"Redis has rejected connections\"\n            description: '{{ $value | printf \"%.2f\" }} connections to Redis has been rejected. (instance: {{ $labels.pod }})'\n\n        - alert: RedisKeyEviction\n          expr: \"increase(redis_evicted_keys_total[5m]) > 0\"\n          for: 1s\n          labels:\n            severity: error\n          annotations:\n            summary: \"Redis has evicted keys\"\n            description: 'Redis has evicted keys in the last 5 minutes and the value is {{ $value | printf \"%.2f\" }}. (instance: {{ $labels.pod }})'\n\n        - alert: RedisMissingMaster\n          expr: 'count by (app_kubernetes_io_instance) (redis_instance_info{role=\"master\"}) < 1'\n          for: 30s\n          labels:\n            severity: critical\n          annotations:\n            summary: \"Redis missing master\"\n            description: \"Redis cluster has no node marked as master.\"\n\n        - alert: RedisDisconnectedSlaves\n          expr: \"count without (instance, job) (redis_connected_slaves) - sum without (instance, job) (redis_connected_slaves) - 1 > 1\"\n          for: 0m\n          labels:\n            severity: critical\n          annotations:\n            summary: \"Redis disconnected slaves\"\n            description: \"Redis not replicating for all slaves. Consider reviewing the redis replication status. (instance: {{ $labels.pod }})\"\n\n        - alert: RedisReplicationBroken\n          expr: \"delta(redis_connected_slaves[1m]) < 0\"\n          for: 0m\n          labels:\n            severity: critical\n          annotations:\n            summary: \"Redis replication broken\"\n            description: \"Redis instance lost a slave. (instance: {{ $labels.pod }})\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/benchmark.py",
    "content": "import redis\nimport time\nimport argparse\nfrom threading import Thread\nfrom statistics import mean, median, pstdev\n\n###############################################################################\n###############################################################################\n# README.md\n# This is a simple bench mark test for redis.\n# - Tests both SET and GET operations\n# - Measures throughput and latency statistics\n# - Supports concurrent client simulation\n# - Configurable payload sizes\n#\n# Usage:\n# python3 benchmark.py \\\n#   --host 127.0.0.1 \\\n#   --clients 100 \\\n#   --requests 1000000 \\\n#   --value-size 256\n#   --username default \\\n#   --password <password>\n#\n# Installation Requirements:\n# - pip install redis\n#\n# Output Example:\n# ==================================================\n# Total requests: 100,000\n# Errors: 0\n# Duration: 4.23s\n# Throughput: 23,640.65 ops/sec\n# Mean latency: 4.12ms\n# Median latency: 3.98ms\n# 99th percentile: 8.45ms\n# Latency std dev: 1.23ms\n# ==================================================\n#\n###############################################################################\n###############################################################################\nclass RedisBenchmark:\n    def __init__(self, host='localhost', port=6379, username=None, password=None, db=0):\n        self.r = redis.Redis(\n            host=host,\n            port=port,\n            username=username,\n            password=password,\n            db=db,\n            decode_responses=True,\n\n        )\n        self.latencies = []\n        self.results = {\n            'total_requests': 0,\n            'errors': 0,\n            'start_time': None,\n            'end_time': None\n        }\n\n    def flush_db(self):\n        \"\"\"Initialize test environment\"\"\"\n        self.r.flushdb()\n        print(\"✅ Database flushed\")\n\n    def _record_latency(self, start):\n        latency = (time.perf_counter() - start) * 1000  # in milliseconds\n        self.latencies.append(latency)\n        self.results['total_requests'] += 1\n\n    def _worker(self, op_type, key_size, value_size, num_ops):\n        \"\"\"Worker thread for benchmark operations\"\"\"\n        key_prefix = f\"key:{op_type}:{key_size}:\"\n        value = 'v' * value_size\n\n        for i in range(num_ops):\n            key = f\"{key_prefix}{i}\"\n            try:\n                start = time.perf_counter()\n                if op_type == 'set':\n                    self.r.set(key, value)\n                elif op_type == 'get':\n                    self.r.get(key)\n                self._record_latency(start)\n            except redis.RedisError as e:\n                self.results['errors'] += 1\n\n    def run_test(self, op_type, num_clients=50, total_requests=100000,\n                key_size=32, value_size=128):\n        \"\"\"Run benchmark test with parameters\"\"\"\n        self.latencies = []\n        self.results.update({\n            'total_requests': 0,\n            'errors': 0,\n            'start_time': time.time(),\n            'op_type': op_type.upper()\n        })\n\n        ops_per_client = total_requests // num_clients\n        threads = []\n\n        print(f\"\\n🏁 Starting {op_type.upper()} test with {num_clients} clients...\")\n\n        # Create and start threads\n        for _ in range(num_clients):\n            t = Thread(target=self._worker,\n                      args=(op_type, key_size, value_size, ops_per_client))\n            threads.append(t)\n            t.start()\n\n        # Wait for all threads to complete\n        for t in threads:\n            t.join()\n\n        self.results['end_time'] = time.time()\n        self._calculate_stats()\n        self._print_results()\n\n    def _calculate_stats(self):\n        \"\"\"Calculate performance statistics\"\"\"\n        total_time = self.results['end_time'] - self.results['start_time']\n        self.results.update({\n            'duration': total_time,\n            'throughput': self.results['total_requests'] / total_time,\n            'mean_latency': mean(self.latencies),\n            'median_latency': median(self.latencies),\n            'p99_latency': sorted(self.latencies)[int(len(self.latencies) * 0.99)],\n            'stdev': pstdev(self.latencies)\n        })\n\n    def _print_results(self):\n        \"\"\"Print formatted benchmark results\"\"\"\n        print(f\"\\n📊 {self.results['op_type']} Benchmark Results:\")\n        print(\"=\" * 50)\n        print(f\"Total requests: {self.results['total_requests']:,}\")\n        print(f\"Errors: {self.results['errors']}\")\n        print(f\"Duration: {self.results['duration']:.2f}s\")\n        print(f\"Throughput: {self.results['throughput']:,.2f} ops/sec\")\n        print(f\"Mean latency: {self.results['mean_latency']:.2f}ms\")\n        print(f\"Median latency: {self.results['median_latency']:.2f}ms\")\n        print(f\"99th percentile: {self.results['p99_latency']:.2f}ms\")\n        print(f\"Latency std dev: {self.results['stdev']:.2f}ms\")\n        print(\"=\" * 50)\n\ndef main():\n    parser = argparse.ArgumentParser(description='Redis Benchmark Tool')\n    parser.add_argument('--host', default='localhost', help='Redis host')\n    parser.add_argument('--port', type=int, default=6379, help='Redis port')\n    parser.add_argument('--username',  default=\"default\",help='Redis username')\n    parser.add_argument('--password', help='Redis password')\n    parser.add_argument('--clients', type=int, default=50,\n                       help='Number of concurrent clients')\n    parser.add_argument('--requests', type=int, default=100000,\n                       help='Total number of requests')\n    parser.add_argument('--key-size', type=int, default=32,\n                       help='Size of keys in bytes')\n    parser.add_argument('--value-size', type=int, default=128,\n                       help='Size of values in bytes')\n\n    args = parser.parse_args()\n\n    benchmark = RedisBenchmark(\n        host=args.host,\n        port=args.port,\n        username=args.username,\n        password=args.password\n    )\n\n    try:\n        # Prepare test environment\n        benchmark.flush_db()\n\n        # Run SET benchmark\n        benchmark.run_test(\n            op_type='set',\n            num_clients=args.clients,\n            total_requests=args.requests,\n            key_size=args.key_size,\n            value_size=args.value_size\n        )\n\n        # Run GET benchmark\n        benchmark.run_test(\n            op_type='get',\n            num_clients=args.clients,\n            total_requests=args.requests,\n            key_size=args.key_size,\n            value_size=args.value_size\n        )\n\n        # Cleanup\n        benchmark.flush_db()\n    except redis.ConnectionError as e:\n        print(f\"❌ Connection failed: {e}\")\n    except KeyboardInterrupt:\n        print(\"\\n🚫 Benchmark interrupted by user\")\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "roles/cluster-addon/templates/kubeblocks/redis/redis.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"Dashboards for Redis managed by KubeBlocks\",\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"gnetId\": 763,\n  \"graphTooltip\": 1,\n  \"id\": 15,\n  \"links\": [\n    {\n      \"asDropdown\": false,\n      \"icon\": \"cloud\",\n      \"includeVars\": false,\n      \"keepTime\": false,\n      \"tags\": [],\n      \"targetBlank\": true,\n      \"title\": \"ApeCloud\",\n      \"tooltip\": \"Improved productivity, cost-efficiency and business continuity.\",\n      \"type\": \"link\",\n      \"url\": \"https://kubeblocks.io/\"\n    },\n    {\n      \"asDropdown\": false,\n      \"icon\": \"cloud\",\n      \"includeVars\": false,\n      \"keepTime\": false,\n      \"tags\": [],\n      \"targetBlank\": true,\n      \"title\": \"KubeBlocks\",\n      \"tooltip\": \"An open-source and cloud-neutral DBaaS with Kubernetes.\",\n      \"type\": \"link\",\n      \"url\": \"https://github.com/apecloud/kubeblocks\"\n    }\n  ],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 32,\n      \"panels\": [],\n      \"title\": \"Summary\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 40,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"count(sum by(namespace)(redis_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})) or vector(0)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"__auto\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total Namespaces\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"filterable\": false,\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"instances\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"lcd-gauge\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 5,\n        \"x\": 3,\n        \"y\": 1\n      },\n      \"id\": 44,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"count by(redis_version)(redis_instance_info{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{short_version}}\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Cluster Versions\",\n      \"transformations\": [\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"Value\": false\n            },\n            \"indexByName\": {},\n            \"renameByName\": {\n              \"Value\": \"instances\",\n              \"pod\": \"instance\",\n              \"short_version\": \"version\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"filterable\": false,\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"instance\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"links\",\n                \"value\": [\n                  {\n                    \"targetBlank\": true,\n                    \"title\": \"PostgreSQL Instance: ${__data.fields.cluster} | ${__data.fields.instance}\",\n                    \"url\": \"/d/pMEd7m0Mz/cadvisor-exporter?orgId=1&var-node=All&var-namespace=${__data.fields.namespace}﻿&var-pod=﻿${__data.fields.instance}﻿&var-container=All\"\n                  }\n                ]\n              },\n              {\n                \"id\": \"custom.align\",\n                \"value\": \"center\"\n              },\n              {\n                \"id\": \"custom.filterable\",\n                \"value\": true\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"uptime\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"dark-red\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"dark-yellow\",\n                      \"value\": 60\n                    },\n                    {\n                      \"color\": \"dark-green\",\n                      \"value\": 120\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"lcd-gauge\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"namespace\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.filterable\",\n                \"value\": true\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"cluster\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.filterable\",\n                \"value\": true\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 16,\n        \"x\": 8,\n        \"y\": 1\n      },\n      \"id\": 48,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"footer\": {\n          \"enablePagination\": false,\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": [\n          {\n            \"desc\": true,\n            \"displayName\": \"uptime\"\n          }\n        ]\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"sum by(namespace,app_kubernetes_io_instance,node,pod) (redis_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"__auto\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 20\n        },\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"exemplar\": false,\n          \"expr\": \"avg by(namespace,app_kubernetes_io_instance,pod) (redis_uptime_in_seconds{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"__auto\",\n          \"metric\": \"\",\n          \"range\": false,\n          \"refId\": \"B\",\n          \"step\": 20\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"count by(pod,redis_version)(redis_instance_info{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})\",\n          \"hide\": false,\n          \"legendFormat\": \"__auto\",\n          \"range\": true,\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Cluster Instances\",\n      \"transformations\": [\n        {\n          \"disabled\": true,\n          \"id\": \"joinByField\",\n          \"options\": {\n            \"byField\": \"pod\",\n            \"mode\": \"outer\"\n          }\n        },\n        {\n          \"id\": \"joinByField\",\n          \"options\": {\n            \"byField\": \"pod\",\n            \"mode\": \"outer\"\n          }\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time 1\": true,\n              \"Time 2\": true,\n              \"Value #A\": true,\n              \"app_kubernetes_io_instance 2\": true,\n              \"namespace 2\": true\n            },\n            \"indexByName\": {\n              \"Time 1\": 4,\n              \"Time 2\": 6,\n              \"Value #A\": 5,\n              \"Value #B\": 9,\n              \"app_kubernetes_io_instance 1\": 1,\n              \"app_kubernetes_io_instance 2\": 7,\n              \"namespace 1\": 0,\n              \"namespace 2\": 8,\n              \"node\": 3,\n              \"pod\": 2\n            },\n            \"renameByName\": {\n              \"Value #B\": \"uptime\",\n              \"app_kubernetes_io_instance 1\": \"cluster\",\n              \"namespace 1\": \"namespace\",\n              \"pod\": \"instance\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 5\n      },\n      \"id\": 42,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"count(sum by(namespace,app_kubernetes_io_instance)(redis_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})) or vector(0)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{label_name}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total Clusters\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 0,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"dark-green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 5,\n        \"x\": 3,\n        \"y\": 5\n      },\n      \"id\": 50,\n      \"interval\": \"\",\n      \"links\": [],\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"fieldOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ]\n        },\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"10m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"count(sum by(namespace,pod)(redis_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})) or vector(0)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{label_name}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Total Instances\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"filterable\": false,\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/.*%/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"percent\"\n              },\n              {\n                \"id\": \"min\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"max\",\n                \"value\": 100\n              },\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"mode\": \"continuous-GrYlRd\"\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"gradient-gauge\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Memory %\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 150\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Connections\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 147\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 1000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 2000\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Commands / s\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 178\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 4000\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Uptime / h\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              },\n              {\n                \"id\": \"custom.width\",\n                \"value\": 89\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Hits Ratio %\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 142\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"percentunit\"\n              },\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"mode\": \"continuous-RdYlGr\"\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"gradient-gauge\"\n              },\n              {\n                \"id\": \"max\",\n                \"value\": 1\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Keys\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 94\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Net Input\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 101\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"binBps\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 10000000\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Net Output\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 103\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"binBps\"\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 10000000\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 54,\n      \"options\": {\n        \"footer\": {\n          \"fields\": [\n            \"Value #B\",\n            \"Value #C\",\n            \"Value #L\",\n            \"Value #H\",\n            \"Value #I\",\n            \"Value #M\",\n            \"Value #N\",\n            \"Value #J\",\n            \"Value #K\"\n          ],\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": []\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"redis_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"redis_mem_util * on (iid) group_right redis_up or (100 * (redis_memory_used_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} / redis_memory_max_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}))\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Top5 Memory Usage\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"Value\": true,\n              \"Value #A\": true,\n              \"Value #F\": true,\n              \"__name__\": true,\n              \"account\": true,\n              \"app_kubernetes_io_component\": true,\n              \"app_kubernetes_io_component_name\": true,\n              \"app_kubernetes_io_managed_by\": true,\n              \"app_kubernetes_io_name\": true,\n              \"apps_kubeblocks_io_component_name\": true,\n              \"group\": true,\n              \"iaccount\": true,\n              \"igroup\": true,\n              \"iname\": true,\n              \"instance\": true,\n              \"job\": true,\n              \"namespace\": true,\n              \"node\": true,\n              \"origin_prometheus\": true,\n              \"pod\": false,\n              \"region\": true,\n              \"service\": true,\n              \"vendor\": true\n            },\n            \"indexByName\": {\n              \"Time\": 2,\n              \"Value #A\": 7,\n              \"Value #C\": 4,\n              \"__name__\": 3,\n              \"app_kubernetes_io_component\": 13,\n              \"app_kubernetes_io_instance\": 0,\n              \"app_kubernetes_io_managed_by\": 8,\n              \"app_kubernetes_io_name\": 9,\n              \"apps_kubeblocks_io_component_name\": 14,\n              \"instance\": 5,\n              \"job\": 6,\n              \"namespace\": 10,\n              \"node\": 11,\n              \"pod\": 1,\n              \"service\": 12\n            },\n            \"renameByName\": {\n              \"Time\": \"\",\n              \"Value #B\": \"CPU%\",\n              \"Value #C\": \"Memory %\",\n              \"Value #D\": \"Connections\",\n              \"Value #E\": \"Total Commands / s\",\n              \"Value #F\": \"Uptime / h\",\n              \"Value #G\": \"Hits Ratio %\",\n              \"Value #H\": \"Total Keys\",\n              \"Value #I\": \"Net Input\",\n              \"Value #J\": \"Net Output\",\n              \"Value #K\": \"IOPS\",\n              \"__name__\": \"\",\n              \"app_kubernetes_io_instance\": \"Cluster\",\n              \"app_kubernetes_io_name\": \"\",\n              \"instance\": \"\",\n              \"node\": \"node\",\n              \"pod\": \"instance\",\n              \"service\": \"\"\n            }\n          }\n        },\n        {\n          \"id\": \"groupBy\",\n          \"options\": {\n            \"fields\": {\n              \"Cluster\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              },\n              \"Memory %\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              },\n              \"instance\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              }\n            }\n          }\n        },\n        {\n          \"id\": \"sortBy\",\n          \"options\": {\n            \"fields\": {},\n            \"sort\": [\n              {\n                \"desc\": true,\n                \"field\": \"Memory %\"\n              }\n            ]\n          }\n        },\n        {\n          \"id\": \"limit\",\n          \"options\": {\n            \"limitField\": 5\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"filterable\": false,\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/.*%/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"percent\"\n              },\n              {\n                \"id\": \"min\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"max\",\n                \"value\": 100\n              },\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"mode\": \"continuous-GrYlRd\"\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"gradient-gauge\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Memory %\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 150\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Connections\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 147\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 1000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 2000\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Commands / s\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 178\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 4000\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Uptime / h\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              },\n              {\n                \"id\": \"custom.width\",\n                \"value\": 89\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Hits Ratio %\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 142\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"percentunit\"\n              },\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"mode\": \"continuous-RdYlGr\"\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"gradient-gauge\"\n              },\n              {\n                \"id\": \"max\",\n                \"value\": 1\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Keys\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 94\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Net Input\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 101\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"binBps\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 10000000\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Net Output\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 103\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"binBps\"\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 10000000\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 9\n      },\n      \"id\": 56,\n      \"options\": {\n        \"footer\": {\n          \"fields\": [\n            \"Value #B\",\n            \"Value #C\",\n            \"Value #L\",\n            \"Value #H\",\n            \"Value #I\",\n            \"Value #M\",\n            \"Value #N\",\n            \"Value #J\",\n            \"Value #K\"\n          ],\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": []\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"redis_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"rate(redis_cpu_user_seconds_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[2m]) * 100\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Top5 User CPU Usage\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"Value\": true,\n              \"Value #A\": true,\n              \"Value #F\": true,\n              \"__name__\": true,\n              \"account\": true,\n              \"app_kubernetes_io_component\": true,\n              \"app_kubernetes_io_component_name\": true,\n              \"app_kubernetes_io_managed_by\": true,\n              \"app_kubernetes_io_name\": true,\n              \"apps_kubeblocks_io_component_name\": true,\n              \"group\": true,\n              \"iaccount\": true,\n              \"igroup\": true,\n              \"iname\": true,\n              \"instance\": true,\n              \"job\": true,\n              \"namespace\": true,\n              \"node\": true,\n              \"origin_prometheus\": true,\n              \"pod\": false,\n              \"region\": true,\n              \"service\": true,\n              \"vendor\": true\n            },\n            \"indexByName\": {\n              \"Time\": 2,\n              \"Value #A\": 7,\n              \"Value #C\": 4,\n              \"__name__\": 3,\n              \"app_kubernetes_io_component\": 13,\n              \"app_kubernetes_io_instance\": 0,\n              \"app_kubernetes_io_managed_by\": 8,\n              \"app_kubernetes_io_name\": 9,\n              \"apps_kubeblocks_io_component_name\": 14,\n              \"instance\": 5,\n              \"job\": 6,\n              \"namespace\": 10,\n              \"node\": 11,\n              \"pod\": 1,\n              \"service\": 12\n            },\n            \"renameByName\": {\n              \"Time\": \"\",\n              \"Value #B\": \"CPU%\",\n              \"Value #C\": \"User CPU % \",\n              \"Value #D\": \"Connections\",\n              \"Value #E\": \"Total Commands / s\",\n              \"Value #F\": \"Uptime / h\",\n              \"Value #G\": \"Hits Ratio %\",\n              \"Value #H\": \"Total Keys\",\n              \"Value #I\": \"Net Input\",\n              \"Value #J\": \"Net Output\",\n              \"Value #K\": \"IOPS\",\n              \"__name__\": \"\",\n              \"app_kubernetes_io_instance\": \"Cluster\",\n              \"app_kubernetes_io_name\": \"\",\n              \"instance\": \"\",\n              \"node\": \"node\",\n              \"pod\": \"instance\",\n              \"service\": \"\"\n            }\n          }\n        },\n        {\n          \"id\": \"groupBy\",\n          \"options\": {\n            \"fields\": {\n              \"Cluster\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              },\n              \"Memory %\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              },\n              \"User CPU % \": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              },\n              \"instance\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              }\n            }\n          }\n        },\n        {\n          \"id\": \"sortBy\",\n          \"options\": {\n            \"fields\": {},\n            \"sort\": [\n              {\n                \"desc\": true,\n                \"field\": \"User CPU % \"\n              }\n            ]\n          }\n        },\n        {\n          \"id\": \"limit\",\n          \"options\": {\n            \"limitField\": 5\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"filterable\": false,\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/.*%/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"percent\"\n              },\n              {\n                \"id\": \"min\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"max\",\n                \"value\": 100\n              },\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"mode\": \"continuous-GrYlRd\"\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"gradient-gauge\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Memory %\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 150\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Connections\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 147\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 1000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 2000\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Commands / s\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 178\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 4000\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Uptime / h\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              },\n              {\n                \"id\": \"custom.width\",\n                \"value\": 89\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Hits Ratio %\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 142\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"percentunit\"\n              },\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"mode\": \"continuous-RdYlGr\"\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"gradient-gauge\"\n              },\n              {\n                \"id\": \"max\",\n                \"value\": 1\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Keys\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 94\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Net Input\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 101\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"binBps\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 10000000\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Net Output\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 103\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"binBps\"\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 10000000\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 9\n      },\n      \"id\": 58,\n      \"options\": {\n        \"footer\": {\n          \"fields\": [\n            \"Value #B\",\n            \"Value #C\",\n            \"Value #L\",\n            \"Value #H\",\n            \"Value #I\",\n            \"Value #M\",\n            \"Value #N\",\n            \"Value #J\",\n            \"Value #K\"\n          ],\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": []\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"redis_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"avg(irate(redis_keyspace_hits_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[2m]) / (irate(redis_keyspace_misses_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[1m]) + irate(redis_keyspace_hits_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[2m])))  by (instance)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Bottom5 Hits Ratio\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"Value\": true,\n              \"Value #A\": true,\n              \"Value #F\": true,\n              \"__name__\": true,\n              \"account\": true,\n              \"app_kubernetes_io_component\": true,\n              \"app_kubernetes_io_component_name\": true,\n              \"app_kubernetes_io_managed_by\": true,\n              \"app_kubernetes_io_name\": true,\n              \"apps_kubeblocks_io_component_name\": true,\n              \"group\": true,\n              \"iaccount\": true,\n              \"igroup\": true,\n              \"iname\": true,\n              \"instance\": true,\n              \"job\": true,\n              \"namespace\": true,\n              \"node\": true,\n              \"origin_prometheus\": true,\n              \"pod\": false,\n              \"region\": true,\n              \"service\": true,\n              \"vendor\": true\n            },\n            \"indexByName\": {\n              \"Time\": 2,\n              \"Value #A\": 7,\n              \"Value #C\": 4,\n              \"__name__\": 3,\n              \"app_kubernetes_io_component\": 13,\n              \"app_kubernetes_io_instance\": 0,\n              \"app_kubernetes_io_managed_by\": 8,\n              \"app_kubernetes_io_name\": 9,\n              \"apps_kubeblocks_io_component_name\": 14,\n              \"instance\": 5,\n              \"job\": 6,\n              \"namespace\": 10,\n              \"node\": 11,\n              \"pod\": 1,\n              \"service\": 12\n            },\n            \"renameByName\": {\n              \"Time\": \"\",\n              \"Value #B\": \"CPU%\",\n              \"Value #C\": \"Hits Ratio %\",\n              \"Value #D\": \"Connections\",\n              \"Value #E\": \"Total Commands / s\",\n              \"Value #F\": \"Uptime / h\",\n              \"Value #G\": \"Hits Ratio %\",\n              \"Value #H\": \"Total Keys\",\n              \"Value #I\": \"Net Input\",\n              \"Value #J\": \"Net Output\",\n              \"Value #K\": \"IOPS\",\n              \"__name__\": \"\",\n              \"app_kubernetes_io_instance\": \"Cluster\",\n              \"app_kubernetes_io_name\": \"\",\n              \"instance\": \"\",\n              \"node\": \"node\",\n              \"pod\": \"instance\",\n              \"service\": \"\"\n            }\n          }\n        },\n        {\n          \"id\": \"groupBy\",\n          \"options\": {\n            \"fields\": {\n              \"Cluster\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              },\n              \"Hit Ratio %\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              },\n              \"Hits Ratio %\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              },\n              \"Memory %\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              },\n              \"instance\": {\n                \"aggregations\": [],\n                \"operation\": \"groupby\"\n              }\n            }\n          }\n        },\n        {\n          \"id\": \"sortBy\",\n          \"options\": {\n            \"fields\": {},\n            \"sort\": [\n              {\n                \"desc\": false,\n                \"field\": \"Hits Ratio %\"\n              }\n            ]\n          }\n        },\n        {\n          \"id\": \"limit\",\n          \"options\": {\n            \"limitField\": 5\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {\n            \"align\": \"center\",\n            \"displayMode\": \"auto\",\n            \"filterable\": false,\n            \"inspect\": false\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/.*%/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"percent\"\n              },\n              {\n                \"id\": \"min\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"max\",\n                \"value\": 100\n              },\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"mode\": \"continuous-GrYlRd\"\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"gradient-gauge\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Memory %\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 150\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Connections\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 147\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 1000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 2000\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Commands / s\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 178\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 4000\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Uptime / h\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"s\"\n              },\n              {\n                \"id\": \"custom.width\",\n                \"value\": 89\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Hits Ratio %\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 126\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"percentunit\"\n              },\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"mode\": \"continuous-RdYlGr\"\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"gradient-gauge\"\n              },\n              {\n                \"id\": \"max\",\n                \"value\": 1\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Keys\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 315\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Net Input\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 259\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"binBps\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 10000000\n                    }\n                  ]\n                }\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Net Output\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 274\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"binBps\"\n              },\n              {\n                \"id\": \"custom.displayMode\",\n                \"value\": \"color-background\"\n              },\n              {\n                \"id\": \"thresholds\",\n                \"value\": {\n                  \"mode\": \"absolute\",\n                  \"steps\": [\n                    {\n                      \"color\": \"green\",\n                      \"value\": null\n                    },\n                    {\n                      \"color\": \"#EAB839\",\n                      \"value\": 3000000\n                    },\n                    {\n                      \"color\": \"red\",\n                      \"value\": 10000000\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"instance\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.width\",\n                \"value\": 248\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 36,\n      \"options\": {\n        \"footer\": {\n          \"fields\": [\n            \"Value #B\",\n            \"Value #C\",\n            \"Value #L\",\n            \"Value #H\",\n            \"Value #I\",\n            \"Value #M\",\n            \"Value #N\",\n            \"Value #J\",\n            \"Value #K\"\n          ],\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true,\n        \"sortBy\": []\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"redis_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"redis_cpu_util * on (iid) group_right redis_up{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"redis_mem_util * on (iid) group_right redis_up or (100 * (redis_memory_used_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} / redis_memory_max_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}))\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum(redis_connected_clients{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})by(instance)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"D\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum(irate(redis_commands_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} [2m])) by(namespace, app_kubernetes_io_instance, pod)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"E\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"redis_uptime_in_seconds{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} / 3600 - 0\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"F\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"avg(irate(redis_keyspace_hits_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[2m]) / (irate(redis_keyspace_misses_total[1m]) + irate(redis_keyspace_hits_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[2m]))) by (instance)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"G\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum (redis_db_keys{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (instance)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"H\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum(irate(redis_net_input_bytes_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[2m])) by (instance)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"I\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum(irate(redis_net_output_bytes_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[2m])) by (instance)\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"__auto\",\n          \"refId\": \"J\"\n        }\n      ],\n      \"title\": \"Resource Overview\",\n      \"transformations\": [\n        {\n          \"id\": \"merge\",\n          \"options\": {}\n        },\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {\n              \"Time\": true,\n              \"Value\": true,\n              \"Value #A\": true,\n              \"Value #C\": true,\n              \"Value #F\": true,\n              \"Value #G\": true,\n              \"__name__\": true,\n              \"account\": true,\n              \"app_kubernetes_io_component\": true,\n              \"app_kubernetes_io_component_name\": true,\n              \"app_kubernetes_io_instance\": true,\n              \"app_kubernetes_io_managed_by\": true,\n              \"app_kubernetes_io_name\": true,\n              \"apps_kubeblocks_io_component_name\": true,\n              \"group\": true,\n              \"iaccount\": true,\n              \"igroup\": true,\n              \"iname\": true,\n              \"instance\": true,\n              \"job\": true,\n              \"namespace\": true,\n              \"node\": true,\n              \"origin_prometheus\": true,\n              \"pod\": false,\n              \"region\": true,\n              \"service\": true,\n              \"vendor\": true\n            },\n            \"indexByName\": {\n              \"Time\": 2,\n              \"Value #A\": 14,\n              \"Value #C\": 4,\n              \"Value #D\": 6,\n              \"Value #E\": 7,\n              \"Value #F\": 12,\n              \"Value #G\": 5,\n              \"Value #H\": 10,\n              \"Value #I\": 8,\n              \"Value #J\": 9,\n              \"Value #K\": 22,\n              \"__name__\": 3,\n              \"app_kubernetes_io_component\": 20,\n              \"app_kubernetes_io_instance\": 1,\n              \"app_kubernetes_io_managed_by\": 15,\n              \"app_kubernetes_io_name\": 16,\n              \"apps_kubeblocks_io_component_name\": 21,\n              \"instance\": 11,\n              \"job\": 13,\n              \"namespace\": 17,\n              \"node\": 18,\n              \"pod\": 0,\n              \"service\": 19\n            },\n            \"renameByName\": {\n              \"Time\": \"\",\n              \"Value #B\": \"CPU%\",\n              \"Value #C\": \"Memory %\",\n              \"Value #D\": \"Connections\",\n              \"Value #E\": \"Total Commands / s\",\n              \"Value #F\": \"Uptime / h\",\n              \"Value #G\": \"Hits Ratio %\",\n              \"Value #H\": \"Total Keys\",\n              \"Value #I\": \"Net Input\",\n              \"Value #J\": \"Net Output\",\n              \"Value #K\": \"IOPS\",\n              \"__name__\": \"\",\n              \"app_kubernetes_io_instance\": \"Cluster\",\n              \"app_kubernetes_io_name\": \"\",\n              \"instance\": \"\",\n              \"node\": \"node\",\n              \"pod\": \"instance\",\n              \"service\": \"\"\n            }\n          }\n        }\n      ],\n      \"type\": \"table\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"id\": 26,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Connection And CPU\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Sum taken across instances\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 25\n      },\n      \"id\": 16,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"redis_config_maxclients{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"hide\": true,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | maxclients\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"redis_connected_clients{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} |  connected_clients\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"redis_blocked_clients{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | blocked_clients\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Current Connections\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 25\n      },\n      \"id\": 60,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod) (redis_connected_clients{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) / on(namespace,app_kubernetes_io_instance,pod) redis_config_maxclients{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Used Connections Ratio\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Sum taken across instances\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 25\n      },\n      \"id\": 68,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(redis_cpu_user_seconds_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[2m]) * 100\",\n          \"hide\": false,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | cpu_user\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(redis_cpu_sys_seconds_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[2m]) * 100\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} |  cpu_sys\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CPU Average Ratio\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 32\n      },\n      \"id\": 22,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Memory And Keys\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Total taken across instances\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"max\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#BF1B00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/max/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#E02F44\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.lineWidth\",\n                \"value\": 1\n              },\n              {\n                \"id\": \"custom.lineStyle\",\n                \"value\": {\n                  \"dash\": [\n                    10,\n                    10\n                  ],\n                  \"fill\": \"dash\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 33\n      },\n      \"id\": 7,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(redis_memory_used_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace, app_kubernetes_io_instance, pod)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | Used Memory\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240,\n          \"target\": \"\"\n        },\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(redis_memory_max_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace, app_kubernetes_io_instance, pod)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | MaxMemory\",\n          \"range\": true,\n          \"refId\": \"B\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(redis_memory_used_rss_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace, app_kubernetes_io_instance, pod)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} |  Used RSS Memory\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(redis_memory_used_lua_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace, app_kubernetes_io_instance, pod)\",\n          \"hide\": false,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} |  Used Memory Lua\",\n          \"range\": true,\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Total Memory Usage\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 20,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 2,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 33\n      },\n      \"id\": 64,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\",\n            \"min\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"calculatedInterval\": \"2m\",\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"datasourceErrors\": {},\n          \"editorMode\": \"code\",\n          \"errors\": {},\n          \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod) (redis_memory_used_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) / on(namespace,app_kubernetes_io_instance,pod) redis_memory_max_bytes{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"title\": \"Memory Usage Ratio\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Recommend restart redis\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/restart/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#E02F44\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.lineWidth\",\n                \"value\": 1\n              },\n              {\n                \"id\": \"custom.lineStyle\",\n                \"value\": {\n                  \"dash\": [\n                    10,\n                    10\n                  ],\n                  \"fill\": \"dash\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 33\n      },\n      \"id\": 10,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"redis_mem_fragmentation_ratio{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"range\": true,\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Memory fragmentation ratio per instance\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Sum taken across instances\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 40\n      },\n      \"id\": 13,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod) (redis_db_keys{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) - sum by(namespace,app_kubernetes_io_instance,pod) (redis_db_keys_expiring{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) \",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | Not-Expiring\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240,\n          \"target\": \"\"\n        },\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod) (redis_db_keys_expiring{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | Expiring\",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"B\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum by(namespace,app_kubernetes_io_instance,pod) (redis_evicted_keys_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"})\",\n          \"hide\": false,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | Evicted\",\n          \"range\": true,\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Expiring / Not-Expiring / Evicted Keys\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Evictions\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"evicts\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#890F02\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"memcached_items_evicted_total{instance=\\\"172.17.0.1:9150\\\",job=\\\"prometheus\\\"}\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#890F02\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"reclaims\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#3F6833\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"{container=\\\"redis-exporter\\\", instance=\\\"redis-86cb5d76d7-fcdln:redis-exporter:redis-metrics\\\", job=\\\"default/redis\\\", namespace=\\\"default\\\", pod=\\\"redis-86cb5d76d7-fcdln\\\"}\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"{instance=\\\"redis-86cb5d76d7-fcdln:redis-exporter:redis-metrics\\\"}\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 40\n      },\n      \"id\": 8,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"irate(redis_evicted_keys_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}\",\n          \"range\": true,\n          \"refId\": \"B\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Key evictions per second per instance\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Sum taken across instances\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"db1\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"yellow\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 40\n      },\n      \"id\": 5,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"asc\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum (redis_db_keys{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace,app_kubernetes_io_instance,pod,db)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{ db }}\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240,\n          \"target\": \"\"\n        }\n      ],\n      \"title\": \"Total Items per DB\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Average taken across instances\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 16,\n        \"x\": 0,\n        \"y\": 47\n      },\n      \"id\": 18,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"desc\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(irate(redis_commands_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"} [$__rate_interval])) by (namespace,app_kubernetes_io_instance,pod,cmd)\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{cmd}}\",\n          \"metric\": \"redis_command_calls_total\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Commands per second\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 54\n      },\n      \"id\": 24,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Performance\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Average taken across instances\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 55\n      },\n      \"id\": 20,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"desc\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"avg(irate(redis_commands_duration_seconds_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace, app_kubernetes_io_instance, pod, cmd)\\n  /\\navg(irate(redis_commands_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace, app_kubernetes_io_instance, pod, cmd)\\n\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} | {{ cmd }}\",\n          \"metric\": \"redis_command_calls_total\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Command latency per second\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"Hit rate shows the percentage of key space lookups that hit a key.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Hit ratio\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"blue\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/Target/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#56A64B\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.lineWidth\",\n                \"value\": 1\n              },\n              {\n                \"id\": \"custom.lineStyle\",\n                \"value\": {\n                  \"dash\": [\n                    10,\n                    10\n                  ],\n                  \"fill\": \"dash\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 55\n      },\n      \"id\": 1,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"avg(irate(redis_keyspace_hits_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval]) / (irate(redis_keyspace_misses_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval]) + irate(redis_keyspace_hits_total{pod=~\\\"$instance\\\"}[$__rate_interval]))) by (namespace, app_kubernetes_io_instance, pod)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} \",\n          \"metric\": \"\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240,\n          \"target\": \"\"\n        }\n      ],\n      \"title\": \"Hit ratio per instance\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 62\n      },\n      \"id\": 38,\n      \"links\": [],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\",\n            \"max\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"desc\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(irate(redis_commands_duration_seconds_total{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}[$__rate_interval])) by (namespace, app_kubernetes_io_instance, pod, cmd) != 0\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}}  | {{ cmd }}\",\n          \"metric\": \"redis_command_calls_total\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Total Time Spent by Command / sec\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 69\n      },\n      \"id\": 62,\n      \"panels\": [],\n      \"title\": \"Replication\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"This metric will only be non-zero if the instance is a master\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 70\n      },\n      \"id\": 70,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(redis_connected_slaves{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}) by (namespace, app_kubernetes_io_instance, pod)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} \",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Connected slaves by instance\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"This metric will only be non-zero if the instance is a master\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 70\n      },\n      \"id\": 28,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"redis_slave_repl_offset{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} \",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Slave Repl Offset\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"$datasource\"\n      },\n      \"description\": \"This metric is only exported if the instance is a slave.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 70\n      },\n      \"id\": 30,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.4\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"$datasource\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"redis_master_last_io_seconds_ago{namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\",pod=~\\\"$instance\\\",job=\\\"$job\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{namespace}} | {{app_kubernetes_io_instance}} | {{pod}} \",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Time since last master connection\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": false,\n  \"schemaVersion\": 37,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"prometheus\",\n    \"redis\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"default\",\n          \"value\": \"default\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"data source\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": false,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(redis_up{job=\\\"$job\\\"}, namespace)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"namespace\",\n        \"multi\": true,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(redis_up{job=\\\"$job\\\"}, namespace)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 5,\n        \"type\": \"query\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": false,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(redis_up{job=\\\"$job\\\"}, app_kubernetes_io_instance)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"cluster\",\n        \"multi\": true,\n        \"name\": \"cluster\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(redis_up{job=\\\"$job\\\"}, app_kubernetes_io_instance)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 5,\n        \"type\": \"query\"\n      },\n      {\n        \"allValue\": \".+\",\n        \"current\": {\n          \"selected\": false,\n          \"text\": [\n            \"All\"\n          ],\n          \"value\": [\n            \"$__all\"\n          ]\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"$datasource\"\n        },\n        \"definition\": \"label_values(redis_up{job=\\\"$job\\\",namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\"}, pod)\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"instance\",\n        \"multi\": true,\n        \"name\": \"instance\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(redis_up{job=\\\"$job\\\",namespace=~\\\"$namespace\\\",app_kubernetes_io_instance=~\\\"$cluster\\\"}, pod)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 5,\n        \"type\": \"query\"\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"oteld-app-metrics\",\n          \"value\": \"oteld-app-metrics\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"job\",\n        \"multi\": false,\n        \"name\": \"job\",\n        \"options\": [\n          {\n            \"selected\": true,\n            \"text\": \"oteld-app-metrics\",\n            \"value\": \"oteld-app-metrics\"\n          }\n        ],\n        \"query\": \"oteld-app-metrics\",\n        \"queryValue\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"custom\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-30m\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"Redis\",\n  \"uid\": \"redis\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "roles/cluster-addon/templates/local-storage/local-path-storage.yaml.j2",
    "content": "---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: local-path-provisioner-service-account\n  namespace: kube-system\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n  name: local-path-provisioner-role\n  namespace: kube-system\nrules:\n  - apiGroups: [\"\"]\n    resources: [\"pods\"]\n    verbs: [\"get\", \"list\", \"watch\", \"create\", \"patch\", \"update\", \"delete\"]\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: local-path-provisioner-role\nrules:\n  - apiGroups: [\"\"]\n    resources: [\"nodes\", \"persistentvolumeclaims\", \"configmaps\", \"pods\", \"pods/log\"]\n    verbs: [\"get\", \"list\", \"watch\"]\n  - apiGroups: [\"\"]\n    resources: [\"persistentvolumes\"]\n    verbs: [\"get\", \"list\", \"watch\", \"create\", \"patch\", \"update\", \"delete\"]\n  - apiGroups: [\"\"]\n    resources: [\"events\"]\n    verbs: [\"create\", \"patch\"]\n  - apiGroups: [\"storage.k8s.io\"]\n    resources: [\"storageclasses\"]\n    verbs: [\"get\", \"list\", \"watch\"]\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  name: local-path-provisioner-bind\n  namespace: kube-system\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: Role\n  name: local-path-provisioner-role\nsubjects:\n  - kind: ServiceAccount\n    name: local-path-provisioner-service-account\n    namespace: kube-system\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: local-path-provisioner-bind\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: local-path-provisioner-role\nsubjects:\n  - kind: ServiceAccount\n    name: local-path-provisioner-service-account\n    namespace: kube-system\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: local-path-provisioner\n  namespace: kube-system\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: local-path-provisioner\n  template:\n    metadata:\n      labels:\n        app: local-path-provisioner\n    spec:\n      serviceAccountName: local-path-provisioner-service-account\n      containers:\n        - name: local-path-provisioner\n          image: easzlab.io.local:5000/rancher/local-path-provisioner:{{ local_path_provisioner_ver }}\n          imagePullPolicy: IfNotPresent\n          command:\n            - local-path-provisioner\n            - --debug\n            - start\n            - --config\n            - /etc/config/config.json\n          volumeMounts:\n            - name: config-volume\n              mountPath: /etc/config/\n          env:\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: CONFIG_MOUNT_PATH\n              value: /etc/config/\n      volumes:\n        - name: config-volume\n          configMap:\n            name: local-path-config\n\n---\napiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: {{ local_path_storage_class }}\nprovisioner: rancher.io/local-path\nvolumeBindingMode: WaitForFirstConsumer\nreclaimPolicy: Delete\n\n---\nkind: ConfigMap\napiVersion: v1\nmetadata:\n  name: local-path-config\n  namespace: kube-system\ndata:\n  config.json: |-\n    {\n            \"nodePathMap\":[\n            {\n                    \"node\":\"DEFAULT_PATH_FOR_NON_LISTED_NODES\",\n                    \"paths\":[\"{{ local_path_provisioner_dir }}\"]\n            }\n            ]\n    }\n  setup: |-\n    #!/bin/sh\n    set -eu\n    mkdir -m 0777 -p \"$VOL_DIR\"\n  teardown: |-\n    #!/bin/sh\n    set -eu\n    rm -rf \"$VOL_DIR\"\n  helperPod.yaml: |-\n    apiVersion: v1\n    kind: Pod\n    metadata:\n      name: helper-pod\n    spec:\n      priorityClassName: system-node-critical\n      tolerations:\n        - key: node.kubernetes.io/disk-pressure\n          operator: Exists\n          effect: NoSchedule\n      containers:\n      - name: helper-pod\n        image: easzlab.io.local:5000/rancher/local-path-provisioner:{{ local_path_provisioner_ver }}\n        imagePullPolicy: IfNotPresent\n"
  },
  {
    "path": "roles/cluster-addon/templates/local-storage/test-pod.yaml.j2",
    "content": "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: local-path-pvc\nspec:\n  accessModes:\n    - ReadWriteOnce\n  storageClassName: local-path\n  resources:\n    requests:\n      storage: 128Mi\n\n---\napiVersion: v1\nkind: Pod\nmetadata:\n  name: volume-test\nspec:\n  containers:\n  - name: volume-test\n    image: nginx:stable-alpine\n    imagePullPolicy: IfNotPresent\n    volumeMounts:\n    - name: volv\n      mountPath: /data\n    ports:\n    - containerPort: 80\n  volumes:\n  - name: volv\n    persistentVolumeClaim:\n      claimName: local-path-pvc\n"
  },
  {
    "path": "roles/cluster-addon/templates/metrics-server/components.yaml.j2",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    k8s-app: metrics-server\n  name: metrics-server\n  namespace: kube-system\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  labels:\n    k8s-app: metrics-server\n    rbac.authorization.k8s.io/aggregate-to-admin: \"true\"\n    rbac.authorization.k8s.io/aggregate-to-edit: \"true\"\n    rbac.authorization.k8s.io/aggregate-to-view: \"true\"\n  name: system:aggregated-metrics-reader\nrules:\n- apiGroups:\n  - metrics.k8s.io\n  resources:\n  - pods\n  - nodes\n  verbs:\n  - get\n  - list\n  - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  labels:\n    k8s-app: metrics-server\n  name: system:metrics-server\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - nodes/metrics\n  verbs:\n  - get\n- apiGroups:\n  - \"\"\n  resources:\n  - pods\n  - nodes\n  verbs:\n  - get\n  - list\n  - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n  labels:\n    k8s-app: metrics-server\n  name: metrics-server-auth-reader\n  namespace: kube-system\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: Role\n  name: extension-apiserver-authentication-reader\nsubjects:\n- kind: ServiceAccount\n  name: metrics-server\n  namespace: kube-system\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  labels:\n    k8s-app: metrics-server\n  name: metrics-server:system:auth-delegator\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: system:auth-delegator\nsubjects:\n- kind: ServiceAccount\n  name: metrics-server\n  namespace: kube-system\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  labels:\n    k8s-app: metrics-server\n  name: system:metrics-server\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: system:metrics-server\nsubjects:\n- kind: ServiceAccount\n  name: metrics-server\n  namespace: kube-system\n---\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    k8s-app: metrics-server\n  name: metrics-server\n  namespace: kube-system\nspec:\n  ports:\n  - name: https\n    port: 443\n    protocol: TCP\n    targetPort: https\n  selector:\n    k8s-app: metrics-server\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    k8s-app: metrics-server\n  name: metrics-server\n  namespace: kube-system\nspec:\n  selector:\n    matchLabels:\n      k8s-app: metrics-server\n  strategy:\n    rollingUpdate:\n      maxUnavailable: 0\n  template:\n    metadata:\n      labels:\n        k8s-app: metrics-server\n    spec:\n      containers:\n      - args:\n        - --cert-dir=/tmp\n        - --secure-port=10250\n        - --kubelet-insecure-tls\n        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname\n        - --kubelet-use-node-status-port\n        - --metric-resolution=15s\n        #image: registry.k8s.io/metrics-server/metrics-server:v0.6.3\n        image: easzlab.io.local:5000/easzlab/metrics-server:{{ metricsVer }}\n        imagePullPolicy: IfNotPresent\n        livenessProbe:\n          failureThreshold: 3\n          httpGet:\n            path: /livez\n            port: https\n            scheme: HTTPS\n          periodSeconds: 10\n        name: metrics-server\n        ports:\n        - containerPort: 10250\n          name: https\n          protocol: TCP\n        readinessProbe:\n          failureThreshold: 3\n          httpGet:\n            path: /readyz\n            port: https\n            scheme: HTTPS\n          initialDelaySeconds: 20\n          periodSeconds: 10\n        resources:\n          requests:\n            cpu: 100m\n            memory: 200Mi\n        securityContext:\n          allowPrivilegeEscalation: false\n          capabilities:\n            drop:\n            - ALL\n          readOnlyRootFilesystem: true\n          runAsNonRoot: true\n          runAsUser: 1000\n          seccompProfile:\n            type: RuntimeDefault\n        volumeMounts:\n        - mountPath: /tmp\n          name: tmp-dir\n      nodeSelector:\n        kubernetes.io/os: linux\n      priorityClassName: system-cluster-critical\n      serviceAccountName: metrics-server\n      volumes:\n      - emptyDir: {}\n        name: tmp-dir\n---\napiVersion: apiregistration.k8s.io/v1\nkind: APIService\nmetadata:\n  labels:\n    k8s-app: metrics-server\n  name: v1beta1.metrics.k8s.io\nspec:\n  group: metrics.k8s.io\n  groupPriorityMinimum: 100\n  insecureSkipTLSVerify: true\n  service:\n    name: metrics-server\n    namespace: kube-system\n  version: v1beta1\n  versionPriority: 100\n"
  },
  {
    "path": "roles/cluster-addon/templates/minio/minio.default.j2",
    "content": "# MinIO Root Credentials\nMINIO_ROOT_USER=wx9aFJ4U29cwBa1KW2xow9z\nMINIO_ROOT_PASSWORD=sFdw9xOlb19e46dd3aea61ca94177xQ\n\n# Server URL (optional)\nMINIO_SERVER_URL=\"http://172.22.1.1:9000\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/minio/minio.service.j2",
    "content": "[Unit]\nDescription=MinIO\nDocumentation=https://min.io/docs/minio/linux/index.html\nWants=network-online.target\nAfter=network-online.target\nAssertFileIsExecutable=/usr/local/bin/minio\n\n[Service]\nWorkingDirectory=/usr/local/bin\nUser=minio-user\nGroup=minio-user\nEnvironmentFile=-/etc/default/minio\nExecStartPre=/bin/bash -c \"if [ -z \\\"${MINIO_ROOT_USER}\\\" ] || [ -z \\\"${MINIO_ROOT_PASSWORD}\\\" ]; then echo 'MinIO credentials not set in /etc/default/minio'; exit 1; fi\"\nExecStart=/usr/local/bin/minio server --console-address :9001 /data/minio/{1...4}\n\nRestart=always\nRestartSec=10\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/cluster-addon/templates/minio/operator-values.yaml.j2",
    "content": "operator:\n  # https://github.com/minio/operator/blob/master/docs/env-variables.md\n  env:\n    - name: OPERATOR_STS_ENABLED\n      value: \"on\"\n  image:\n    repository: easzlab.io.local:5000/minio/operator\n  sidecarImage:\n    repository: easzlab.io.local:5000/minio/operator-sidecar\n    tag: v7.0.1\n  replicaCount: 1\n  resources:\n    requests:\n      cpu: 200m\n      memory: 256Mi\n      ephemeral-storage: 500Mi\n    limits:\n      cpu: 500m\n      memory: 512Mi\n      ephemeral-storage: 500Mi\n"
  },
  {
    "path": "roles/cluster-addon/templates/minio/tenant-values.yaml.j2",
    "content": "tenant:\n  name: myminio\n  image:\n    repository: easzlab.io.local:5000/minio/minio\n  configSecret:\n    name: myminio-env-configuration\n    existingSecret: true\n\n  # https://min.io/docs/minio/kubernetes/upstream/reference/operator-crd.html#pool\n  pools:\n    # For standalone mode, supply 1. For distributed mode, supply 4 or more.\n    - servers: {{ minio_pool_servers }}\n      name: pool-0\n      volumesPerServer: 1\n      size: {{ minio_pool_size }}\n      storageClassName: \"{{ minio_storage_class }}\"\n      resources:\n        requests:\n          cpu: 500m\n          memory: 500Mi\n        limits:\n          cpu: 2000m\n          memory: 4000Mi\n  \n  # Configures a Prometheus-compatible scraping endpoint at the specified port.\n  metrics:\n    enabled: false\n    port: 9000\n    protocol: http\n  \n  # Configures external certificate settings for the Tenant.\n  certificate:\n{% if minio_tls_enabled|bool %}\n    requestAutoCert: true\n{% if minio_with_global_cert|bool %}\n    externalCertSecret:\n      - name: minio-global-cert\n{% endif %}\n{% else %}\n    requestAutoCert: false\n    externalCertSecret: [ ]\n{% endif %}\n  \n  # https://min.io/docs/minio/kubernetes/upstream/reference/operator-crd.html#features\n  features:\n    bucketDNS: false\n    domains: { }\n    enableSFTP: false\n\n  buckets:\n    - name: test-bucket\n      objectLock: false\n  ###\n  # Array of Kubernetes secrets from which the Operator generates MinIO users during tenant provisioning.\n  #\n  # Each secret should specify the ``CONSOLE_ACCESS_KEY`` and ``CONSOLE_SECRET_KEY`` as the access key and secret key for that user.\n  users: [ ]\n\n  liveness:\n    httpGet:\n      path: /minio/health/live\n      port: 9000\n      scheme: {% if minio_tls_enabled|bool %}HTTPS{% else %}HTTP{% endif %} \n    initialDelaySeconds: 30\n    periodSeconds: 30\n    timeoutSeconds: 10\n    successThreshold: 1\n    failureThreshold: 3\n\n  readiness:\n    httpGet:\n      path: /minio/health/ready\n      port: 9000\n      scheme: {% if minio_tls_enabled|bool %}HTTPS{% else %}HTTP{% endif %} \n    initialDelaySeconds: 30\n    periodSeconds: 15\n    timeoutSeconds: 10\n    successThreshold: 1\n    failureThreshold: 3\n\n  ###\n  podManagementPolicy: Parallel\n  exposeServices:\n    minio: true\n    console: true \n  ###\n  # Directs the Operator to add the Tenant's metric scrape configuration to an existing Kubernetes Prometheus deployment managed by the Prometheus Operator.\n  prometheusOperator: false\n\nextraResources:\n  - |\n    apiVersion: v1\n    kind: Secret\n    type: Opaque\n    metadata:\n      name: myminio-env-configuration\n      namespace: {{ minio_namespace }}\n    stringData:\n      config.env: |-\n        export MINIO_ROOT_USER={{ minio_root_user }}\n        export MINIO_ROOT_PASSWORD={{ minio_root_password }}\n        export MINIO_PROMETHEUS_URL=http://prometheus-kube-prometheus-prometheus.{{ prom_namespace }}.svc:9090\n        export MINIO_PROMETHEUS_AUTH_TYPE=public\n"
  },
  {
    "path": "roles/cluster-addon/templates/nacos/mysql-schema.sql",
    "content": "/*\n * Copyright 1999-2018 Alibaba Group Holding Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n/******************************************/\n/*   表名称 = config_info                  */\n/******************************************/\nCREATE TABLE `config_info` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `data_id` varchar(255) NOT NULL COMMENT 'data_id',\n  `group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',\n  `content` longtext NOT NULL COMMENT 'content',\n  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',\n  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',\n  `src_user` text COMMENT 'source user',\n  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',\n  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',\n  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',\n  `c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',\n  `c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',\n  `effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述',\n  `type` varchar(64) DEFAULT NULL COMMENT '配置的类型',\n  `c_schema` text COMMENT '配置的模式',\n  `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';\n\n/******************************************/\n/*   表名称 = config_info_aggr             */\n/******************************************/\nCREATE TABLE `config_info_aggr` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `data_id` varchar(255) NOT NULL COMMENT 'data_id',\n  `group_id` varchar(128) NOT NULL COMMENT 'group_id',\n  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',\n  `content` longtext NOT NULL COMMENT '内容',\n  `gmt_modified` datetime NOT NULL COMMENT '修改时间',\n  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',\n  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';\n\n\n/******************************************/\n/*   表名称 = config_info_beta             */\n/******************************************/\nCREATE TABLE `config_info_beta` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `data_id` varchar(255) NOT NULL COMMENT 'data_id',\n  `group_id` varchar(128) NOT NULL COMMENT 'group_id',\n  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',\n  `content` longtext NOT NULL COMMENT 'content',\n  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',\n  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',\n  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',\n  `src_user` text COMMENT 'source user',\n  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',\n  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',\n  `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';\n\n/******************************************/\n/*   表名称 = config_info_tag              */\n/******************************************/\nCREATE TABLE `config_info_tag` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `data_id` varchar(255) NOT NULL COMMENT 'data_id',\n  `group_id` varchar(128) NOT NULL COMMENT 'group_id',\n  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',\n  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',\n  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',\n  `content` longtext NOT NULL COMMENT 'content',\n  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',\n  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',\n  `src_user` text COMMENT 'source user',\n  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';\n\n/******************************************/\n/*   表名称 = config_tags_relation         */\n/******************************************/\nCREATE TABLE `config_tags_relation` (\n  `id` bigint(20) NOT NULL COMMENT 'id',\n  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',\n  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',\n  `data_id` varchar(255) NOT NULL COMMENT 'data_id',\n  `group_id` varchar(128) NOT NULL COMMENT 'group_id',\n  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',\n  `nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识',\n  PRIMARY KEY (`nid`),\n  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),\n  KEY `idx_tenant_id` (`tenant_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';\n\n/******************************************/\n/*   表名称 = group_capacity               */\n/******************************************/\nCREATE TABLE `group_capacity` (\n  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',\n  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID，空字符表示整个集群',\n  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额，0表示使用默认值',\n  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',\n  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限，单位为字节，0表示使用默认值',\n  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数，，0表示使用默认值',\n  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值',\n  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',\n  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_group_id` (`group_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';\n\n/******************************************/\n/*   表名称 = his_config_info              */\n/******************************************/\nCREATE TABLE `his_config_info` (\n  `id` bigint(20) unsigned NOT NULL COMMENT 'id',\n  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',\n  `data_id` varchar(255) NOT NULL COMMENT 'data_id',\n  `group_id` varchar(128) NOT NULL COMMENT 'group_id',\n  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',\n  `content` longtext NOT NULL COMMENT 'content',\n  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',\n  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',\n  `src_user` text COMMENT 'source user',\n  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',\n  `op_type` char(10) DEFAULT NULL COMMENT 'operation type',\n  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',\n   `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',\n  PRIMARY KEY (`nid`),\n  KEY `idx_gmt_create` (`gmt_create`),\n  KEY `idx_gmt_modified` (`gmt_modified`),\n  KEY `idx_did` (`data_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';\n\n\n/******************************************/\n/*   表名称 = tenant_capacity              */\n/******************************************/\nCREATE TABLE `tenant_capacity` (\n  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',\n  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',\n  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额，0表示使用默认值',\n  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',\n  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限，单位为字节，0表示使用默认值',\n  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',\n  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值',\n  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',\n  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_tenant_id` (`tenant_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';\n\n\nCREATE TABLE `tenant_info` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `kp` varchar(128) NOT NULL COMMENT 'kp',\n  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',\n  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',\n  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',\n  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',\n  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',\n  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),\n  KEY `idx_tenant_id` (`tenant_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';\n\nCREATE TABLE `users` (\n\t`username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',\n\t`password` varchar(500) NOT NULL COMMENT 'password',\n\t`enabled` boolean NOT NULL COMMENT 'enabled'\n);\n\nCREATE TABLE `roles` (\n\t`username` varchar(50) NOT NULL COMMENT 'username',\n\t`role` varchar(50) NOT NULL COMMENT 'role',\n\tUNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE\n);\n\nCREATE TABLE `permissions` (\n    `role` varchar(50) NOT NULL COMMENT 'role',\n    `resource` varchar(128) NOT NULL COMMENT 'resource',\n    `action` varchar(8) NOT NULL COMMENT 'action',\n    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE\n);\n\nSET FOREIGN_KEY_CHECKS = 1;\n"
  },
  {
    "path": "roles/cluster-addon/templates/nacos/nacos-sts.yaml.j2",
    "content": "# 请阅读Wiki文章\n# https://github.com/nacos-group/nacos-k8s/wiki/%E4%BD%BF%E7%94%A8peerfinder%E6%89%A9%E5%AE%B9%E6%8F%92%E4%BB%B6\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: nacos-headless\n  labels:\n    app: nacos\nspec:\n  publishNotReadyAddresses: true \n  ports:\n    - port: 8848\n      name: server\n      targetPort: 8848\n    - port: 9848\n      name: client-rpc\n      targetPort: 9848\n    - port: 9849\n      name: raft-rpc\n      targetPort: 9849\n    - port: 7848\n      name: old-raft-rpc\n      targetPort: 7848\n  clusterIP: None\n  selector:\n    app: nacos\n---\n# 访问nacos 控制台 http://${nodeIp}:${nodePort}/nacos\napiVersion: v1\nkind: Service\nmetadata:\n  name: nacos\n  labels:\n    app: nacos\nspec:\n  ports:\n    - port: 8848\n      name: server\n      targetPort: 8848\n    - port: 9848\n      name: client-rpc\n      targetPort: 9848\n  selector:\n    app: nacos\n  type: NodePort\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: nacos-cm\ndata:\n  mysql.host: \"{{ nacos_mysql_host }}\"\n  mysql.db.name: \"{{ nacos_mysql_db }}\"\n  mysql.port: \"{{ nacos_mysql_port }}\"\n  mysql.user: \"{{ nacos_mysql_user }}\"\n  mysql.password: \"{{ nacos_mysql_password }}\"\n---\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  name: nacos\nspec:\n  podManagementPolicy: Parallel\n  serviceName: nacos-headless\n  replicas: 3\n  selector:\n    matchLabels:\n      app: nacos\n  template:\n    metadata:\n      labels:\n        app: nacos\n      annotations:\n        pod.alpha.kubernetes.io/initialized: \"true\"\n    spec:\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - labelSelector:\n                matchExpressions:\n                  - key: \"app\"\n                    operator: In\n                    values:\n                      - nacos\n              topologyKey: \"kubernetes.io/hostname\"\n      initContainers:\n        - name: peer-finder-plugin-install\n          image: easzlab.io.local:5000/nacos/nacos-peer-finder-plugin:1.1\n          volumeMounts:\n            - mountPath: /home/nacos/plugins/peer-finder\n              name: data\n              subPath: peer-finder\n      containers:\n        - name: nacos\n          image: easzlab.io.local:5000/nacos/nacos-server:v2.4.3\n          resources:\n            requests:\n              memory: \"2Gi\"\n              cpu: \"500m\"\n          ports:\n            - containerPort: 8848\n              name: client-port\n            - containerPort: 9848\n              name: client-rpc\n            - containerPort: 9849\n              name: raft-rpc\n            - containerPort: 7848\n              name: old-raft-rpc\n          env:\n            - name: NACOS_REPLICAS\n              value: \"3\"\n            - name: SERVICE_NAME\n              value: \"nacos-headless\"\n            - name: DOMAIN_NAME\n              value: \"{{ CLUSTER_DNS_DOMAIN }}\"\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  apiVersion: v1\n                  fieldPath: metadata.namespace\n            - name: MYSQL_SERVICE_HOST\n              valueFrom:\n                configMapKeyRef:\n                  name: nacos-cm\n                  key: mysql.host\n            - name: MYSQL_SERVICE_DB_NAME\n              valueFrom:\n                configMapKeyRef:\n                  name: nacos-cm\n                  key: mysql.db.name\n            - name: MYSQL_SERVICE_PORT\n              valueFrom:\n                configMapKeyRef:\n                  name: nacos-cm\n                  key: mysql.port\n            - name: MYSQL_SERVICE_USER\n              valueFrom:\n                configMapKeyRef:\n                  name: nacos-cm\n                  key: mysql.user\n            - name: MYSQL_SERVICE_PASSWORD\n              valueFrom:\n                configMapKeyRef:\n                  name: nacos-cm\n                  key: mysql.password\n            - name: SPRING_DATASOURCE_PLATFORM\n              value: \"mysql\"\n            - name: NACOS_SERVER_PORT\n              value: \"8848\"\n            - name: NACOS_APPLICATION_PORT\n              value: \"8848\"\n            - name: PREFER_HOST_MODE\n              value: \"hostname\"\n            - name: NACOS_AUTH_ENABLE\n              value: \"true\"\n            - name: NACOS_AUTH_SYSTEM_TYPE\n              value: \"nacos\"\n            - name: NACOS_AUTH_CACHE_ENABLE\n              value: \"true\"\n            - name: NACOS_AUTH_TOKEN\n              value: \"YWNjNDU4ODAxYWRiMTgzMGYzYjE5ZTQ2ZGQzYWVhNjFjYTk0MTc3ZGFmOWU2MW0w\"\n            - name: NACOS_AUTH_IDENTITY_KEY\n              value: \"7acc458801adb183\"\n            - name: NACOS_AUTH_IDENTITY_VALUE\n              value: \"0f3b19e46dd3aea61ca94177daf9e609\"\n          volumeMounts:\n            - name: data\n              mountPath: /home/nacos/plugins/peer-finder\n              subPath: peer-finder\n            - name: data\n              mountPath: /home/nacos/data\n              subPath: data\n            - name: data\n              mountPath: /home/nacos/logs\n              subPath: logs\n  volumeClaimTemplates:\n    - apiVersion: v1\n      kind: PersistentVolumeClaim\n      metadata:\n        name: data\n      spec:\n        accessModes: [ \"ReadWriteOnce\" ]\n        resources:\n          requests:\n            storage: 10Gi\n        storageClassName: {{ nacos_storage_class }}\n        volumeMode: Filesystem\n"
  },
  {
    "path": "roles/cluster-addon/templates/nacos/readme.md",
    "content": "# nacos 部署\n\n参考 https://nacos.io/docs/v2.4/manual/admin/deployment/deployment-overview/\n\n## 前置准备\n\n- 创建openebs 提供动态pvc存储\n- 安装 mysql 数据库，初始化建表语句\n\n## 验证Nacos集群配置文件信息\n\n``` bash\nfor i in 0 1 2; do echo nacos-$i; kubectl exec nacos-$i -- cat conf/cluster.conf; done\nnacos-0\nDefaulted container \"nacos\" out of: nacos, peer-finder-plugin-install (init)\n#2025-07-22T17:12:41.878\nnacos-0.nacos-headless.default.svc.cluster.local:8848\nnacos-1.nacos-headless.default.svc.cluster.local:8848\nnacos-2.nacos-headless.default.svc.cluster.local:8848\nnacos-1\nDefaulted container \"nacos\" out of: nacos, peer-finder-plugin-install (init)\n#2025-07-22T17:12:53.913\nnacos-0.nacos-headless.default.svc.cluster.local:8848\nnacos-1.nacos-headless.default.svc.cluster.local:8848\nnacos-2.nacos-headless.default.svc.cluster.local:8848\nnacos-2\nDefaulted container \"nacos\" out of: nacos, peer-finder-plugin-install (init)\n#2025-07-22T17:12:57.963\nnacos-0.nacos-headless.default.svc.cluster.local:8848\nnacos-1.nacos-headless.default.svc.cluster.local:8848\nnacos-2.nacos-headless.default.svc.cluster.local:8848\n```\n\n## 访问nacos 控制台 \n\n``` bash\nhttp://${nodeIp}:${nodePort}/nacos\n```\n\n用户名：nacos 密码：Nacos1234!（首次登录时初始化设置）\n"
  },
  {
    "path": "roles/cluster-addon/templates/network-check/namespace.yaml.j2",
    "content": "apiVersion: v1\nkind: Namespace\nmetadata:\n  labels:\n    kubernetes.io/metadata.name: network-test\n  name: network-test\nspec:\n  finalizers:\n  - kubernetes\n"
  },
  {
    "path": "roles/cluster-addon/templates/network-check/network-check.yaml.j2",
    "content": "# \n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: test01-pod-to-container\n  labels:\n    name: test01-pod-to-container\n    grp: ops-tasks\n    job: network-check\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  schedule: \"{{ network_check_schedule }}\"\n  successfulJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          containers:\n          - name: test01-pod-to-container\n            image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n            imagePullPolicy: IfNotPresent\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 echo-server:8080/public\"]\n          restartPolicy: OnFailure\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: test02-pod-to-node-nodeport\n  labels:\n    name: test02-pod-to-node-nodeport\n    grp: ops-tasks\n    job: network-check\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  schedule: \"{{ network_check_schedule }}\"\n  successfulJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          containers:\n          - name: test02-pod-to-node-nodeport \n            image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n            imagePullPolicy: IfNotPresent\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 echo-server-host-headless:31314/public\"]\n          restartPolicy: OnFailure\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: test03-pod-to-multi-node-clusterip\n  labels:\n    name: test03-pod-to-multi-node-clusterip\n    grp: ops-tasks\n    job: network-check\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  schedule: \"{{ network_check_schedule }}\"\n  successfulJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          affinity:\n            podAntiAffinity:\n              requiredDuringSchedulingIgnoredDuringExecution:\n              - labelSelector:\n                  matchExpressions:\n                  - key: name\n                    operator: In\n                    values:\n                    - echo-server\n                topologyKey: kubernetes.io/hostname\n          containers:\n          - name: test03-pod-to-multi-node-clusterip\n            image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n            imagePullPolicy: IfNotPresent\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 echo-server:8080/public\"]\n          restartPolicy: OnFailure\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: test04-pod-to-multi-node-headless\n  labels:\n    name: test04-pod-to-multi-node-headless\n    grp: ops-tasks\n    job: network-check\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  schedule: \"{{ network_check_schedule }}\"\n  successfulJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          affinity:\n            podAntiAffinity:\n              requiredDuringSchedulingIgnoredDuringExecution:\n              - labelSelector:\n                  matchExpressions:\n                  - key: name\n                    operator: In\n                    values:\n                    - echo-server\n                topologyKey: kubernetes.io/hostname\n          containers:\n          - name: test04-pod-to-multi-node-headless\n            image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n            imagePullPolicy: IfNotPresent\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 echo-server-headless:8080/public\"]\n          restartPolicy: OnFailure\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: test05-pod-to-multi-node-nodeport\n  labels:\n    name: test05-pod-to-multi-node-nodeport\n    grp: ops-tasks\n    job: network-check\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  schedule: \"{{ network_check_schedule }}\"\n  successfulJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          affinity:\n            podAntiAffinity:\n              requiredDuringSchedulingIgnoredDuringExecution:\n              - labelSelector:\n                  matchExpressions:\n                  - key: name\n                    operator: In\n                    values:\n                    - echo-server\n                topologyKey: kubernetes.io/hostname\n          containers:\n          - name: test05-pod-to-multi-node-nodeport\n            image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n            imagePullPolicy: IfNotPresent\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 echo-server-host-headless:31314/public\"]\n          restartPolicy: OnFailure\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: test06-pod-to-external-1111\n  labels:\n    name: test06-pod-to-external-1111 \n    grp: ops-tasks\n    job: network-check\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  schedule: \"{{ network_check_schedule }}\"\n  successfulJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          containers:\n          - name: test06-pod-to-external-1111 \n            image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n            imagePullPolicy: IfNotPresent\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 1.1.1.1\"]\n          restartPolicy: OnFailure\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: test07-pod-to-external-fqdn-baidu\n  labels:\n    name: test07-pod-to-external-fqdn-baidu\n    grp: ops-tasks\n    job: network-check\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  schedule: \"{{ network_check_schedule }}\"\n  successfulJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          containers:\n          - name: test07-pod-to-external-fqdn-baidu\n            image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n            imagePullPolicy: IfNotPresent\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 www.baidu.com\"]\n          restartPolicy: OnFailure\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: test08-host-to-multi-node-clusterip\n  labels:\n    name: test08-host-to-multi-node-clusterip \n    grp: ops-tasks\n    job: network-check\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  schedule: \"{{ network_check_schedule }}\"\n  successfulJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          affinity:\n            podAntiAffinity:\n              requiredDuringSchedulingIgnoredDuringExecution:\n              - labelSelector:\n                  matchExpressions:\n                  - key: name\n                    operator: In\n                    values:\n                    - echo-server\n                topologyKey: kubernetes.io/hostname\n          dnsPolicy: ClusterFirstWithHostNet\n          hostNetwork: true\n          containers:\n          - name: test08-host-to-multi-node-clusterip\n            image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n            imagePullPolicy: IfNotPresent\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 echo-server:8080/public\"]\n          restartPolicy: OnFailure\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: test09-host-to-multi-node-headless\n  labels:\n    name: test09-host-to-multi-node-headless\n    grp: ops-tasks\n    job: network-check\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  schedule: \"{{ network_check_schedule }}\"\n  successfulJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          affinity:\n            podAntiAffinity:\n              requiredDuringSchedulingIgnoredDuringExecution:\n              - labelSelector:\n                  matchExpressions:\n                  - key: name\n                    operator: In\n                    values:\n                    - echo-server\n                topologyKey: kubernetes.io/hostname\n          dnsPolicy: ClusterFirstWithHostNet\n          hostNetwork: true\n          containers:\n          - name: test09-host-to-multi-node-headless\n            image: easzlab.io.local:5000/easzlab/alpine-curl:v7.85.0\n            imagePullPolicy: IfNotPresent\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 echo-server-headless:8080/public\"]\n          restartPolicy: OnFailure\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: echo-server\n  labels:\n    name: echo-server\n    grp: ops-tasks\n    job: network-check\nspec:\n  selector:\n    matchLabels:\n      name: echo-server\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        name: echo-server\n    spec:\n      hostNetwork: false\n      containers:\n      - name: echo-server-container\n        env:\n        - name: PORT\n          value: \"8080\"\n        ports:\n        - containerPort: 8080\n        image: easzlab.io.local:5000/easzlab/json-mock:v1.3.0\n        imagePullPolicy: IfNotPresent\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 -o /dev/null localhost:8080\"]\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 -o /dev/null localhost:8080\"]\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: echo-server-host\n  labels:\n    name: echo-server-host\n    grp: ops-tasks\n    job: network-check\nspec:\n  selector:\n    matchLabels:\n      name: echo-server-host\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        name: echo-server-host\n    spec:\n      hostNetwork: true\n      affinity:\n        podAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchExpressions:\n              - key: name\n                operator: In\n                values:\n                - echo-server\n            topologyKey: kubernetes.io/hostname\n      containers:\n      - name: echo-server-host-container\n        env:\n        - name: PORT\n          value: \"40001\"\n        ports: []\n        image: easzlab.io.local:5000/easzlab/json-mock:v1.3.0\n        imagePullPolicy: IfNotPresent\n        readinessProbe:\n          timeoutSeconds: 7\n          exec:\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 -o /dev/null localhost:40001\"]\n        livenessProbe:\n          timeoutSeconds: 7\n          exec:\n            command: [\"sh\",\"-c\",\"curl -sS --fail --connect-timeout 5 -o /dev/null localhost:40001\"]\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: echo-server\n  labels:\n    name: echo-server\n    grp: ops-tasks\n    job: network-check\nspec:\n  ports:\n  - name: http\n    port: 8080\n    nodePort: 31314\n  type: NodePort \n  selector:\n    name: echo-server\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: echo-server-headless\n  labels:\n    name: echo-server-headless\n    grp: ops-tasks\n    job: network-check\nspec:\n  ports:\n  - name: http\n    port: 8080\n  type: ClusterIP\n  selector:\n    name: echo-server\n  clusterIP: None\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: echo-server-host-headless\n  labels:\n    name: echo-server-host-headless\n    grp: ops-tasks\n    job: network-check\nspec:\n  ports: []\n  type: ClusterIP\n  selector:\n    name: echo-server-host\n  clusterIP: None\n"
  },
  {
    "path": "roles/cluster-addon/templates/nfs-provisioner/nfs-provisioner.yaml.j2",
    "content": "---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: nfs-client-provisioner\n  # replace with namespace where provisioner is deployed\n  namespace: {{ nfs_provisioner_namespace }}\n---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: nfs-client-provisioner-runner\nrules:\n  - apiGroups: [\"\"]\n    resources: [\"nodes\"]\n    verbs: [\"get\", \"list\", \"watch\"]\n  - apiGroups: [\"\"]\n    resources: [\"persistentvolumes\"]\n    verbs: [\"get\", \"list\", \"watch\", \"create\", \"delete\"]\n  - apiGroups: [\"\"]\n    resources: [\"persistentvolumeclaims\"]\n    verbs: [\"get\", \"list\", \"watch\", \"update\"]\n  - apiGroups: [\"storage.k8s.io\"]\n    resources: [\"storageclasses\"]\n    verbs: [\"get\", \"list\", \"watch\"]\n  - apiGroups: [\"\"]\n    resources: [\"events\"]\n    verbs: [\"create\", \"update\", \"patch\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: run-nfs-client-provisioner\nsubjects:\n  - kind: ServiceAccount\n    name: nfs-client-provisioner\n    # replace with namespace where provisioner is deployed\n    namespace: {{ nfs_provisioner_namespace }}\nroleRef:\n  kind: ClusterRole\n  name: nfs-client-provisioner-runner\n  apiGroup: rbac.authorization.k8s.io\n---\nkind: Role\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: leader-locking-nfs-client-provisioner\n  # replace with namespace where provisioner is deployed\n  namespace: {{ nfs_provisioner_namespace }}\nrules:\n  - apiGroups: [\"\"]\n    resources: [\"endpoints\"]\n    verbs: [\"get\", \"list\", \"watch\", \"create\", \"update\", \"patch\"]\n---\nkind: RoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: leader-locking-nfs-client-provisioner\n  # replace with namespace where provisioner is deployed\n  namespace: {{ nfs_provisioner_namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: nfs-client-provisioner\n    # replace with namespace where provisioner is deployed\n    namespace: {{ nfs_provisioner_namespace }}\nroleRef:\n  kind: Role\n  name: leader-locking-nfs-client-provisioner\n  apiGroup: rbac.authorization.k8s.io\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: nfs-client-provisioner\n  labels:\n    app: nfs-client-provisioner\n  # replace with namespace where provisioner is deployed\n  namespace: {{ nfs_provisioner_namespace }}\nspec:\n  replicas: 1\n  strategy:\n    type: Recreate\n  selector:\n    matchLabels:\n      app: nfs-client-provisioner\n  template:\n    metadata:\n      labels:\n        app: nfs-client-provisioner\n    spec:\n      serviceAccountName: nfs-client-provisioner\n      containers:\n        - name: nfs-client-provisioner\n          #image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.1\n          image: easzlab.io.local:5000/easzlab/nfs-subdir-external-provisioner:{{ nfs_provisioner_ver }}\n          volumeMounts:\n            - name: nfs-client-root\n              mountPath: /persistentvolumes\n          env:\n            - name: PROVISIONER_NAME\n              value: k8s-sigs.io/nfs-subdir-external-provisioner\n            - name: NFS_SERVER\n              value: {{ nfs_server }}\n            - name: NFS_PATH\n              value: {{ nfs_path }}\n      volumes:\n        - name: nfs-client-root\n          nfs:\n            server: {{ nfs_server }}\n            path: {{ nfs_path }}\n\n---\napiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: {{ nfs_storage_class }}\nprovisioner: k8s-sigs.io/nfs-subdir-external-provisioner\nparameters:\n  archiveOnDelete: \"false\"\n"
  },
  {
    "path": "roles/cluster-addon/templates/nfs-provisioner/test-pod.yaml.j2",
    "content": "---\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: test-claim\nspec:\n  storageClassName: {{ nfs_storage_class }}\n  accessModes:\n    - ReadWriteMany\n  resources:\n    requests:\n      storage: 2Mi\n\n---\nkind: Pod\napiVersion: v1\nmetadata:\n  name: test-pod\nspec:\n  containers:\n  - name: test-pod\n    image: busybox\n    command:\n      - \"/bin/sh\"\n    args:\n      - \"-c\"\n      - \"touch /mnt/SUCCESS && exit 0 || exit 1\"\n    volumeMounts:\n      - name: nfs-pvc\n        mountPath: \"/mnt\"\n  restartPolicy: \"Never\"\n  volumes:\n    - name: nfs-pvc\n      persistentVolumeClaim:\n        claimName: test-claim\n"
  },
  {
    "path": "roles/cluster-addon/templates/openebs/readme.md",
    "content": "# readme\n\nopenebs 使用启用lvm-localpv-controller，当创建StorageClass 时启用thinProvision: \"yes\"，需要注意vg_k8s_thinpool 的容量问题：\n\n```\nlvs\n  LV                                       VG     Attr       LSize   Pool            Origin Data%  Meta%  Move Log Cpy%Sync Convert\n  pvc-2214c3d8-83de-44e6-988c-6293277e9b1e vg_k8s Vwi-aotz--  5.00g vg_k8s_thinpool        2.91\n  pvc-d8ea9413-5ddd-42db-a3f8-4363f745909a vg_k8s Vwi-aotz-- 20.00g vg_k8s_thinpool        2.23\n  vg_k8s_thinpool                          vg_k8s twi-aotzD- 10.00g                        100.00 6.99\n```\n\n默认vg_k8s_thinpool 只有10G 大小，当如上图 Data% = 100% 时，就无法创建新的pv，需要扩容：\n\nlvextend -L +190G vg_k8s/vg_k8s_thinpool\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/openebs/sc.yaml.j2",
    "content": "apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: {{ openebs_lvm_storage_class }} \nallowVolumeExpansion: true\nparameters:\n  fsType: ext4 \n  storage: \"lvm\"\n  thinProvision: \"yes\"\n  vgpattern: \"lvmvg.*\"\n  volgroup: \"{{ openebs_lvm_vg }}\"\nprovisioner: local.csi.openebs.io\nreclaimPolicy: Delete\nvolumeBindingMode: WaitForFirstConsumer\n#allowedTopologies:\n#- matchLabelExpressions:\n#  - key: kubernetes.io/hostname\n#    values:\n#      - k8s-192-168-0-19 \n"
  },
  {
    "path": "roles/cluster-addon/templates/openebs/values.yaml.j2",
    "content": "localpv-provisioner:\n  global:\n    imageRegistry: \"easzlab.io.local:5000\"\n  hostpathClass:\n    enabled: true\n    name: {{ openebs_hostpath_storage_class }}\n  localpv:\n    basePath: \"{{ openebs_hostpath }}\"\n    resources:\n      limits:\n        cpu: 100m\n        memory: 128Mi\n\nlvm-localpv:\n  lvmNode:\n    driverRegistrar:\n      image:\n        registry: easzlab.io.local:5000/\n        repository: openebs/csi-node-driver-registrar\n    kubeletDir: \"{{ KUBELET_ROOT_DIR }}\"\n    resources:\n      limits:\n        cpu: 100m\n        memory: 128Mi\n  lvmController:\n    resizer:\n      image:\n        registry: easzlab.io.local:5000/\n        repository: openebs/csi-resizer\n    snapshotter:\n      image:\n        registry: easzlab.io.local:5000/\n        repository: openebs/csi-snapshotter\n    snapshotController:\n      image:\n        registry: easzlab.io.local:5000/\n        repository: openebs/snapshot-controller\n    provisioner:\n      image:\n        registry: easzlab.io.local:5000/\n        repository: openebs/csi-provisioner\n    resources:\n      limits:\n        cpu: 100m\n        memory: 128Mi\n  lvmPlugin:\n    image:\n      registry: easzlab.io.local:5000/\n      repository: openebs/lvm-driver\n\n# -- Configuration options for pre-upgrade helm hook job.\npreUpgradeHook:\n  image:\n    registry: easzlab.io.local:5000\n    repo: openebs/kubectl\n\nengines:\n  local:\n    lvm:\n      enabled: true\n    zfs:\n      enabled: false\n  replicated:\n    mayastor:\n      enabled: false\n\nloki:\n  enabled: false\n\nalloy:\n  enabled: false\n"
  },
  {
    "path": "roles/cluster-addon/templates/prometheus/dingtalk-webhook.yaml",
    "content": "---\napiVersion: apps/v1 \nkind: Deployment\nmetadata:\n  labels:\n    run: dingtalk\n  name: webhook-dingtalk\n  namespace: monitor\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      run: dingtalk\n  selector:\n    matchLabels:\n      run: dingtalk\n  template:\n    metadata:\n      labels:\n        run: dingtalk\n    spec:\n      containers:\n      - name: dingtalk\n        image: timonwong/prometheus-webhook-dingtalk:v0.3.0\n        imagePullPolicy: IfNotPresent\n        # 设置钉钉群聊自定义机器人后，使用实际 access_token 替换下面 xxxxxx部分\n        args:\n          - --ding.profile=webhook1=https://oapi.dingtalk.com/robot/send?access_token=xxxxxx\n        ports:\n        - containerPort: 8060\n          protocol: TCP\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    run: dingtalk\n  name: webhook-dingtalk\n  namespace: monitor\nspec:\n  ports:\n  - port: 8060\n    protocol: TCP\n    targetPort: 8060\n  selector:\n    run: dingtalk\n  sessionAffinity: None\n"
  },
  {
    "path": "roles/cluster-addon/templates/prometheus/etcd-client-csr.json.j2",
    "content": "{\n  \"CN\": \"etcd-client\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/cluster-addon/templates/prometheus/example-config-alertsmanager.yaml",
    "content": "alertmanagerFiles:\n  alertmanager.yml:\n    global:\n      smtp_smarthost: 'smtp.163.com:25'\n      smtp_from: 'xxxx@163.com'\n      smtp_auth_username: 'xxxx@163.com'\n      smtp_auth_password: '*********'\n      smtp_require_tls: false\n\n    route:\n      group_by: ['alertname', 'pod_name']\n      group_wait: 10s\n      group_interval: 5m\n      #receiver: AlertMail\n      receiver: dingtalk\n      repeat_interval: 3h\n\n    receivers:\n    - name: 'AlertMail'\n      email_configs:\n      - to: 'xxxx@163.com'\n    - name: dingtalk\n      webhook_configs:\n      - send_resolved: false\n        # 需要运行插件 dingtalk-webhook.yaml，详情阅读 docs/guide/prometheus.md\n        url: http://webhook-dingtalk.monitoring.svc.cluster.local:8060/dingtalk/webhook1/send\n\n"
  },
  {
    "path": "roles/cluster-addon/templates/prometheus/values.yaml.j2",
    "content": "kubeTargetVersionOverride: \"{{ K8S_VER }}\"\n\n##\nglobal:\n  imageRegistry: \"easzlab.io.local:5000\"\n\n## Configuration for alertmanager\nalertmanager:\n  enabled: true\n  service:\n    nodePort: 30902\n    type: NodePort \n\n## Using default values from https://github.com/grafana/helm-charts/blob/main/charts/grafana/values.yaml\ngrafana:\n  enabled: true\n  adminUser: admin\n  adminPassword: Admin1234!\n  image:\n    repository: prometheus/grafana\n  service:\n    nodePort: 30903\n    type: NodePort\n  sidecar:\n    image:\n      repository: prometheus/k8s-sidecar\n    skipTlsVerify: true\n\n## Flag to disable all the kubernetes component scrapers\nkubernetesServiceMonitors:\n  enabled: true\n\n## Component scraping the kube api server\nkubeApiServer:\n  enabled: true\n\n## Component scraping the kubelet and kubelet-hosted cAdvisor\nkubelet:\n  enabled: true\n\n## Component scraping the kube controller manager\nkubeControllerManager:\n  enabled: true\n  endpoints:\n{% for h in groups['kube_master'] %}\n  - {{ h }}\n{% endfor %}\n  serviceMonitor:\n    https: true\n    insecureSkipVerify: true\n    serverName: localhost\n\n## Component scraping coreDns. Use either this or kubeDns\ncoreDns:\n  enabled: true\n\n## Component scraping etcd\nkubeEtcd:\n  enabled: true\n  endpoints:\n{% for h in groups['etcd'] %}\n  - {{ h }}\n{% endfor %}\n  service:\n    port: 2379\n    targetPort: 2379\n  serviceMonitor:\n    scheme: https\n    insecureSkipVerify: true\n    serverName: localhost\n    caFile: /etc/prometheus/secrets/etcd-client-cert/etcd-ca\n    certFile: /etc/prometheus/secrets/etcd-client-cert/etcd-client\n    keyFile: /etc/prometheus/secrets/etcd-client-cert/etcd-client-key\n\n## Component scraping kube scheduler\nkubeScheduler:\n  enabled: true\n  endpoints:\n{% for h in groups['kube_master'] %}\n  - {{ h }}\n{% endfor %}\n  serviceMonitor:\n    https: true\n    insecureSkipVerify: true\n\n## Component scraping kube proxy\nkubeProxy:\n  enabled: true\n  endpoints:\n{% for h in groups['kube_master'] %}\n  - {{ h }}\n{% endfor %}\n{% for h in groups['kube_node'] %}\n{% if h not in groups['kube_master'] %}\n  - {{ h }}\n{% endif %}\n{% endfor %}\n\n## Component scraping kube state metrics\nkubeStateMetrics:\n  enabled: true\n\n## Configuration for kube-state-metrics subchart\nkube-state-metrics:\n  image:\n    registry: easzlab.io.local:5000\n    repository: easzlab/kube-state-metrics\n\n## Deploy node exporter as a daemonset to all nodes\nnodeExporter:\n  enabled: true\n  operatingSystems:\n    linux:\n      enabled: true\n    aix:\n      enabled: false\n    darwin:\n      enabled: false\n\n## Configuration for prometheus-node-exporter subchart\nprometheus-node-exporter:\n  image:\n    registry: easzlab.io.local:5000\n    repository: prometheus/node-exporter\n\n## Manages Prometheus and Alertmanager components\nprometheusOperator:\n  enabled: true\n  admissionWebhooks:\n    enabled: true\n    patch:\n      enabled: true\n      image:\n        registry: easzlab.io.local:5000\n        repository: easzlab/kube-webhook-certgen\n  image:\n    registry: easzlab.io.local:5000\n    repository: prometheus/prometheus-operator\n  service:\n    nodePort: 30899\n    nodePortTls: 30900\n    type: NodePort\n  prometheusConfigReloader:\n    image:\n      registry: easzlab.io.local:5000\n      repository: prometheus/prometheus-config-reloader\n\n## Deploy a Prometheus instance\nprometheus:\n  enabled: true\n  service:\n    nodePort: 30901\n    type: NodePort\n\n  prometheusSpec:\n    image:\n      registry: easzlab.io.local:5000\n    replicas: 1\n    retention: 30d\n    secrets:\n    - etcd-client-cert\n{% if prom_storage_class != \"\" %}\n    storageSpec:\n      volumeClaimTemplate:\n        spec:\n          storageClassName: {{ prom_storage_class }}\n          accessModes: [\"ReadWriteOnce\"]\n          resources:\n            requests:\n              storage: 20Gi\n{% else %}\n    storageSpec: {}\n{% endif %}\n"
  },
  {
    "path": "roles/cluster-addon/templates/rocketmq/rocketmq_cluster.yaml.j2",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: broker-config\n  namespace: {{ rocketmq_namespace }}\ndata:\n  # BROKER_MEM sets the broker JVM, if set to \"\" then Xms = Xmx = max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))\n  BROKER_MEM: \" -Xms2g -Xmx2g -Xmn1g \"\n  broker-common.conf: |\n    # brokerClusterName, brokerName, brokerId are automatically generated by the operator and do not set it manually!!!\n    deleteWhen=04\n    fileReservedTime=48\n    flushDiskType=ASYNC_FLUSH\n    # set brokerRole to ASYNC_MASTER or SYNC_MASTER. DO NOT set to SLAVE because the replica instance will automatically be set!!!\n    brokerRole=ASYNC_MASTER\n\n---\napiVersion: rocketmq.apache.org/v1alpha1\nkind: Broker\nmetadata:\n  name: broker\n  namespace: {{ rocketmq_namespace }}\nspec:\n  # size is the number of the broker cluster, each broker cluster contains a master broker and [replicaPerGroup] replica brokers.\n  size: 1\n  nameServers: \"\"\n  # replicaPerGroup is the number of each broker cluster\n  replicaPerGroup: 1\n  brokerImage: easzlab.io.local:5000/rocketmq/rocketmq-broker:4.5.0-alpine-operator-0.3.0\n  imagePullPolicy: IfNotPresent\n  resources:\n    requests:\n      memory: \"2048Mi\"\n      cpu: \"250m\"\n    limits:\n      memory: \"12288Mi\"\n      cpu: \"500m\"\n  # allowRestart defines whether allow pod restart\n  allowRestart: true\n  # storageMode can be EmptyDir, HostPath, StorageClass\n  storageMode: StorageClass\n  # hostPath is the local path to store data\n  hostPath: /data/rocketmq/broker\n  # scalePodName is [Broker name]-[broker group number]-master-0\n  scalePodName: broker-0-master-0\n  env:\n    - name: BROKER_MEM\n      valueFrom:\n        configMapKeyRef:\n          name: broker-config\n          key: BROKER_MEM\n  # volumes defines the broker.conf\n  volumes:\n    - name: broker-config\n      configMap:\n        name: broker-config\n        items:\n          - key: broker-common.conf\n            path: broker-common.conf\n  volumeClaimTemplates:\n    - metadata:\n        name: broker-storage\n      spec:\n        accessModes:\n          - ReadWriteOnce\n        storageClassName: {{ rocketmq_storage_class }}\n        resources:\n          requests:\n            storage: 20Gi\n---\napiVersion: rocketmq.apache.org/v1alpha1\nkind: NameService\nmetadata:\n  name: name-service\n  namespace: {{ rocketmq_namespace }}\nspec:\n  size: 2\n  nameServiceImage: easzlab.io.local:5000/rocketmq/rocketmq-nameserver:4.5.0-alpine-operator-0.3.0\n  imagePullPolicy: IfNotPresent\n  hostNetwork: true\n  dnsPolicy: ClusterFirstWithHostNet\n  resources:\n    requests:\n      memory: \"512Mi\"\n      cpu: \"250m\"\n    limits:\n      memory: \"1024Mi\"\n      cpu: \"500m\"\n  # storageMode can be EmptyDir, HostPath, StorageClass\n  storageMode: StorageClass\n  # hostPath is the local path to store data\n  hostPath: /data/rocketmq/nameserver\n  volumeClaimTemplates:\n    - metadata:\n        name: namesrv-storage\n      spec:\n        accessModes:\n          - ReadWriteOnce\n        storageClassName: {{ rocketmq_storage_class }}\n        resources:\n          requests:\n            storage: 5Gi\n\n---\napiVersion: rocketmq.apache.org/v1alpha1\nkind: Console\nmetadata:\n  name: console\n  namespace: {{ rocketmq_namespace }}\nspec:\n  nameServers: \"\"\n  consoleDeployment:\n    apiVersion: apps/v1\n    kind: Deployment\n    metadata:\n      labels:\n        app: rocketmq-console\n    spec:\n      replicas: 1\n      selector:\n        matchLabels:\n          app: rocketmq-console\n      template:\n        metadata:\n          labels:\n            app: rocketmq-console\n        spec:\n          containers:\n            - name: console\n              image: easzlab.io.local:5000/rocketmq/rocketmq-console:2.0.0\n              ports:\n                - containerPort: 8080\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: console-service\n  namespace: {{ rocketmq_namespace }}\n  labels:\n    app: rocketmq-console\nspec:\n  type: NodePort\n  selector:\n    app: rocketmq-console\n  ports:\n    - port: 8080\n      targetPort: 8080\n      protocol: TCP\n"
  },
  {
    "path": "roles/cluster-addon/vars/main.yml",
    "content": "# default values\n\n# coredns 服务地址，根据SERVICE_CIDR 设置，默认选择网段第二个地址\nCLUSTER_DNS_SVC_IP: \"{{ SERVICE_CIDR.split('.')[0] }}.{{ SERVICE_CIDR.split('.')[1] }}.{{ SERVICE_CIDR.split('.')[2] }}.{{ SERVICE_CIDR.split('.')[3]|regex_replace('/.*', '')|int + 2 }}\"\n"
  },
  {
    "path": "roles/cluster-restore/defaults/main.yml",
    "content": "# 指定需要恢复的 etcd 数据备份，默认使用最近的一次备份\n# 在ansible 控制端查看备份目录：/etc/kubeasz/clusters/_cluster_name_/backup\ndb_to_restore: \"snapshot.db\"\n\n# etcd 集群间通信的IP和端口, 根据etcd组成员自动生成\nTMP_NODES: \"{% for h in groups['etcd'] %}etcd-{{ h }}=https://{{ h }}:2380,{% endfor %}\"\nETCD_NODES: \"{{ TMP_NODES.rstrip(',') }}\"\n"
  },
  {
    "path": "roles/cluster-restore/tasks/main.yml",
    "content": "- name: 停止ectd 服务\n  service: name=etcd state=stopped\n\n- name: 清除etcd 数据目录\n  file: name={{ ETCD_DATA_DIR }}/member state=absent\n\n- name: 清理上次备份恢复数据\n  file: name=/etcd_backup state=absent\n\n- name: 生成备份目录\n  file: name=/etcd_backup state=directory\n\n- name: 准备指定的备份etcd 数据\n  copy:\n    src: \"{{ cluster_dir }}/backup/{{ db_to_restore }}\"\n    dest: \"/etcd_backup/snapshot.db\"\n\n- name: etcd 数据恢复\n  shell: \"cd /etcd_backup && \\\n\tETCDCTL_API=3 {{ bin_dir }}/etcdutl snapshot restore snapshot.db \\\n\t--name etcd-{{ inventory_hostname }} \\\n\t--initial-cluster {{ ETCD_NODES }} \\\n\t--initial-cluster-token etcd-cluster-0 \\\n\t--initial-advertise-peer-urls https://{{ inventory_hostname }}:2380\"\n\n- name: 恢复数据至etcd 数据目录\n  shell: \"cp -rf /etcd_backup/etcd-{{ inventory_hostname }}.etcd/member {{ ETCD_DATA_DIR }}/\"\n\n- name: 重启etcd 服务\n  service: name=etcd state=restarted\n\n- name: 以轮询的方式等待服务同步完成\n  shell: \"systemctl is-active etcd.service\"\n  register: etcd_status\n  until: '\"active\" in etcd_status.stdout'\n  retries: 8\n  delay: 8\n"
  },
  {
    "path": "roles/containerd/tasks/main.yml",
    "content": "- name: 准备containerd相关目录\n  file: name={{ item }} state=directory\n  with_items:\n  - \"{{ bin_dir }}/containerd-bin\"\n  - \"{{ CONTAINERD_CONFIG_DIR }}/certs.d/docker.io\"\n  - \"{{ CONTAINERD_CONFIG_DIR }}/certs.d/easzlab.io.local:5000\"\n  - \"{{ CONTAINERD_CONFIG_DIR }}/certs.d/{{ HARBOR_REGISTRY }}\"\n  tags: support_private_registry\n\n- name: 准备INSECURE REGISTRY 目录\n  file:\n    path: \"{{ CONTAINERD_CONFIG_DIR }}/certs.d/{{ item.split('/')[2] }}\"\n    state: directory\n  loop: \"{{ INSECURE_REG }}\"\n\n- name: 加载内核模块 overlay\n  modprobe: name=overlay state=present\n\n- name: 下载 containerd 二进制文件\n  copy: src={{ item }} dest={{ bin_dir }}/containerd-bin/ mode=0755\n  with_fileglob:\n  - \"{{ base_dir }}/bin/containerd-bin/*\"\n  tags: upgrade\n\n- name: 下载 crictl\n  copy: src={{ base_dir }}/bin/crictl dest={{ bin_dir }}/crictl mode=0755\n\n- name: 创建 containerd 配置文件\n  template: src=config.toml.j2 dest={{ CONTAINERD_CONFIG_DIR }}/config.toml\n  tags: upgrade\n\n- name: 配置docker.io 加速镜像\n  template: src=docker.io/hosts.toml.j2 dest={{ CONTAINERD_CONFIG_DIR }}/certs.d/docker.io/hosts.toml\n\n- name: 配置信任 INSECURE REGISTRY 仓库\n  template:\n    src: hosts.toml.j2\n    dest: \"{{ CONTAINERD_CONFIG_DIR }}/certs.d/{{ item.split('/')[2] }}/hosts.toml\"\n  loop: \"{{ INSECURE_REG }}\"\n\n- name: 配置信任 {{ HARBOR_REGISTRY }} 仓库\n  template: src=\"HARBOR_REGISTRY/hosts.toml.j2\" dest={{ CONTAINERD_CONFIG_DIR }}/certs.d/{{ HARBOR_REGISTRY }}/hosts.toml\n  tags: support_private_registry\n\n- name: 创建systemd unit文件\n  template: src=containerd.service.j2 dest=/etc/systemd/system/{{ CONTAINERD_SERVICE_NAME }}\n  tags: upgrade\n\n- name: 创建 crictl 配置\n  template: src=crictl.yaml.j2 dest=/etc/crictl.yaml\n\n- name: 开机启用 containerd 服务\n  shell: 'systemctl enable {{ CONTAINERD_SERVICE_NAME }}'\n  ignore_errors: true\n\n- name: 开启 containerd 服务\n  shell: 'systemctl daemon-reload && systemctl restart {{ CONTAINERD_SERVICE_NAME }}'\n  tags: upgrade\n\n- name: 轮询等待containerd服务运行\n  shell: \"systemctl is-active {{ CONTAINERD_SERVICE_NAME }}\"\n  register: containerd_status\n  until: '\"active\" in containerd_status.stdout'\n  retries: 8\n  delay: 2\n  tags: upgrade\n"
  },
  {
    "path": "roles/containerd/templates/HARBOR_REGISTRY/hosts.toml.j2",
    "content": "# https://github.com/containerd/containerd/blob/main/docs/hosts.md\nserver = \"https://{{ HARBOR_REGISTRY }}\"\n\n[host.\"https://{{ HARBOR_REGISTRY }}\"]\n  capabilities = [\"pull\", \"resolve\"]\n  skip_verify = true\n\n  [host.\"https://{{ HARBOR_REGISTRY }}\".header]\n  # echo -n \"username:password\" | base64\n  Authorization = \"Basic dXNlcm5hbWU6cGFzc3dvcmQ=\"\n"
  },
  {
    "path": "roles/containerd/templates/config.toml.j2",
    "content": "version = 3\nroot = '{{ CONTAINERD_ROOT_DIR }}'\nstate = '{{ CONTAINERD_STATE_DIR }}'\ntemp = ''\nplugin_dir = ''\ndisabled_plugins = []\nrequired_plugins = []\noom_score = 0\nimports = []\n\n[grpc]\n  address = '{{ CONTAINERD_STATE_DIR }}/containerd.sock'\n  tcp_address = ''\n  tcp_tls_ca = ''\n  tcp_tls_cert = ''\n  tcp_tls_key = ''\n  uid = 0\n  gid = 0\n  max_recv_message_size = 16777216\n  max_send_message_size = 16777216\n\n[ttrpc]\n  address = ''\n  uid = 0\n  gid = 0\n\n[debug]\n  address = ''\n  uid = 0\n  gid = 0\n  level = ''\n  format = ''\n\n[metrics]\n  address = ''\n  grpc_histogram = false\n\n[plugins]\n  [plugins.'io.containerd.cri.v1.images']\n    snapshotter = 'overlayfs'\n    disable_snapshot_annotations = true\n    discard_unpacked_layers = false\n    max_concurrent_downloads = 3\n    image_pull_progress_timeout = '15m0s'\n    image_pull_with_sync_fs = false\n    stats_collect_period = 10\n\n    [plugins.'io.containerd.cri.v1.images'.pinned_images]\n      sandbox = '{{ SANDBOX_IMAGE }}'\n\n    [plugins.'io.containerd.cri.v1.images'.registry]\n      config_path = '{{ CONTAINERD_CONFIG_DIR }}/certs.d'\n\n    [plugins.'io.containerd.cri.v1.images'.image_decryption]\n      key_model = 'node'\n\n  [plugins.'io.containerd.cri.v1.runtime']\n    enable_selinux = false\n    selinux_category_range = 1024\n    max_container_log_line_size = 16384\n    disable_apparmor = false\n    restrict_oom_score_adj = false\n    disable_proc_mount = false\n    unset_seccomp_profile = ''\n    tolerate_missing_hugetlb_controller = true\n    disable_hugetlb_controller = true\n    device_ownership_from_security_context = false\n    ignore_image_defined_volumes = false\n    netns_mounts_under_state_dir = false\n    enable_unprivileged_ports = true\n    enable_unprivileged_icmp = true\n    enable_cdi = true\n    cdi_spec_dirs = ['/etc/cdi', '/var/run/cdi']\n    drain_exec_sync_io_timeout = '0s'\n    ignore_deprecation_warnings = []\n\n    [plugins.'io.containerd.cri.v1.runtime'.containerd]\n      default_runtime_name = 'runc'\n      ignore_blockio_not_enabled_errors = false\n      ignore_rdt_not_enabled_errors = false\n\n      [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes]\n        [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc]\n          runtime_type = 'io.containerd.runc.v2'\n          runtime_path = ''\n          pod_annotations = []\n          container_annotations = []\n          privileged_without_host_devices = false\n          privileged_without_host_devices_all_devices_allowed = false\n          base_runtime_spec = ''\n          cni_conf_dir = ''\n          cni_max_conf_num = 0\n          snapshotter = ''\n          sandboxer = 'podsandbox'\n          io_type = ''\n\n          [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]\n            BinaryName = ''\n            CriuImagePath = ''\n            CriuWorkPath = ''\n            IoGid = 0\n            IoUid = 0\n            NoNewKeyring = false\n            Root = ''\n            ShimCgroup = ''\n            SystemdCgroup = true\n\n    [plugins.'io.containerd.cri.v1.runtime'.cni]\n      bin_dir = '/opt/cni/bin'\n      conf_dir = '/etc/cni/net.d'\n      max_conf_num = 1\n      setup_serially = false\n      conf_template = '/etc/cni/net.d/10-default.conf'\n      ip_pref = ''\n      use_internal_loopback = false\n\n  [plugins.'io.containerd.gc.v1.scheduler']\n    pause_threshold = 0.02\n    deletion_threshold = 0\n    mutation_threshold = 100\n    schedule_delay = '0s'\n    startup_delay = '100ms'\n\n  [plugins.'io.containerd.grpc.v1.cri']\n    disable_tcp_service = true\n    stream_server_address = '127.0.0.1'\n    stream_server_port = '0'\n    stream_idle_timeout = '4h0m0s'\n    enable_tls_streaming = false\n\n    [plugins.'io.containerd.grpc.v1.cri'.x509_key_pair_streaming]\n      tls_cert_file = ''\n      tls_key_file = ''\n\n  [plugins.'io.containerd.image-verifier.v1.bindir']\n    bin_dir = '/opt/containerd/image-verifier/bin'\n    max_verifiers = 10\n    per_verifier_timeout = '10s'\n\n  [plugins.'io.containerd.internal.v1.opt']\n    path = '/opt/containerd'\n\n  [plugins.'io.containerd.internal.v1.tracing']\n\n  [plugins.'io.containerd.metadata.v1.bolt']\n    content_sharing_policy = 'shared'\n\n  [plugins.'io.containerd.monitor.container.v1.restart']\n    interval = '10s'\n\n  [plugins.'io.containerd.monitor.task.v1.cgroups']\n    no_prometheus = false\n\n  [plugins.'io.containerd.nri.v1.nri']\n    disable = false\n    socket_path = '/var/run/nri/nri.sock'\n    plugin_path = '/opt/nri/plugins'\n    plugin_config_path = '/etc/nri/conf.d'\n    plugin_registration_timeout = '5s'\n    plugin_request_timeout = '2s'\n    disable_connections = false\n\n  [plugins.'io.containerd.runtime.v2.task']\n    platforms = ['linux/amd64']\n\n  [plugins.'io.containerd.service.v1.diff-service']\n    default = ['walking']\n    sync_fs = false\n\n  [plugins.'io.containerd.service.v1.tasks-service']\n    blockio_config_file = ''\n    rdt_config_file = ''\n\n  [plugins.'io.containerd.shim.v1.manager']\n    env = []\n\n  [plugins.'io.containerd.snapshotter.v1.blockfile']\n    root_path = ''\n    scratch_file = ''\n    fs_type = ''\n    mount_options = []\n    recreate_scratch = false\n\n  [plugins.'io.containerd.snapshotter.v1.btrfs']\n    root_path = ''\n\n  [plugins.'io.containerd.snapshotter.v1.devmapper']\n    root_path = ''\n    pool_name = ''\n    base_image_size = ''\n    async_remove = false\n    discard_blocks = false\n    fs_type = ''\n    fs_options = ''\n\n  [plugins.'io.containerd.snapshotter.v1.native']\n    root_path = ''\n\n  [plugins.'io.containerd.snapshotter.v1.overlayfs']\n    root_path = ''\n    upperdir_label = false\n    sync_remove = false\n    slow_chown = false\n    mount_options = []\n\n  [plugins.'io.containerd.snapshotter.v1.zfs']\n    root_path = ''\n\n  [plugins.'io.containerd.tracing.processor.v1.otlp']\n\n  [plugins.'io.containerd.transfer.v1.local']\n    max_concurrent_downloads = 3\n    max_concurrent_uploaded_layers = 3\n    config_path = ''\n\n[cgroup]\n  path = ''\n\n[timeouts]\n  'io.containerd.timeout.bolt.open' = '0s'\n  'io.containerd.timeout.metrics.shimstats' = '2s'\n  'io.containerd.timeout.shim.cleanup' = '5s'\n  'io.containerd.timeout.shim.load' = '5s'\n  'io.containerd.timeout.shim.shutdown' = '3s'\n  'io.containerd.timeout.task.state' = '2s'\n\n[stream_processors]\n  [stream_processors.'io.containerd.ocicrypt.decoder.v1.tar']\n    accepts = ['application/vnd.oci.image.layer.v1.tar+encrypted']\n    returns = 'application/vnd.oci.image.layer.v1.tar'\n    path = 'ctd-decoder'\n    args = ['--decryption-keys-path', '{{ CONTAINERD_CONFIG_DIR }}/ocicrypt/keys']\n    env = ['OCICRYPT_KEYPROVIDER_CONFIG={{ CONTAINERD_CONFIG_DIR }}/ocicrypt/ocicrypt_keyprovider.conf']\n\n  [stream_processors.'io.containerd.ocicrypt.decoder.v1.tar.gzip']\n    accepts = ['application/vnd.oci.image.layer.v1.tar+gzip+encrypted']\n    returns = 'application/vnd.oci.image.layer.v1.tar+gzip'\n    path = 'ctd-decoder'\n    args = ['--decryption-keys-path', '{{ CONTAINERD_CONFIG_DIR }}/ocicrypt/keys']\n    env = ['OCICRYPT_KEYPROVIDER_CONFIG={{ CONTAINERD_CONFIG_DIR }}/ocicrypt/ocicrypt_keyprovider.conf']\n"
  },
  {
    "path": "roles/containerd/templates/containerd.service.j2",
    "content": "[Unit]\nDescription=containerd container runtime\nDocumentation=https://containerd.io\nAfter=network.target\n\n[Service]\nEnvironment=\"PATH={{ bin_dir }}/containerd-bin:/bin:/sbin:/usr/bin:/usr/sbin\"\nExecStartPre=-/sbin/modprobe overlay\nExecStart={{ bin_dir }}/containerd-bin/containerd --log-level warn --config {{ CONTAINERD_CONFIG_DIR }}/config.toml\nRestart=always\nRestartSec=5\nDelegate=yes\nKillMode=process\nOOMScoreAdjust=-999\nLimitNOFILE=1048576\n# Having non-zero Limit*s causes performance problems due to accounting overhead\n# in the kernel. We recommend using cgroups to do container-local accounting.\nLimitNPROC=infinity\nLimitCORE=infinity\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/containerd/templates/crictl.yaml.j2",
    "content": "runtime-endpoint: unix://{{ CONTAINERD_STATE_DIR }}/containerd.sock\n"
  },
  {
    "path": "roles/containerd/templates/docker.io/hosts.toml.j2",
    "content": "#https://github.com/containerd/containerd/blob/main/docs/hosts.md\nserver = \"https://docker.io\"\n\n# 在网站查看当前可用的国内docker 镜像加速仓库\n# https://status.1panel.top/status/docker\n[host.\"https://docker.1ms.run\"]\n  capabilities = [\"pull\", \"resolve\"]\n\n[host.\"https://hub1.nat.tf\"]\n  capabilities = [\"pull\", \"resolve\"]\n\n[host.\"https://docker.1panel.live\"]\n  capabilities = [\"pull\", \"resolve\"]\n\n[host.\"https://hub.rat.dev\"]\n  capabilities = [\"pull\", \"resolve\"]\n\n[host.\"https://docker.amingg.com\"]\n  capabilities = [\"pull\", \"resolve\"]\n"
  },
  {
    "path": "roles/containerd/templates/easzlab.io.local:5000/hosts.toml.j2",
    "content": "#https://github.com/containerd/containerd/blob/main/docs/hosts.md\nserver = \"http://easzlab.io.local:5000\"\n\n[host.\"http://easzlab.io.local:5000\"]\n  capabilities = [\"pull\", \"resolve\"]\n  skip_verify = true\n"
  },
  {
    "path": "roles/containerd/templates/hosts.toml.j2",
    "content": "#https://github.com/containerd/containerd/blob/main/docs/hosts.md\nserver = \"{{ item }}\"\n\n[host.\"{{ item }}\"]\n  capabilities = [\"pull\", \"resolve\"]\n  skip_verify = true\n"
  },
  {
    "path": "roles/deploy/deploy.yml",
    "content": "# to create CA, kubeconfig, kube-proxy.kubeconfig etc.\n- hosts: localhost\n  roles:\n  - deploy\n"
  },
  {
    "path": "roles/deploy/tasks/add-custom-kubectl-kubeconfig.yml",
    "content": "- name: 创建自定义用户证书目录\n  file: name={{ cluster_dir }}/ssl/users/ state=directory\n\n- name: 准备CA配置文件\n  template: src=ca-config.json.j2 dest={{ cluster_dir }}/ssl/ca-config.json\n\n- name: 准备kubectl使用的{{ USER_NAME }}证书签名请求\n  template: src=user-csr.json.j2 dest={{ cluster_dir }}/ssl/users/{{ USER_NAME }}-csr.json\n\n- name: 创建{{ USER_NAME }}证书与私钥\n  shell: \"cd {{ cluster_dir }}/ssl/users && {{ base_dir }}/bin/cfssl gencert \\\n        -ca={{ cluster_dir }}/ssl/ca.pem \\\n        -ca-key={{ cluster_dir }}/ssl/ca-key.pem \\\n        -config={{ cluster_dir }}/ssl/ca-config.json \\\n        -profile=kcfg {{ USER_NAME }}-csr.json | {{ base_dir }}/bin/cfssljson -bare {{ USER_NAME }}\"\n\n- name: 设置集群参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-cluster {{ CLUSTER_NAME }} \\\n        --certificate-authority={{ cluster_dir }}/ssl/ca.pem \\\n        --embed-certs=true \\\n        --server={{ KUBE_APISERVER }} \\\n        --kubeconfig={{ cluster_dir }}/ssl/users/{{ USER_NAME }}.kubeconfig\"\n\n- name: 设置客户端认证参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-credentials {{ USER_NAME }} \\\n        --client-certificate={{ cluster_dir }}/ssl/users/{{ USER_NAME }}.pem \\\n        --embed-certs=true \\\n        --client-key={{ cluster_dir }}/ssl/users/{{ USER_NAME }}-key.pem \\\n        --kubeconfig={{ cluster_dir }}/ssl/users/{{ USER_NAME }}.kubeconfig\"\n\n- name: 设置上下文参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-context {{ CONTEXT_NAME }} \\\n        --cluster={{ CLUSTER_NAME }} --user={{ USER_NAME }} \\\n        --kubeconfig={{ cluster_dir }}/ssl/users/{{ USER_NAME }}.kubeconfig\"\n\n- name: 选择默认上下文\n  shell: \"{{ base_dir }}/bin/kubectl config use-context {{ CONTEXT_NAME }} \\\n        --kubeconfig={{ cluster_dir }}/ssl/users/{{ USER_NAME }}.kubeconfig\"\n\n- name: 生成clusterrolebind 配置文件\n  template: src=crb.yaml.j2 dest={{ cluster_dir }}/ssl/users/crb-{{ USER_NAME }}.yaml\n\n- name: 创建clusterrolebind 配置\n  shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/ssl/users/crb-{{ USER_NAME }}.yaml\"\n\n- debug: msg=\"查看{{ USER_NAME }}自定义kubeconfig：{{ cluster_dir }}/ssl/users/{{ USER_NAME }}.kubeconfig\" \n"
  },
  {
    "path": "roles/deploy/tasks/create-kube-controller-manager-kubeconfig.yml",
    "content": "- name: 准备kube-controller-manager 证书签名请求\n  template: src=kube-controller-manager-csr.json.j2 dest={{ cluster_dir }}/ssl/kube-controller-manager-csr.json\n\n- name: 创建 kube-controller-manager证书与私钥\n  shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n        -ca=ca.pem \\\n        -ca-key=ca-key.pem \\\n        -config=ca-config.json \\\n        -profile=kubernetes kube-controller-manager-csr.json | {{ base_dir }}/bin/cfssljson -bare kube-controller-manager\"\n\n- name: 设置集群参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-cluster kubernetes \\\n        --certificate-authority={{ cluster_dir }}/ssl/ca.pem \\\n        --embed-certs=true \\\n        --server={{ KUBE_APISERVER }} \\\n        --kubeconfig={{ cluster_dir }}/kube-controller-manager.kubeconfig\"\n\n- name: 设置认证参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-credentials system:kube-controller-manager \\\n        --client-certificate={{ cluster_dir }}/ssl/kube-controller-manager.pem \\\n        --client-key={{ cluster_dir }}/ssl/kube-controller-manager-key.pem \\\n        --embed-certs=true \\\n        --kubeconfig={{ cluster_dir }}/kube-controller-manager.kubeconfig\"\n\n- name: 设置上下文参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-context default \\\n        --cluster=kubernetes \\\n        --user=system:kube-controller-manager \\\n        --kubeconfig={{ cluster_dir }}/kube-controller-manager.kubeconfig\"\n\n- name: 选择默认上下文\n  shell: \"{{ base_dir }}/bin/kubectl config use-context default \\\n   --kubeconfig={{ cluster_dir }}/kube-controller-manager.kubeconfig\"\n"
  },
  {
    "path": "roles/deploy/tasks/create-kube-proxy-kubeconfig.yml",
    "content": "- name: 准备kube-proxy 证书签名请求\n  template: src=kube-proxy-csr.json.j2 dest={{ cluster_dir }}/ssl/kube-proxy-csr.json\n\n- name: 创建 kube-proxy证书与私钥\n  shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n        -ca=ca.pem \\\n        -ca-key=ca-key.pem \\\n        -config=ca-config.json \\\n        -profile=kubernetes kube-proxy-csr.json | {{ base_dir }}/bin/cfssljson -bare kube-proxy\"\n\n- name: 设置集群参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-cluster kubernetes \\\n        --certificate-authority={{ cluster_dir }}/ssl/ca.pem \\\n        --embed-certs=true \\\n        --server={{ KUBE_APISERVER }} \\\n        --kubeconfig={{ cluster_dir }}/kube-proxy.kubeconfig\"\n\n- name: 设置客户端认证参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-credentials kube-proxy \\\n        --client-certificate={{ cluster_dir }}/ssl/kube-proxy.pem \\\n        --client-key={{ cluster_dir }}/ssl/kube-proxy-key.pem \\\n        --embed-certs=true \\\n        --kubeconfig={{ cluster_dir }}/kube-proxy.kubeconfig\"\n\n- name: 设置上下文参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-context default \\\n        --cluster=kubernetes \\\n        --user=kube-proxy \\\n        --kubeconfig={{ cluster_dir }}/kube-proxy.kubeconfig\"\n\n- name: 选择默认上下文\n  shell: \"{{ base_dir }}/bin/kubectl config use-context default \\\n   --kubeconfig={{ cluster_dir }}/kube-proxy.kubeconfig\"\n"
  },
  {
    "path": "roles/deploy/tasks/create-kube-scheduler-kubeconfig.yml",
    "content": "- name: 准备kube-scheduler 证书签名请求\n  template: src=kube-scheduler-csr.json.j2 dest={{ cluster_dir }}/ssl/kube-scheduler-csr.json\n\n- name: 创建 kube-scheduler证书与私钥\n  shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n        -ca=ca.pem \\\n        -ca-key=ca-key.pem \\\n        -config=ca-config.json \\\n        -profile=kubernetes kube-scheduler-csr.json | {{ base_dir }}/bin/cfssljson -bare kube-scheduler\"\n\n- name: 设置集群参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-cluster kubernetes \\\n        --certificate-authority={{ cluster_dir }}/ssl/ca.pem \\\n        --embed-certs=true \\\n        --server={{ KUBE_APISERVER }} \\\n        --kubeconfig={{ cluster_dir }}/kube-scheduler.kubeconfig\"\n\n- name: 设置认证参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-credentials system:kube-scheduler \\\n        --client-certificate={{ cluster_dir }}/ssl/kube-scheduler.pem \\\n        --client-key={{ cluster_dir }}/ssl/kube-scheduler-key.pem \\\n        --embed-certs=true \\\n        --kubeconfig={{ cluster_dir }}/kube-scheduler.kubeconfig\"\n\n- name: 设置上下文参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-context default \\\n        --cluster=kubernetes \\\n        --user=system:kube-scheduler \\\n        --kubeconfig={{ cluster_dir }}/kube-scheduler.kubeconfig\"\n\n- name: 选择默认上下文\n  shell: \"{{ base_dir }}/bin/kubectl config use-context default \\\n   --kubeconfig={{ cluster_dir }}/kube-scheduler.kubeconfig\"\n"
  },
  {
    "path": "roles/deploy/tasks/create-kubectl-kubeconfig.yml",
    "content": "- name: 准备kubectl使用的admin证书签名请求\n  template: src=admin-csr.json.j2 dest={{ cluster_dir }}/ssl/admin-csr.json\n\n- name: 创建admin证书与私钥\n  shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n        -ca=ca.pem \\\n        -ca-key=ca-key.pem \\\n        -config=ca-config.json \\\n        -profile=kubernetes admin-csr.json | {{ base_dir }}/bin/cfssljson -bare admin\"\n\n- name: 设置集群参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-cluster {{ CLUSTER_NAME }} \\\n        --certificate-authority={{ cluster_dir }}/ssl/ca.pem \\\n        --embed-certs=true \\\n        --server={{ KUBE_APISERVER }} \\\n        --kubeconfig={{ cluster_dir }}/kubectl.kubeconfig\"\n\n- name: 设置客户端认证参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-credentials admin \\\n        --client-certificate={{ cluster_dir }}/ssl/admin.pem \\\n        --embed-certs=true \\\n        --client-key={{ cluster_dir }}/ssl/admin-key.pem \\\n        --kubeconfig={{ cluster_dir }}/kubectl.kubeconfig\"\n\n- name: 设置上下文参数\n  shell: \"{{ base_dir }}/bin/kubectl config set-context {{ CONTEXT_NAME }} \\\n        --cluster={{ CLUSTER_NAME }} --user=admin \\\n        --kubeconfig={{ cluster_dir }}/kubectl.kubeconfig\"\n\n- name: 选择默认上下文\n  shell: \"{{ base_dir }}/bin/kubectl config use-context {{ CONTEXT_NAME }} \\\n        --kubeconfig={{ cluster_dir }}/kubectl.kubeconfig\"\n\n- name: 安装kubeconfig\n  copy: src={{ cluster_dir }}/kubectl.kubeconfig dest=~/.kube/config mode=0400\n"
  },
  {
    "path": "roles/deploy/tasks/main.yml",
    "content": "- name: prepare some dirs\n  file: name={{ item }} state=directory\n  with_items:\n  - \"{{ cluster_dir }}/ssl\"\n  - \"{{ cluster_dir }}/backup\"\n  - \"{{ cluster_dir }}/yml\"\n  - \"~/.kube\"\n\n- name: 本地设置 bin 目录权限\n  file: path={{ base_dir }}/bin state=directory mode=0755 recurse=yes\n\n# 注册变量p，根据p的stat信息判断是否已经生成过ca证书，如果没有，下一步生成证书\n# 如果已经有ca证书，为了保证整个安装的幂等性，跳过证书生成的步骤\n- name: 读取ca证书stat信息\n  stat: path=\"{{ cluster_dir }}/ssl/ca.pem\"\n  register: p\n  tags: force_change_certs\n\n- name: 准备CA配置文件和签名请求\n  template: src={{ item }}.j2 dest={{ cluster_dir }}/ssl/{{ item }}\n  with_items:\n  - \"ca-config.json\"\n  - \"ca-csr.json\"\n  when: \"p.stat.isreg is not defined or CHANGE_CA|bool\"\n  tags: force_change_certs\n\n- name: 生成 CA 证书和私钥\n  when: \"p.stat.isreg is not defined or CHANGE_CA|bool\"\n  tags: force_change_certs\n  shell: \"cd {{ cluster_dir }}/ssl && \\\n\t {{ base_dir }}/bin/cfssl gencert -initca ca-csr.json | {{ base_dir }}/bin/cfssljson -bare ca\" \n\n#----------- 创建配置文件: kubectl.kubeconfig\n- import_tasks: create-kubectl-kubeconfig.yml\n  tags: create_kctl_cfg, force_change_certs\n\n#----------- 创建个性化客户端配置文件\n- import_tasks: add-custom-kubectl-kubeconfig.yml\n  tags: add-kcfg, force_change_certs\n  when: \"ADD_KCFG|bool\"\n\n#------------创建配置文件: kube-proxy.kubeconfig\n- import_tasks: create-kube-proxy-kubeconfig.yml\n  tags: force_change_certs\n\n#------------创建配置文件: kube-controller-manager.kubeconfig\n- import_tasks: create-kube-controller-manager-kubeconfig.yml\n  tags: force_change_certs\n\n#------------创建配置文件: kube-scheduler.kubeconfig\n- import_tasks: create-kube-scheduler-kubeconfig.yml\n  tags: force_change_certs\n\n# ansible 控制端一些易用性配置\n- name: 本地创建 ezdown/ezctl 工具的软连接\n  file: src={{ base_dir }}/{{ item }} dest=/usr/bin/{{ item }} state=link\n  with_items:\n  - ezdown\n  - ezctl\n\n- name: ansible 控制端创建 kubectl 软链接\n  file: src={{ base_dir }}/bin/kubectl dest=/usr/bin/kubectl state=link\n  ignore_errors: true\n"
  },
  {
    "path": "roles/deploy/templates/admin-csr.json.j2",
    "content": "{\n  \"CN\": \"admin\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"system:masters\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/deploy/templates/ca-config.json.j2",
    "content": "{\n  \"signing\": {\n    \"default\": {\n      \"expiry\": \"{{ CERT_EXPIRY }}\"\n    },\n    \"profiles\": {\n      \"kubernetes\": {\n        \"usages\": [\n            \"signing\",\n            \"key encipherment\",\n            \"server auth\",\n            \"client auth\"\n        ],\n        \"expiry\": \"{{ CERT_EXPIRY }}\"\n      },\n      \"kcfg\": {\n        \"usages\": [\n            \"signing\",\n            \"key encipherment\",\n            \"client auth\"\n        ],\n        \"expiry\": \"{{ CUSTOM_EXPIRY }}\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "roles/deploy/templates/ca-csr.json.j2",
    "content": "{\n  \"CN\": \"kubernetes-ca\",\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ],\n  \"ca\": {\n    \"expiry\": \"{{ CA_EXPIRY }}\"\n  }\n}\n"
  },
  {
    "path": "roles/deploy/templates/crb.yaml.j2",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: crb-{{ USER_NAME }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n{% if USER_TYPE == 'admin' %}\n  name: cluster-admin\n{% else %}\n  name: view\n{% endif %}\nsubjects:\n- kind: User\n  name: {{ USER_NAME }}\n  apiGroup: rbac.authorization.k8s.io\n"
  },
  {
    "path": "roles/deploy/templates/kube-controller-manager-csr.json.j2",
    "content": "{\n  \"CN\": \"system:kube-controller-manager\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"system:kube-controller-manager\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/deploy/templates/kube-proxy-csr.json.j2",
    "content": "{\n  \"CN\": \"system:kube-proxy\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/deploy/templates/kube-scheduler-csr.json.j2",
    "content": "{\n  \"CN\": \"system:kube-scheduler\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"system:kube-scheduler\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/deploy/templates/user-csr.json.j2",
    "content": "{\n  \"CN\": \"{{ USER_NAME }}\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/deploy/vars/main.yml",
    "content": "# apiserver 默认第一个master节点\nKUBE_APISERVER: \"https://{{ groups['kube_master'][0] }}:{{ SECURE_PORT }}\"\n\n#\nADD_KCFG: false\nCUSTOM_EXPIRY: \"438000h\"\n"
  },
  {
    "path": "roles/docker/tasks/main.yml",
    "content": "- name: 获取是否已经安装docker\n  shell: 'systemctl is-active docker || echo \"NoFound\"'\n  register: docker_svc\n\n- name: 获取docker版本信息\n  shell: \"{{ base_dir }}/bin/docker-bin/dockerd --version|cut -d' ' -f3\"\n  register: docker_ver\n  connection: local\n  run_once: true\n  tags: upgrade_docker, download_docker\n\n- name: debug info\n  debug: var=\"docker_ver\"\n  connection: local\n  run_once: true\n  tags: upgrade_docker, download_docker\n\n- name: 转换docker版本信息为浮点数\n  set_fact:\n    DOCKER_VER: \"{{ docker_ver.stdout.split('.')[0]|int + docker_ver.stdout.split('.')[1]|int/100 }}\"\n  connection: local\n  run_once: true\n  tags: upgrade_docker, download_docker\n\n- name: 已安装提示\n  debug:\n    msg: \"docker 服务已安装\"\n  when: \"'NoFound' not in docker_svc.stdout\" \n\n- block:\n    - name: 准备docker相关目录\n      file: name={{ item }} state=directory\n      with_items:\n      - \"{{ bin_dir }}/docker-bin\"\n      - \"/etc/docker\"\n    \n    - name: 下载 docker 二进制文件\n      copy: src={{ item }} dest={{ bin_dir }}/docker-bin/ mode=0755\n      with_fileglob:\n      - \"{{ base_dir }}/bin/docker-bin/*\"\n      tags: upgrade_docker, download_docker\n    \n    - name: 配置docker daemon\n      template: src=daemon.json.j2 dest=/etc/docker/daemon.json\n    \n    - name: 创建docker的systemd unit文件\n      template: src=docker.service.j2 dest=/etc/systemd/system/docker.service\n      tags: upgrade_docker, download_docker\n    \n    - name: 开机启用docker 服务\n      shell: systemctl enable docker\n      ignore_errors: true\n    \n    - name: 开启docker 服务\n      shell: systemctl daemon-reload && systemctl restart docker\n      tags: upgrade_docker\n\n    - name: 轮询等待docker服务运行\n      shell: \"systemctl is-active docker.service\"\n      register: docker_status\n      until: '\"active\" in docker_status.stdout'\n      retries: 8\n      delay: 2\n      tags: upgrade_docker\n    \n    # 配置 docker 命令软链接，方便单独安装 docker\n    - name: 配置 docker 命令软链接\n      file: src={{ bin_dir }}/docker-bin/docker dest=/usr/bin/docker state=link\n      ignore_errors: true\n  when: \"'NoFound' in docker_svc.stdout\"\n"
  },
  {
    "path": "roles/docker/templates/daemon.json.j2",
    "content": "{\n  \"data-root\": \"{{ DOCKER_STORAGE_DIR }}\",\n  \"exec-opts\": [\"native.cgroupdriver={{ CGROUP_DRIVER }}\"],\n{% if ENABLE_MIRROR_REGISTRY %}\n  \"registry-mirrors\": [\n    \"https://docker.1ms.run\",\n    \"https://hub1.nat.tf\",\n    \"https://docker.1panel.live\",\n    \"https://hub.rat.dev\",\n    \"https://docker.amingg.com\"\n  ], \n{% endif %}\n{% if DOCKER_ENABLE_REMOTE_API %}\n  \"hosts\": [\"tcp://0.0.0.0:2376\", \"unix:///var/run/docker.sock\"],\n{% endif %}\n  \"insecure-registries\": [{{ INSECURE_REG_STRING }}],\n  \"max-concurrent-downloads\": 10,\n  \"live-restore\": true,\n  \"log-driver\": \"json-file\",\n  \"log-level\": \"warn\",\n  \"log-opts\": {\n    \"max-size\": \"50m\",\n    \"max-file\": \"1\"\n    },\n  \"storage-driver\": \"overlay2\"\n}\n"
  },
  {
    "path": "roles/docker/templates/docker.service.j2",
    "content": "[Unit]\nDescription=Docker Application Container Engine\n\n[Service]\nEnvironment=\"PATH={{ bin_dir }}/docker-bin:/bin:/sbin:/usr/bin:/usr/sbin\"\nExecStartPre=/bin/sh -c 'groupadd docker > /dev/null 2>&1 || echo \"\"'\nExecStart={{ bin_dir }}/docker-bin/dockerd\n#ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT\nExecReload=/bin/kill -s HUP $MAINPID\nRestart=on-failure\nRestartSec=5\nLimitNOFILE=infinity\nLimitNPROC=infinity\nLimitCORE=infinity\nDelegate=yes\nKillMode=process\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/docker/vars/main.yml",
    "content": "# cgroup driver\nCGROUP_DRIVER: \"{%- if DOCKER_VER|float >= 20.10 -%} \\\n                     systemd \\\n                {%- else -%} \\\n                     cgroupfs \\\n                {%- endif -%}\"\n\n#\nINSECURE_REG_STR: \"{% for reg in INSECURE_REG %}\\\"{{ reg.split('/')[2] }}\\\",{% endfor %}\"\nINSECURE_REG_STRING: \"{{ INSECURE_REG_STR.rstrip(',') }}\"\n"
  },
  {
    "path": "roles/etcd/clean-etcd.yml",
    "content": "# WARNNING: clean 'etcd' nodes service & data\n- hosts:\n  - etcd\n  tasks:\n  - name: stop and disable etcd service\n    service:\n      name: etcd\n      state: stopped\n      enabled: no\n    ignore_errors: true\n\n  - name: remove files and dirs\n    file: name={{ item }} state=absent\n    with_items:\n    - {{ ETCD_DATA_DIR }}\n    - {{ ETCD_WAL_DIR }}\n    - \"/backup/k8s\"\n    - \"/etc/systemd/system/etcd.service\"\n"
  },
  {
    "path": "roles/etcd/defaults/main.yml",
    "content": "# etcd 集群间通信的IP和端口, 根据etcd组成员自动生成\nTMP_NODES: \"{% for h in groups['etcd'] %}etcd-{{ h }}=https://{{ h }}:2380,{% endfor %}\"\nETCD_NODES: \"{{ TMP_NODES.rstrip(',') }}\"\n\n# etcd 集群初始状态 new/existing\nCLUSTER_STATE: \"new\"\n"
  },
  {
    "path": "roles/etcd/tasks/main.yml",
    "content": "- name: prepare basic dirs\n  file: name={{ item }} state=directory\n  with_items:\n  - \"{{ bin_dir }}\"\n  - \"{{ ca_dir }}\"\n\n- name: prepare data dirs\n  file: name={{ ETCD_DATA_DIR }} state=directory mode=0700\n\n- name: 下载etcd二进制文件\n  copy: src={{ base_dir }}/bin/{{ item }} dest={{ bin_dir }}/{{ item }} mode=0755\n  with_items:\n  - etcd\n  - etcdctl\n  - etcdutl\n  tags: upgrade_etcd\n\n- name: 创建etcd证书请求\n  template: src=etcd-csr.json.j2 dest={{ cluster_dir }}/ssl/etcd-csr.json\n  connection: local\n  run_once: true\n  tags: force_change_certs\n\n- name: 创建 etcd证书和私钥\n  shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n        -ca=ca.pem \\\n        -ca-key=ca-key.pem \\\n        -config=ca-config.json \\\n        -profile=kubernetes etcd-csr.json | {{ base_dir }}/bin/cfssljson -bare etcd\"\n  connection: local\n  run_once: true\n  tags: force_change_certs\n\n- name: 分发etcd证书相关\n  copy: src={{ cluster_dir }}/ssl/{{ item }} dest={{ ca_dir }}/{{ item }}\n  with_items:\n  - ca.pem\n  - etcd.pem\n  - etcd-key.pem\n  tags: force_change_certs\n\n- name: 创建etcd的systemd unit文件\n  template: src=etcd.service.j2 dest=/etc/systemd/system/etcd.service\n  tags: upgrade_etcd, restart_etcd\n\n- name: 开机启用etcd服务\n  shell: systemctl enable etcd\n  ignore_errors: true\n\n- name: 开启etcd服务\n  shell: systemctl daemon-reload && systemctl restart etcd\n  ignore_errors: true\n  tags: upgrade_etcd, restart_etcd, force_change_certs\n\n- name: 以轮询的方式等待服务同步完成\n  shell: \"systemctl is-active etcd.service\"\n  register: etcd_status\n  until: '\"active\" in etcd_status.stdout'\n  retries: 8\n  delay: 8\n  tags: upgrade_etcd, restart_etcd, force_change_certs\n"
  },
  {
    "path": "roles/etcd/templates/etcd-csr.json.j2",
    "content": "{\n  \"CN\": \"etcd\",\n  \"hosts\": [\n{% for host in groups['etcd'] %}\n    \"{{ host }}\",\n{% endfor %}\n    \"127.0.0.1\"\n  ],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/etcd/templates/etcd.service.j2",
    "content": "[Unit]\nDescription=Etcd Server\nAfter=network.target\nAfter=network-online.target\nWants=network-online.target\nDocumentation=https://github.com/coreos\n\n[Service]\nType=notify\nWorkingDirectory={{ ETCD_DATA_DIR }}\nExecStart={{ bin_dir }}/etcd \\\n  --name=etcd-{{ inventory_hostname }} \\\n  --cert-file={{ ca_dir }}/etcd.pem \\\n  --key-file={{ ca_dir }}/etcd-key.pem \\\n  --peer-cert-file={{ ca_dir }}/etcd.pem \\\n  --peer-key-file={{ ca_dir }}/etcd-key.pem \\\n  --trusted-ca-file={{ ca_dir }}/ca.pem \\\n  --peer-trusted-ca-file={{ ca_dir }}/ca.pem \\\n  --initial-advertise-peer-urls=https://{{ inventory_hostname }}:2380 \\\n  --listen-peer-urls=https://{{ inventory_hostname }}:2380 \\\n  --listen-client-urls=https://{{ inventory_hostname }}:2379,http://127.0.0.1:2379 \\\n  --advertise-client-urls=https://{{ inventory_hostname }}:2379 \\\n  --initial-cluster-token=etcd-cluster-0 \\\n  --initial-cluster={{ ETCD_NODES }} \\\n  --initial-cluster-state={{ CLUSTER_STATE }} \\\n  --data-dir={{ ETCD_DATA_DIR }} \\\n  --wal-dir={{ ETCD_WAL_DIR }} \\\n  --snapshot-count=50000 \\\n  --auto-compaction-retention=1 \\\n  --auto-compaction-mode=periodic \\\n  --max-request-bytes=10485760 \\\n  --quota-backend-bytes=8589934592\nRestart=always\nRestartSec=15\nLimitNOFILE=65536\nOOMScoreAdjust=-999\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/ex-lb/clean-ex-lb.yml",
    "content": "- hosts:\n  - ex-lb\n  tasks:\n  - name: get service info\n    shell: 'systemctl list-units --type=service |grep -E \"l4lb|keepalived|ssh\"'\n    register: service_info\n\n  - name: remove service l4lb\n    service: name=l4lb state=stopped enabled=no\n    when: '\"l4lb\" in service_info.stdout'\n    ignore_errors: true\n\n  - name: remove service keepalived\n    service: name=keepalived state=stopped enabled=no\n    when: '\"keepalived\" in service_info.stdout'\n    ignore_errors: true\n\n  - name: remove files and dirs\n    file: name={{ item }} state=absent\n    with_items:\n    - \"/etc/l4lb\"\n    - \"/etc/keepalived\"\n    - \"/etc/systemd/system/l4lb.service\"\n    - \"/etc/systemd/system/keepalived.service\"\n    - \"/usr/local/sbin/keepalived\"\n"
  },
  {
    "path": "roles/ex-lb/defaults/main.yml",
    "content": "# 区分多个instance的VRRP组播，同网段不能重复，取值在0-255之间\n# 因项目已设置vrrp报文单播模式，所以这个ROUTER_ID 即便同网段里面有重复也没关系\nROUTER_ID: 222\n\n# 启用 ingress NodePort服务的负载均衡 (yes/no)\nINGRESS_NODEPORT_LB: \"no\"\n\n# ingress NodePort 的端口号\nINGRESS_NODEPORT_LB_PORT: 23456\n\n# 启用 ingress tls NodePort服务的负载均衡 (yes/no)\nINGRESS_TLS_NODEPORT_LB: \"no\"\n\n# ingress tls NodePort 的端口号\nINGRESS_TLS_NODEPORT_LB_PORT: 23457\n"
  },
  {
    "path": "roles/ex-lb/ex-lb.yml",
    "content": "- hosts: ex_lb\n  roles:\n  - ex-lb\n"
  },
  {
    "path": "roles/ex-lb/tasks/main.yml",
    "content": "# 自动设置LB节点变量'LB_IF'\n- name: 注册变量 LB_IF_TMP\n  shell: \"ip a|grep '{{ inventory_hostname }}/'|awk '{print $NF}'\"\n  register: LB_IF_TMP\n  tags: restart_lb\n\n- name: 设置变量 LB_IF\n  set_fact: LB_IF={{ LB_IF_TMP.stdout }}\n  tags: restart_lb\n\n- name: prepare some dirs\n  file: name={{ item }} state=directory\n  with_items:\n  - \"/etc/l4lb/sbin\"\n  - \"/etc/l4lb/logs\"\n  - \"/etc/l4lb/conf\"\n  - \"/etc/keepalived\"\n\n- name: 下载二进制文件l4lb(nginx)\n  copy: src={{ base_dir }}/bin/nginx dest=/etc/l4lb/sbin/l4lb mode=0755\n\n- name: 创建l4lb的配置文件\n  template: src=l4lb.conf.j2 dest=/etc/l4lb/conf/l4lb.conf\n  tags: restart_lb\n\n- name: 创建l4lb的systemd unit文件\n  template: src=l4lb.service.j2 dest=/etc/systemd/system/l4lb.service\n  tags: restart_lb\n\n- name: 开机启用l4lb服务\n  shell: systemctl enable l4lb\n  ignore_errors: true\n\n- name: 开启l4lb服务\n  shell: systemctl daemon-reload && systemctl restart l4lb\n  ignore_errors: true\n  tags: restart_lb\n\n- name: 以轮询的方式等待l4lb服务启动\n  shell: \"systemctl is-active l4lb.service\"\n  register: svc_status\n  until: '\"active\" in svc_status.stdout'\n  retries: 3\n  delay: 3\n  tags: restart_lb\n\n\n- name: 下载二进制文件keepalived\n  copy: src={{ base_dir }}/bin/keepalived dest=/usr/local/sbin/keepalived mode=0755\n\n- name: 配置 keepalived 主节点\n  template: src=keepalived-master.conf.j2 dest=/etc/keepalived/keepalived.conf\n  when: LB_ROLE == \"master\"\n  tags: restart_lb\n\n- name: 配置 keepalived 备节点\n  template: src=keepalived-backup.conf.j2 dest=/etc/keepalived/keepalived.conf\n  when: LB_ROLE == \"backup\"\n  tags: restart_lb\n\n- name: 创建keepalived的systemd unit文件\n  template: src=keepalived.service.j2 dest=/etc/systemd/system/keepalived.service\n  tags: restart_lb\n\n- name: 开机启用keepalived服务\n  shell: systemctl enable keepalived\n  ignore_errors: true\n\n- name: 开启keepalived服务\n  shell: systemctl daemon-reload && systemctl restart keepalived\n  ignore_errors: true\n  tags: restart_lb\n\n- name: 以轮询的方式等待keepalived服务启动\n  shell: \"systemctl is-active keepalived.service\"\n  register: svc_status\n  until: '\"active\" in svc_status.stdout'\n  retries: 3\n  delay: 3\n  tags: restart_lb\n\n- name: 检查 ex-lb 的 kube-apiserver 是否正常\n  uri:\n    url: \"https://{{ EX_APISERVER_VIP }}:{{ EX_APISERVER_PORT }}\"\n    validate_certs: no\n    client_cert: \"{{ cluster_dir }}/ssl/admin.pem\"\n    client_key: \"{{ cluster_dir }}/ssl/admin-key.pem\"\n  register: result\n  until: result.status == 200\n  retries: 2\n  delay: 5\n  run_once: true\n  connection: local\n\n# - debug: var=\"result\""
  },
  {
    "path": "roles/ex-lb/templates/keepalived-backup.conf.j2",
    "content": "global_defs {\n}\n\nvrrp_track_process check-l4lb {\n    process l4lb\n    weight -60\n    delay 3\n}\n\nvrrp_instance VI-01 {\n    state BACKUP\n    priority {{ 119 | random(61, 1) }}\n    unicast_src_ip {{ inventory_hostname }}\n    unicast_peer {\n{% for h in groups['ex_lb'] %}{% if h != inventory_hostname %}\n        {{ h }}\n{% endif %}{% endfor %}\n    }\n    dont_track_primary\n    interface {{ LB_IF }}\n    virtual_router_id {{ ROUTER_ID }} \n    advert_int 3\n    track_process {\n        check-l4lb\n    }\n    virtual_ipaddress {\n        {{ EX_APISERVER_VIP }}\n    }\n}\n"
  },
  {
    "path": "roles/ex-lb/templates/keepalived-master.conf.j2",
    "content": "global_defs {\n}\n\nvrrp_track_process check-l4lb {\n    process l4lb\n    weight -60\n    delay 3\n}\n\nvrrp_instance VI-01 {\n    state MASTER\n    priority 120\n    unicast_src_ip {{ inventory_hostname }}\n    unicast_peer {\n{% for h in groups['ex_lb'] %}{% if h != inventory_hostname %}\n        {{ h }}\n{% endif %}{% endfor %}\n    }\n    dont_track_primary\n    interface {{ LB_IF }}\n    virtual_router_id {{ ROUTER_ID }}\n    advert_int 3\n    track_process {\n        check-l4lb\n    }\n    virtual_ipaddress {\n        {{ EX_APISERVER_VIP }}\n    }\n}\n"
  },
  {
    "path": "roles/ex-lb/templates/keepalived.service.j2",
    "content": "[Unit]\nDescription=VRRP High Availability Monitor\nAfter=network-online.target syslog.target\nWants=network-online.target\nDocumentation=https://keepalived.org/manpage.html\n\n[Service]\nType=forking\nKillMode=process\nExecStart=/usr/local/sbin/keepalived -D -f /etc/keepalived/keepalived.conf\nExecReload=/bin/kill -HUP $MAINPID\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/ex-lb/templates/l4lb.conf.j2",
    "content": "user root;\nworker_processes 1;\n\nerror_log  /etc/l4lb/logs/error.log warn;\n\nevents {\n    worker_connections  3000;\n}\n\nstream {\n    upstream apiservers {\n{% for host in groups['kube_master'] %}\n        server {{ host }}:{{ SECURE_PORT }}    max_fails=2 fail_timeout=3s;\n{% endfor %}\n    }\n\n    server {\n        listen 0.0.0.0:{{ EX_APISERVER_PORT }};\n        proxy_connect_timeout 1s;\n        proxy_pass apiservers;\n    }\n{% if INGRESS_NODEPORT_LB == \"yes\" %}\n\n    upstream ingress-nodes {\n{% if groups['kube_node']|length > 3 %}\n       server {{ groups['kube_node'][0] }}:{{ INGRESS_NODEPORT_LB_PORT }}    max_fails=2 fail_timeout=3s;\n       server {{ groups['kube_node'][1] }}:{{ INGRESS_NODEPORT_LB_PORT }}    max_fails=2 fail_timeout=3s;\n       server {{ groups['kube_node'][2] }}:{{ INGRESS_NODEPORT_LB_PORT }}    max_fails=2 fail_timeout=3s;\n{% else %}\n{% for host in groups['kube_node'] %}\n       server {{ host }}:{{ INGRESS_NODEPORT_LB_PORT }}    max_fails=2 fail_timeout=3s;\n{% endfor %}\n{% endif %}\n    }\n\n    server {\n        listen 0.0.0.0:80;\n        proxy_connect_timeout 1s;\n        proxy_pass ingress-nodes;\n    }\n{% endif %}\n{% if INGRESS_TLS_NODEPORT_LB == \"yes\" %}\n\n    upstream ingress-tls-nodes {\n{% if groups['kube_node']|length > 3 %}\n       server {{ groups['kube_node'][0] }}:{{ INGRESS_TLS_NODEPORT_LB_PORT }}    max_fails=2 fail_timeout=3s;\n       server {{ groups['kube_node'][1] }}:{{ INGRESS_TLS_NODEPORT_LB_PORT }}    max_fails=2 fail_timeout=3s;\n       server {{ groups['kube_node'][2] }}:{{ INGRESS_TLS_NODEPORT_LB_PORT }}    max_fails=2 fail_timeout=3s;\n{% else %}\n{% for host in groups['kube_node'] %}\n       server {{ host }}:{{ INGRESS_TLS_NODEPORT_LB_PORT }}    max_fails=2 fail_timeout=3s;\n{% endfor %}\n{% endif %}\n    }\n\n    server {\n        listen 0.0.0.0:443;\n        proxy_connect_timeout 1s;\n        proxy_pass ingress-tls-nodes;\n    }\n{% endif %}\n}\n"
  },
  {
    "path": "roles/ex-lb/templates/l4lb.service.j2",
    "content": "[Unit]\nDescription=l4 nginx proxy\nAfter=network.target\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=forking\nExecStartPre=/etc/l4lb/sbin/l4lb -c /etc/l4lb/conf/l4lb.conf -p /etc/l4lb -t\nExecStart=/etc/l4lb/sbin/l4lb -c /etc/l4lb/conf/l4lb.conf -p /etc/l4lb\nExecReload=/etc/l4lb/sbin/l4lb -c /etc/l4lb/conf/l4lb.conf -p /etc/l4lb -s reload\nPrivateTmp=true\nRestart=always\nRestartSec=15\nStartLimitInterval=0\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/flannel/tasks/main.yml",
    "content": "- name: 配置 flannel DaemonSet yaml文件\n  template: src=kube-flannel.yaml.j2 dest={{ cluster_dir }}/yml/flannel.yaml\n  run_once: true\n  connection: local\n\n- name: 删除 flannel网络\n  shell: \"{{ base_dir }}/bin/kubectl delete -f {{ cluster_dir }}/yml/flannel.yaml || echo true; sleep 3\"\n  run_once: true\n  connection: local\n  tags: force_change_certs\n  when: 'CHANGE_CA|bool'\n\n- name: 运行 flannel网络\n  shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/flannel.yaml\"\n  run_once: true\n  connection: local\n  tags: force_change_certs\n\n- name: 删除默认cni配置\n  file: path=/etc/cni/net.d/10-default.conf state=absent\n\n- name: 轮询等待flannel 运行，视下载镜像速度而定\n  shell: \"{{ base_dir }}/bin/kubectl get pod -n kube-system -o wide|grep 'flannel'|grep ' {{ K8S_NODENAME }} '|awk '{print $3}'\"\n  register: pod_status\n  until: pod_status.stdout == \"Running\"\n  retries: 15\n  delay: 8\n  ignore_errors: true\n  connection: local\n  tags: force_change_certs\n"
  },
  {
    "path": "roles/flannel/templates/kube-flannel.yaml.j2",
    "content": "---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    k8s-app: flannel\n  name: flannel\n  namespace: kube-system\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  labels:\n    k8s-app: flannel\n  name: flannel\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - pods\n  verbs:\n  - get\n- apiGroups:\n  - \"\"\n  resources:\n  - nodes\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - \"\"\n  resources:\n  - nodes/status\n  verbs:\n  - patch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  labels:\n    k8s-app: flannel\n  name: flannel\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: flannel\nsubjects:\n- kind: ServiceAccount\n  name: flannel\n  namespace: kube-system\n---\napiVersion: v1\ndata:\n  cni-conf.json: |\n    {\n      \"name\": \"cbr0\",\n      \"cniVersion\": \"0.3.1\",\n      \"plugins\": [\n        {\n          \"type\": \"flannel\",\n          \"delegate\": {\n            \"hairpinMode\": true,\n            \"isDefaultGateway\": true\n          }\n        },\n        {\n          \"type\": \"portmap\",\n          \"capabilities\": {\n            \"portMappings\": true\n          }\n        }\n      ]\n    }\n  net-conf.json: |\n    {\n      \"Network\": \"{{ CLUSTER_CIDR }}\",\n      \"EnableNFTables\": false,\n      \"Backend\": {\n{% if FLANNEL_BACKEND == \"vxlan\" and DIRECT_ROUTING %}\n        \"DirectRouting\": true,\n{% endif %}\n        \"Type\": \"{{ FLANNEL_BACKEND }}\"\n      }\n    }\nkind: ConfigMap\nmetadata:\n  labels:\n    app: flannel\n    k8s-app: flannel\n    tier: node\n  name: kube-flannel-cfg\n  namespace: kube-system\n---\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  labels:\n    app: flannel\n    k8s-app: flannel\n    tier: node\n  name: kube-flannel-ds\n  namespace: kube-system\nspec:\n  selector:\n    matchLabels:\n      app: flannel\n      k8s-app: flannel\n  template:\n    metadata:\n      labels:\n        app: flannel\n        k8s-app: flannel\n        tier: node\n    spec:\n      affinity:\n        nodeAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            nodeSelectorTerms:\n            - matchExpressions:\n              - key: kubernetes.io/os\n                operator: In\n                values:\n                - linux\n      containers:\n      - args:\n        - --ip-masq\n        - --kube-subnet-mgr\n        command:\n        - /opt/bin/flanneld\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n        - name: EVENT_QUEUE_DEPTH\n          value: \"5000\"\n        - name: CONT_WHEN_CACHE_NOT_READY\n          value: \"false\"\n        #image: ghcr.io/flannel-io/flannel:v0.27.3\n        image: easzlab.io.local:5000/flannel/flannel:{{ flannel_ver }}\n        name: kube-flannel\n        resources:\n          requests:\n            cpu: 100m\n            memory: 50Mi\n        securityContext:\n          capabilities:\n            add:\n            - NET_ADMIN\n            - NET_RAW\n          privileged: false\n        volumeMounts:\n        - mountPath: /run/flannel\n          name: run\n        - mountPath: /etc/kube-flannel/\n          name: flannel-cfg\n        - mountPath: /run/xtables.lock\n          name: xtables-lock\n      hostNetwork: true\n      initContainers:\n      - args:\n        - -f\n        - /flannel\n        - /opt/cni/bin/flannel\n        command:\n        - cp\n        image: easzlab.io.local:5000/flannel/flannel-cni-plugin:v1.7.1-flannel1\n        name: install-cni-plugin\n        volumeMounts:\n        - mountPath: /opt/cni/bin\n          name: cni-plugin\n      - args:\n        - -f\n        - /etc/kube-flannel/cni-conf.json\n        - /etc/cni/net.d/10-flannel.conflist\n        command:\n        - cp\n        image: easzlab.io.local:5000/flannel/flannel:{{ flannel_ver }}\n        name: install-cni\n        volumeMounts:\n        - mountPath: /etc/cni/net.d\n          name: cni\n        - mountPath: /etc/kube-flannel/\n          name: flannel-cfg\n      priorityClassName: system-node-critical\n      serviceAccountName: flannel\n      tolerations:\n      - effect: NoSchedule\n        operator: Exists\n      volumes:\n      - hostPath:\n          path: /run/flannel\n        name: run\n      - hostPath:\n          path: /opt/cni/bin\n        name: cni-plugin\n      - hostPath:\n          path: /etc/cni/net.d\n        name: cni\n      - configMap:\n          name: kube-flannel-cfg\n        name: flannel-cfg\n      - hostPath:\n          path: /run/xtables.lock\n          type: FileOrCreate\n        name: xtables-lock\n"
  },
  {
    "path": "roles/harbor/tasks/main.yml",
    "content": "- name: 创建 {{ HARBOR_PATH }} 目录\n  file:\n    path: \"{{ HARBOR_PATH }}\"\n    state: directory\n    mode: 0755\n\n# 注册变量 result，如果 {{ HARBOR_PATH }} 目录下存在 registry 目录说明已经安装过 harbor，则不进行安装\n- name: 注册变量 result\n  command: ls {{ HARBOR_PATH }}\n  register: result\n\n- name: 已安装提示\n  debug:\n    msg: \"发现harbor安装已存在，为避免冲突，不进行重新安装，仅尝试启动harbor\"\n  when: '\"registry\" in result.stdout'\n\n- block:\n  - name: 生成 harbor 随机密码\n    shell: < /dev/urandom tr -dc 0-9A-Za-z-_ | head -c 16\n    register: harbor_password_gen\n  \n  - debug: var=\"harbor_password_gen.stdout\"\n  \n  - name: 生成 DB 随机密码\n    shell: < /dev/urandom tr -dc 0-9A-Za-z-_ | head -c 16\n    register: db_password_gen\n  \n  - debug: var=\"db_password_gen.stdout\"\n  \n  - name: 下发 docker compose 二进制文件\n    copy: src={{ base_dir }}/bin/docker-compose dest={{ bin_dir }}/docker-compose mode=0755\n\n  - name: 下发 harbor 离线安装包\n    copy:\n      src: \"{{ base_dir }}/down/harbor-offline-installer-{{ HARBOR_VER }}.tgz\"\n      dest: \"{{ HARBOR_PATH }}/harbor-offline-installer-{{ HARBOR_VER }}.tgz\"\n\n  - name: 解压 harbor 离线安装包\n    shell: \"cd {{ HARBOR_PATH }} && tar zxf harbor-offline-installer-{{ HARBOR_VER }}.tgz\"\n\n  - name: 导入 harbor 所需 docker images\n    shell: \"{{ bin_dir }}/docker load -i {{ HARBOR_PATH }}/harbor/harbor.{{ HARBOR_VER }}.tar.gz\"\n  \n  - block:\n    - name: 创建 harbor 证书请求\n      template: src=harbor-csr.json.j2 dest={{ cluster_dir }}/ssl/harbor-csr.json\n      connection: local\n    \n    - name: 创建 harbor 证书和私钥\n      shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n            -ca=ca.pem \\\n            -ca-key=ca-key.pem \\\n            -config=ca-config.json \\\n            -profile=kubernetes harbor-csr.json|{{ base_dir }}/bin/cfssljson -bare harbor\"\n      connection: local\n    \n    - name: 分发自签名证书\n      copy: src={{ cluster_dir }}/ssl/{{ item }} dest={{ ca_dir }}/{{ item }}\n      with_items:\n      - ca.pem\n      - harbor.pem\n      - harbor-key.pem\n    when: 'HARBOR_SELF_SIGNED_CERT|bool'\n\n  - name: 推送非自签名证书（需提前在{{ base_dir }}/down/ 下载好证书）\n    copy: src={{ base_dir }}/down/{{ item }} dest={{ ca_dir }}/{{ item }}\n    with_items: \n    - harbor.pem\n    - harbor-key.pem  \n    when: 'not HARBOR_SELF_SIGNED_CERT|bool'\n  \n  - name: 准备 harbor 配置文件\n    template: src=harbor-{{ HARBOR_VER_MAIN }}.yml.j2 dest={{ HARBOR_PATH }}/harbor/harbor.yml\n\n  - set_fact: HARBOR_INST_OPS=\"{{ HARBOR_INST_OPS }} --with-trivy\"\n    when: \"HARBOR_WITH_TRIVY|bool\"\n\n  - debug: var=\"HARBOR_INST_OPS\"\n\n  - name: 安装 harbor\n    shell: \"cd {{ HARBOR_PATH }}/harbor && \\\n            export PATH={{ bin_dir }}:$PATH && \\\n            ./install.sh {{ HARBOR_INST_OPS }} >> /tmp/harbor-`date +'%Y%m%d%H%M%S'`.log 2>&1\"\n  when: '\"registry\" not in result.stdout'\n  \n- name: 创建 harbor 的 systemd unit 文件\n  template: src=harbor.service.j2 dest=/etc/systemd/system/harbor.service\n\n- name: 开机启用 harbor 服务\n  shell: systemctl enable harbor\n  ignore_errors: true\n\n- name: 开启 harbor 服务\n  shell: systemctl daemon-reload && systemctl restart harbor\n\n- name: 轮询等待 harbor 服务启动\n  shell: systemctl is-active harbor.service\n  register: harbor_status\n  until: '\"active\" in harbor_status.stdout'\n  retries: 10\n  delay: 3\n\n- name: 检测 harbor 端口是否正常\n  wait_for:\n    host: \"{{ inventory_hostname }}\"\n    port: \"{{ HARBOR_TLS_PORT }}\"\n    timeout: 60\n  run_once: true\n"
  },
  {
    "path": "roles/harbor/templates/harbor-csr.json.j2",
    "content": "{\n  \"CN\": \"harbor\",\n  \"hosts\": [\n    \"127.0.0.1\",\n    \"{{ inventory_hostname }}\",\n    \"{{ HARBOR_DOMAIN }}\"\n  ],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/harbor/templates/harbor-v1.10.yml.j2",
    "content": "# Configuration file of Harbor\n\n# The IP address or hostname to access admin UI and registry service.\n# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.\nhostname: {{ HARBOR_HOSTNAME }}\n\n# http related config\nhttp:\n  # port for http, default is 80. If https enabled, this port will redirect to https port\n  port: 80\n\n# https related config\nhttps:\n  # https port for harbor, default is 443\n  port: 443\n  # The path of cert and key files for nginx\n  certificate: {{ ca_dir }}/harbor.pem \n  private_key: {{ ca_dir }}/harbor-key.pem\n\n# Uncomment external_url if you want to enable external proxy\n# And when it enabled the hostname will no longer used\n# external_url: https://reg.mydomain.com:8433\n\n# The initial password of Harbor admin\n# It only works in first time to install harbor\n# Remember Change the admin password from UI after launching Harbor.\nharbor_admin_password: {{ harbor_password_gen.stdout }}\n\n# Harbor DB configuration\ndatabase:\n  # The password for the root user of Harbor DB. Change this before any production use.\n  password: {{ db_password_gen.stdout }}\n  # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.\n  max_idle_conns: 50\n  # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.\n  # Note: the default number of connections is 100 for postgres.\n  max_open_conns: 100\n\n# The default data volume\ndata_volume: /data\n\n# Harbor Storage settings by default is using /data dir on local filesystem\n# Uncomment storage_service setting If you want to using external storage\n# storage_service:\n#   # ca_bundle is the path to the custom root ca certificate, which will be injected into the truststore\n#   # of registry's and chart repository's containers.  This is usually needed when the user hosts a internal storage with self signed certificate.\n#   ca_bundle:\n\n#   # storage backend, default is filesystem, options include filesystem, azure, gcs, s3, swift and oss\n#   # for more info about this configuration please refer https://docs.docker.com/registry/configuration/\n#   filesystem:\n#     maxthreads: 100\n#   # set disable to true when you want to disable registry redirect\n#   redirect:\n#     disabled: false\n\n# Clair configuration\nclair:\n  # The interval of clair updaters, the unit is hour, set to 0 to disable the updaters.\n  updaters_interval: 12\n\njobservice:\n  # Maximum number of job workers in job service\n  max_job_workers: 10\n\nnotification:\n  # Maximum retry count for webhook job\n  webhook_job_max_retry: 10\n\nchart:\n  # Change the value of absolute_url to enabled can enable absolute url in chart\n  absolute_url: disabled\n\n# Log configurations\nlog:\n  # options are debug, info, warning, error, fatal\n  level: info\n  # configs for logs in local storage\n  local:\n    # Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.\n    rotate_count: 50\n    # Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes.\n    # If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G\n    # are all valid.\n    rotate_size: 200M\n    # The directory on your host that store log\n    location: /var/log/harbor\n\n  # Uncomment following lines to enable external syslog endpoint.\n  # external_endpoint:\n  #   # protocol used to transmit log to external endpoint, options is tcp or udp\n  #   protocol: tcp\n  #   # The host of external endpoint\n  #   host: localhost\n  #   # Port of external endpoint\n  #   port: 5140\n\n#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!\n_version: 1.10.0\n\n# Uncomment external_database if using external database.\n# external_database:\n#   harbor:\n#     host: harbor_db_host\n#     port: harbor_db_port\n#     db_name: harbor_db_name\n#     username: harbor_db_username\n#     password: harbor_db_password\n#     ssl_mode: disable\n#     max_idle_conns: 2\n#     max_open_conns: 0\n#   clair:\n#     host: clair_db_host\n#     port: clair_db_port\n#     db_name: clair_db_name\n#     username: clair_db_username\n#     password: clair_db_password\n#     ssl_mode: disable\n#   notary_signer:\n#     host: notary_signer_db_host\n#     port: notary_signer_db_port\n#     db_name: notary_signer_db_name\n#     username: notary_signer_db_username\n#     password: notary_signer_db_password\n#     ssl_mode: disable\n#   notary_server:\n#     host: notary_server_db_host\n#     port: notary_server_db_port\n#     db_name: notary_server_db_name\n#     username: notary_server_db_username\n#     password: notary_server_db_password\n#     ssl_mode: disable\n\n# Uncomment external_redis if using external Redis server\n# external_redis:\n#   host: redis\n#   port: 6379\n#   password:\n#   # db_index 0 is for core, it's unchangeable\n#   registry_db_index: 1\n#   jobservice_db_index: 2\n#   chartmuseum_db_index: 3\n#   clair_db_index: 4\n\n# Uncomment uaa for trusting the certificate of uaa instance that is hosted via self-signed cert.\n# uaa:\n#   ca_file: /path/to/ca\n\n# Global proxy\n# Config http proxy for components, e.g. http://my.proxy.com:3128\n# Components doesn't need to connect to each others via http proxy.\n# Remove component from `components` array if want disable proxy\n# for it. If you want use proxy for replication, MUST enable proxy\n# for core and jobservice, and set `http_proxy` and `https_proxy`.\n# Add domain to the `no_proxy` field, when you want disable proxy\n# for some special registry.\nproxy:\n  http_proxy:\n  https_proxy:\n  # no_proxy endpoints will appended to 127.0.0.1,localhost,.local,.internal,log,db,redis,nginx,core,portal,postgresql,jobservice,registry,registryctl,clair,chartmuseum,notary-server\n  no_proxy:\n  components:\n    - core\n    - jobservice\n    - clair\n"
  },
  {
    "path": "roles/harbor/templates/harbor-v2.10.yml.j2",
    "content": "# Configuration file of Harbor\n\n# The IP address or hostname to access admin UI and registry service.\n# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.\nhostname: {{ HARBOR_HOSTNAME }} \n\n# http related config\nhttp:\n  # port for http, default is 80. If https enabled, this port will redirect to https port\n  port: 80\n\n# https related config\nhttps:\n  # https port for harbor, default is 443\n  port: {{ HARBOR_TLS_PORT }}\n  # The path of cert and key files for nginx\n  certificate: {{ ca_dir }}/harbor.pem\n  private_key: {{ ca_dir }}/harbor-key.pem\n  # enable strong ssl ciphers (default: false)\n  # strong_ssl_ciphers: false\n\n# # Uncomment following will enable tls communication between all harbor components\n# internal_tls:\n#   # set enabled to true means internal tls is enabled\n#   enabled: true\n#   # put your cert and key files on dir\n#   dir: /etc/harbor/tls/internal\n\n\n# Uncomment external_url if you want to enable external proxy\n# And when it enabled the hostname will no longer used\n# external_url: https://reg.mydomain.com:8433\n\n# The initial password of Harbor admin\n# It only works in first time to install harbor\n# Remember Change the admin password from UI after launching Harbor.\nharbor_admin_password: {{ harbor_password_gen.stdout }}\n\n# Harbor DB configuration\ndatabase:\n  # The password for the root user of Harbor DB. Change this before any production use.\n  password: {{ db_password_gen.stdout }}\n  # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.\n  max_idle_conns: 100\n  # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.\n  # Note: the default number of connections is 1024 for postgres of harbor.\n  max_open_conns: 900\n  # The maximum amount of time a connection may be reused. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's age.\n  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n  conn_max_lifetime: 5m\n  # The maximum amount of time a connection may be idle. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's idle time.\n  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n  conn_max_idle_time: 0\n\n# The default data volume\ndata_volume: {{ HARBOR_PATH }}\n\n# Harbor Storage settings by default is using /data dir on local filesystem\n# Uncomment storage_service setting If you want to using external storage\n# storage_service:\n#   # ca_bundle is the path to the custom root ca certificate, which will be injected into the truststore\n#   # of registry's containers.  This is usually needed when the user hosts a internal storage with self signed certificate.\n#   ca_bundle:\n\n#   # storage backend, default is filesystem, options include filesystem, azure, gcs, s3, swift and oss\n#   # for more info about this configuration please refer https://docs.docker.com/registry/configuration/\n#   filesystem:\n#     maxthreads: 100\n#   # set disable to true when you want to disable registry redirect\n#   redirect:\n#     disable: false\n\n# Trivy configuration\n#\n# Trivy DB contains vulnerability information from NVD, Red Hat, and many other upstream vulnerability databases.\n# It is downloaded by Trivy from the GitHub release page https://github.com/aquasecurity/trivy-db/releases and cached\n# in the local file system. In addition, the database contains the update timestamp so Trivy can detect whether it\n# should download a newer version from the Internet or use the cached one. Currently, the database is updated every\n# 12 hours and published as a new release to GitHub.\ntrivy:\n  # ignoreUnfixed The flag to display only fixed vulnerabilities\n  ignore_unfixed: false\n  # skipUpdate The flag to enable or disable Trivy DB downloads from GitHub\n  #\n  # You might want to enable this flag in test or CI/CD environments to avoid GitHub rate limiting issues.\n  # If the flag is enabled you have to download the `trivy-offline.tar.gz` archive manually, extract `trivy.db` and\n  # `metadata.json` files and mount them in the `/home/scanner/.cache/trivy/db` path.\n  skip_update: false\n  #\n  # skipJavaDBUpdate If the flag is enabled you have to manually download the `trivy-java.db` file and mount it in the\n  # `/home/scanner/.cache/trivy/java-db/trivy-java.db` path\n  skip_java_db_update: false\n  #\n  # The offline_scan option prevents Trivy from sending API requests to identify dependencies.\n  # Scanning JAR files and pom.xml may require Internet access for better detection, but this option tries to avoid it.\n  # For example, the offline mode will not try to resolve transitive dependencies in pom.xml when the dependency doesn't\n  # exist in the local repositories. It means a number of detected vulnerabilities might be fewer in offline mode.\n  # It would work if all the dependencies are in local.\n  # This option doesn't affect DB download. You need to specify \"skip-update\" as well as \"offline-scan\" in an air-gapped environment.\n  offline_scan: false\n  #\n  # Comma-separated list of what security issues to detect. Possible values are `vuln`, `config` and `secret`. Defaults to `vuln`.\n  security_check: vuln\n  #\n  # insecure The flag to skip verifying registry certificate\n  insecure: false\n  # github_token The GitHub access token to download Trivy DB\n  #\n  # Anonymous downloads from GitHub are subject to the limit of 60 requests per hour. Normally such rate limit is enough\n  # for production operations. If, for any reason, it's not enough, you could increase the rate limit to 5000\n  # requests per hour by specifying the GitHub access token. For more details on GitHub rate limiting please consult\n  # https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting\n  #\n  # You can create a GitHub token by following the instructions in\n  # https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line\n  #\n  # github_token: xxx\n\njobservice:\n  # Maximum number of job workers in job service\n  max_job_workers: 10\n  # The jobLoggers backend name, only support \"STD_OUTPUT\", \"FILE\" and/or \"DB\"\n  job_loggers:\n    - STD_OUTPUT\n    - FILE\n    # - DB\n  # The jobLogger sweeper duration (ignored if `jobLogger` is `stdout`)\n  logger_sweeper_duration: 1 #days\n\nnotification:\n  # Maximum retry count for webhook job\n  webhook_job_max_retry: 3\n  # HTTP client timeout for webhook job\n  webhook_job_http_client_timeout: 3 #seconds\n\n# Log configurations\nlog:\n  # options are debug, info, warning, error, fatal\n  level: info\n  # configs for logs in local storage\n  local:\n    # Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.\n    rotate_count: 5\n    # Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes.\n    # If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G\n    # are all valid.\n    rotate_size: 200M\n    # The directory on your host that store log\n    location: /var/log/harbor\n\n  # Uncomment following lines to enable external syslog endpoint.\n  # external_endpoint:\n  #   # protocol used to transmit log to external endpoint, options is tcp or udp\n  #   protocol: tcp\n  #   # The host of external endpoint\n  #   host: localhost\n  #   # Port of external endpoint\n  #   port: 5140\n\n#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!\n_version: 2.10.0\n\n# Uncomment external_database if using external database.\n# external_database:\n#   harbor:\n#     host: harbor_db_host\n#     port: harbor_db_port\n#     db_name: harbor_db_name\n#     username: harbor_db_username\n#     password: harbor_db_password\n#     ssl_mode: disable\n#     max_idle_conns: 2\n#     max_open_conns: 0\n\n# Uncomment redis if need to customize redis db\n# redis:\n#   # db_index 0 is for core, it's unchangeable\n#   # registry_db_index: 1\n#   # jobservice_db_index: 2\n#   # trivy_db_index: 5\n#   # it's optional, the db for harbor business misc, by default is 0, uncomment it if you want to change it.\n#   # harbor_db_index: 6\n#   # it's optional, the db for harbor cache layer, by default is 0, uncomment it if you want to change it.\n#   # cache_db_index: 7\n\n# Uncomment redis if need to customize redis db\n# redis:\n#   # db_index 0 is for core, it's unchangeable\n#   # registry_db_index: 1\n#   # jobservice_db_index: 2\n#   # trivy_db_index: 5\n#   # it's optional, the db for harbor business misc, by default is 0, uncomment it if you want to change it.\n#   # harbor_db_index: 6\n#   # it's optional, the db for harbor cache layer, by default is 0, uncomment it if you want to change it.\n#   # cache_layer_db_index: 7\n\n# Uncomment external_redis if using external Redis server\n# external_redis:\n#   # support redis, redis+sentinel\n#   # host for redis: <host_redis>:<port_redis>\n#   # host for redis+sentinel:\n#   #  <host_sentinel1>:<port_sentinel1>,<host_sentinel2>:<port_sentinel2>,<host_sentinel3>:<port_sentinel3>\n#   host: redis:6379\n#   password: \n#   # Redis AUTH command was extended in Redis 6, it is possible to use it in the two-arguments AUTH <username> <password> form.\n#   # there's a known issue when using external redis username ref:https://github.com/goharbor/harbor/issues/18892\n#   # if you care about the image pull/push performance, please refer to this https://github.com/goharbor/harbor/wiki/Harbor-FAQs#external-redis-username-password-usage\n#   # username:\n#   # sentinel_master_set must be set to support redis+sentinel\n#   #sentinel_master_set:\n#   # db_index 0 is for core, it's unchangeable\n#   registry_db_index: 1\n#   jobservice_db_index: 2\n#   trivy_db_index: 5\n#   idle_timeout_seconds: 30\n#   # it's optional, the db for harbor business misc, by default is 0, uncomment it if you want to change it.\n#   # harbor_db_index: 6\n#   # it's optional, the db for harbor cache layer, by default is 0, uncomment it if you want to change it.\n#   # cache_layer_db_index: 7\n\n# Uncomment uaa for trusting the certificate of uaa instance that is hosted via self-signed cert.\n# uaa:\n#   ca_file: /path/to/ca\n\n# Global proxy\n# Config http proxy for components, e.g. http://my.proxy.com:3128\n# Components doesn't need to connect to each others via http proxy.\n# Remove component from `components` array if want disable proxy\n# for it. If you want use proxy for replication, MUST enable proxy\n# for core and jobservice, and set `http_proxy` and `https_proxy`.\n# Add domain to the `no_proxy` field, when you want disable proxy\n# for some special registry.\nproxy:\n  http_proxy:\n  https_proxy:\n  no_proxy:\n  components:\n    - core\n    - jobservice\n    - trivy\n\n# metric:\n#   enabled: false\n#   port: 9090\n#   path: /metrics\n\n# Trace related config\n# only can enable one trace provider(jaeger or otel) at the same time,\n# and when using jaeger as provider, can only enable it with agent mode or collector mode.\n# if using jaeger collector mode, uncomment endpoint and uncomment username, password if needed\n# if using jaeger agetn mode uncomment agent_host and agent_port\n# trace:\n#   enabled: true\n#   # set sample_rate to 1 if you wanna sampling 100% of trace data; set 0.5 if you wanna sampling 50% of trace data, and so forth\n#   sample_rate: 1\n#   # # namespace used to differenciate different harbor services\n#   # namespace:\n#   # # attributes is a key value dict contains user defined attributes used to initialize trace provider\n#   # attributes:\n#   #   application: harbor\n#   # # jaeger should be 1.26 or newer.\n#   # jaeger:\n#   #   endpoint: http://hostname:14268/api/traces\n#   #   username:\n#   #   password:\n#   #   agent_host: hostname\n#   #   # export trace data by jaeger.thrift in compact mode\n#   #   agent_port: 6831\n#   # otel:\n#   #   endpoint: hostname:4318\n#   #   url_path: /v1/traces\n#   #   compression: false\n#   #   insecure: true\n#   #   # timeout is in seconds\n#   #   timeout: 10\n\n# Enable purge _upload directories\nupload_purging:\n  enabled: true\n  # remove files in _upload directories which exist for a period of time, default is one week.\n  age: 168h\n  # the interval of the purge operations\n  interval: 24h\n  dryrun: false\n\n# Cache layer configurations\n# If this feature enabled, harbor will cache the resource\n# `project/project_metadata/repository/artifact/manifest` in the redis\n# which can especially help to improve the performance of high concurrent\n# manifest pulling.\n# NOTICE\n# If you are deploying Harbor in HA mode, make sure that all the harbor\n# instances have the same behaviour, all with caching enabled or disabled,\n# otherwise it can lead to potential data inconsistency.\ncache:\n  # not enabled by default\n  enabled: false\n  # keep cache for one day by default\n  expire_hours: 24\n\n# Harbor core configurations\n# Uncomment to enable the following harbor core related configuration items.\n# core:\n#   # The provider for updating project quota(usage), there are 2 options, redis or db,\n#   # by default is implemented by db but you can switch the updation via redis which\n#   # can improve the performance of high concurrent pushing to the same project,\n#   # and reduce the database connections spike and occupies.\n#   # By redis will bring up some delay for quota usage updation for display, so only\n#   # suggest switch provider to redis if you were ran into the db connections spike aroud\n#   # the scenario of high concurrent pushing to same project, no improvment for other scenes.\n#   quota_update_provider: redis # Or db\n"
  },
  {
    "path": "roles/harbor/templates/harbor-v2.11.yml.j2",
    "content": "# Configuration file of Harbor\n\n# The IP address or hostname to access admin UI and registry service.\n# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.\nhostname: {{ HARBOR_HOSTNAME }}\n\n# http related config\nhttp:\n  # port for http, default is 80. If https enabled, this port will redirect to https port\n  port: 80\n\n# https related config\nhttps:\n  # https port for harbor, default is 443\n  port: {{ HARBOR_TLS_PORT }}\n  # The path of cert and key files for nginx\n  certificate: {{ ca_dir }}/harbor.pem\n  private_key: {{ ca_dir }}/harbor-key.pem\n  # enable strong ssl ciphers (default: false)\n  # strong_ssl_ciphers: false\n\n# # Harbor will set ipv4 enabled only by default if this block is not configured\n# # Otherwise, please uncomment this block to configure your own ip_family stacks\n# ip_family:\n#   # ipv6Enabled set to true if ipv6 is enabled in docker network, currently it affected the nginx related component\n#   ipv6:\n#     enabled: false\n#   # ipv4Enabled set to true by default, currently it affected the nginx related component\n#   ipv4:\n#     enabled: true\n\n# # Uncomment following will enable tls communication between all harbor components\n# internal_tls:\n#   # set enabled to true means internal tls is enabled\n#   enabled: true\n#   # put your cert and key files on dir\n#   dir: /etc/harbor/tls/internal\n\n\n# Uncomment external_url if you want to enable external proxy\n# And when it enabled the hostname will no longer used\n# external_url: https://reg.mydomain.com:8433\n\n# The initial password of Harbor admin\n# It only works in first time to install harbor\n# Remember Change the admin password from UI after launching Harbor.\nharbor_admin_password: {{ harbor_password_gen.stdout }}\n\n# Harbor DB configuration\ndatabase:\n  # The password for the root user of Harbor DB. Change this before any production use.\n  password: {{ db_password_gen.stdout }}\n  # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.\n  max_idle_conns: 100\n  # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.\n  # Note: the default number of connections is 1024 for postgres of harbor.\n  max_open_conns: 900\n  # The maximum amount of time a connection may be reused. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's age.\n  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n  conn_max_lifetime: 5m\n  # The maximum amount of time a connection may be idle. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's idle time.\n  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n  conn_max_idle_time: 0\n\n# The default data volume\ndata_volume: {{ HARBOR_PATH }}\n\n# Harbor Storage settings by default is using /data dir on local filesystem\n# Uncomment storage_service setting If you want to using external storage\n# storage_service:\n#   # ca_bundle is the path to the custom root ca certificate, which will be injected into the truststore\n#   # of registry's containers.  This is usually needed when the user hosts a internal storage with self signed certificate.\n#   ca_bundle:\n\n#   # storage backend, default is filesystem, options include filesystem, azure, gcs, s3, swift and oss\n#   # for more info about this configuration please refer https://distribution.github.io/distribution/about/configuration/\n#   # and https://distribution.github.io/distribution/storage-drivers/\n#   filesystem:\n#     maxthreads: 100\n#   # set disable to true when you want to disable registry redirect\n#   redirect:\n#     disable: false\n\n# Trivy configuration\n#\n# Trivy DB contains vulnerability information from NVD, Red Hat, and many other upstream vulnerability databases.\n# It is downloaded by Trivy from the GitHub release page https://github.com/aquasecurity/trivy-db/releases and cached\n# in the local file system. In addition, the database contains the update timestamp so Trivy can detect whether it\n# should download a newer version from the Internet or use the cached one. Currently, the database is updated every\n# 12 hours and published as a new release to GitHub.\ntrivy:\n  # ignoreUnfixed The flag to display only fixed vulnerabilities\n  ignore_unfixed: false\n  # skipUpdate The flag to enable or disable Trivy DB downloads from GitHub\n  #\n  # You might want to enable this flag in test or CI/CD environments to avoid GitHub rate limiting issues.\n  # If the flag is enabled you have to download the `trivy-offline.tar.gz` archive manually, extract `trivy.db` and\n  # `metadata.json` files and mount them in the `/home/scanner/.cache/trivy/db` path.\n  skip_update: false\n  #\n  # skipJavaDBUpdate If the flag is enabled you have to manually download the `trivy-java.db` file and mount it in the\n  # `/home/scanner/.cache/trivy/java-db/trivy-java.db` path\n  skip_java_db_update: false\n  #\n  # The offline_scan option prevents Trivy from sending API requests to identify dependencies.\n  # Scanning JAR files and pom.xml may require Internet access for better detection, but this option tries to avoid it.\n  # For example, the offline mode will not try to resolve transitive dependencies in pom.xml when the dependency doesn't\n  # exist in the local repositories. It means a number of detected vulnerabilities might be fewer in offline mode.\n  # It would work if all the dependencies are in local.\n  # This option doesn't affect DB download. You need to specify \"skip-update\" as well as \"offline-scan\" in an air-gapped environment.\n  offline_scan: false\n  #\n  # Comma-separated list of what security issues to detect. Possible values are `vuln`, `config` and `secret`. Defaults to `vuln`.\n  security_check: vuln\n  #\n  # insecure The flag to skip verifying registry certificate\n  insecure: false\n  #\n  # timeout The duration to wait for scan completion.\n  # There is upper bound of 30 minutes defined in scan job. So if this `timeout` is larger than 30m0s, it will also timeout at 30m0s.\n  timeout: 5m0s\n  #\n  # github_token The GitHub access token to download Trivy DB\n  #\n  # Anonymous downloads from GitHub are subject to the limit of 60 requests per hour. Normally such rate limit is enough\n  # for production operations. If, for any reason, it's not enough, you could increase the rate limit to 5000\n  # requests per hour by specifying the GitHub access token. For more details on GitHub rate limiting please consult\n  # https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting\n  #\n  # You can create a GitHub token by following the instructions in\n  # https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line\n  #\n  # github_token: xxx\n\njobservice:\n  # Maximum number of job workers in job service\n  max_job_workers: 10\n  # The jobLoggers backend name, only support \"STD_OUTPUT\", \"FILE\" and/or \"DB\"\n  job_loggers:\n    - STD_OUTPUT\n    - FILE\n    # - DB\n  # The jobLogger sweeper duration (ignored if `jobLogger` is `stdout`)\n  logger_sweeper_duration: 1 #days\n\nnotification:\n  # Maximum retry count for webhook job\n  webhook_job_max_retry: 3\n  # HTTP client timeout for webhook job\n  webhook_job_http_client_timeout: 3 #seconds\n\n# Log configurations\nlog:\n  # options are debug, info, warning, error, fatal\n  level: info\n  # configs for logs in local storage\n  local:\n    # Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.\n    rotate_count: 50\n    # Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes.\n    # If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G\n    # are all valid.\n    rotate_size: 200M\n    # The directory on your host that store log\n    location: /var/log/harbor\n\n  # Uncomment following lines to enable external syslog endpoint.\n  # external_endpoint:\n  #   # protocol used to transmit log to external endpoint, options is tcp or udp\n  #   protocol: tcp\n  #   # The host of external endpoint\n  #   host: localhost\n  #   # Port of external endpoint\n  #   port: 5140\n\n#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!\n_version: 2.11.0\n\n# Uncomment external_database if using external database.\n# external_database:\n#   harbor:\n#     host: harbor_db_host\n#     port: harbor_db_port\n#     db_name: harbor_db_name\n#     username: harbor_db_username\n#     password: harbor_db_password\n#     ssl_mode: disable\n#     max_idle_conns: 2\n#     max_open_conns: 0\n\n# Uncomment redis if need to customize redis db\n# redis:\n#   # db_index 0 is for core, it's unchangeable\n#   # registry_db_index: 1\n#   # jobservice_db_index: 2\n#   # trivy_db_index: 5\n#   # it's optional, the db for harbor business misc, by default is 0, uncomment it if you want to change it.\n#   # harbor_db_index: 6\n#   # it's optional, the db for harbor cache layer, by default is 0, uncomment it if you want to change it.\n#   # cache_layer_db_index: 7\n\n# Uncomment external_redis if using external Redis server\n# external_redis:\n#   # support redis, redis+sentinel\n#   # host for redis: <host_redis>:<port_redis>\n#   # host for redis+sentinel:\n#   #  <host_sentinel1>:<port_sentinel1>,<host_sentinel2>:<port_sentinel2>,<host_sentinel3>:<port_sentinel3>\n#   host: redis:6379\n#   password: \n#   # Redis AUTH command was extended in Redis 6, it is possible to use it in the two-arguments AUTH <username> <password> form.\n#   # there's a known issue when using external redis username ref:https://github.com/goharbor/harbor/issues/18892\n#   # if you care about the image pull/push performance, please refer to this https://github.com/goharbor/harbor/wiki/Harbor-FAQs#external-redis-username-password-usage\n#   # username:\n#   # sentinel_master_set must be set to support redis+sentinel\n#   #sentinel_master_set:\n#   # db_index 0 is for core, it's unchangeable\n#   registry_db_index: 1\n#   jobservice_db_index: 2\n#   trivy_db_index: 5\n#   idle_timeout_seconds: 30\n#   # it's optional, the db for harbor business misc, by default is 0, uncomment it if you want to change it.\n#   # harbor_db_index: 6\n#   # it's optional, the db for harbor cache layer, by default is 0, uncomment it if you want to change it.\n#   # cache_layer_db_index: 7\n\n# Uncomment uaa for trusting the certificate of uaa instance that is hosted via self-signed cert.\n# uaa:\n#   ca_file: /path/to/ca\n\n# Global proxy\n# Config http proxy for components, e.g. http://my.proxy.com:3128\n# Components doesn't need to connect to each others via http proxy.\n# Remove component from `components` array if want disable proxy\n# for it. If you want use proxy for replication, MUST enable proxy\n# for core and jobservice, and set `http_proxy` and `https_proxy`.\n# Add domain to the `no_proxy` field, when you want disable proxy\n# for some special registry.\nproxy:\n  http_proxy:\n  https_proxy:\n  no_proxy:\n  components:\n    - core\n    - jobservice\n    - trivy\n\n# metric:\n#   enabled: false\n#   port: 9090\n#   path: /metrics\n\n# Trace related config\n# only can enable one trace provider(jaeger or otel) at the same time,\n# and when using jaeger as provider, can only enable it with agent mode or collector mode.\n# if using jaeger collector mode, uncomment endpoint and uncomment username, password if needed\n# if using jaeger agetn mode uncomment agent_host and agent_port\n# trace:\n#   enabled: true\n#   # set sample_rate to 1 if you wanna sampling 100% of trace data; set 0.5 if you wanna sampling 50% of trace data, and so forth\n#   sample_rate: 1\n#   # # namespace used to differentiate different harbor services\n#   # namespace:\n#   # # attributes is a key value dict contains user defined attributes used to initialize trace provider\n#   # attributes:\n#   #   application: harbor\n#   # # jaeger should be 1.26 or newer.\n#   # jaeger:\n#   #   endpoint: http://hostname:14268/api/traces\n#   #   username:\n#   #   password:\n#   #   agent_host: hostname\n#   #   # export trace data by jaeger.thrift in compact mode\n#   #   agent_port: 6831\n#   # otel:\n#   #   endpoint: hostname:4318\n#   #   url_path: /v1/traces\n#   #   compression: false\n#   #   insecure: true\n#   #   # timeout is in seconds\n#   #   timeout: 10\n\n# Enable purge _upload directories\nupload_purging:\n  enabled: true\n  # remove files in _upload directories which exist for a period of time, default is one week.\n  age: 168h\n  # the interval of the purge operations\n  interval: 24h\n  dryrun: false\n\n# Cache layer configurations\n# If this feature enabled, harbor will cache the resource\n# `project/project_metadata/repository/artifact/manifest` in the redis\n# which can especially help to improve the performance of high concurrent\n# manifest pulling.\n# NOTICE\n# If you are deploying Harbor in HA mode, make sure that all the harbor\n# instances have the same behaviour, all with caching enabled or disabled,\n# otherwise it can lead to potential data inconsistency.\ncache:\n  # not enabled by default\n  enabled: false\n  # keep cache for one day by default\n  expire_hours: 24\n\n# Harbor core configurations\n# Uncomment to enable the following harbor core related configuration items.\n# core:\n#   # The provider for updating project quota(usage), there are 2 options, redis or db,\n#   # by default is implemented by db but you can switch the updation via redis which\n#   # can improve the performance of high concurrent pushing to the same project,\n#   # and reduce the database connections spike and occupies.\n#   # By redis will bring up some delay for quota usage updation for display, so only\n#   # suggest switch provider to redis if you were ran into the db connections spike around\n#   # the scenario of high concurrent pushing to same project, no improvement for other scenes.\n#   quota_update_provider: redis # Or db\n"
  },
  {
    "path": "roles/harbor/templates/harbor-v2.12.yml.j2",
    "content": "# Configuration file of Harbor\n\n# The IP address or hostname to access admin UI and registry service.\n# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.\nhostname: {{ HARBOR_HOSTNAME }}\n\n# http related config\nhttp:\n  # port for http, default is 80. If https enabled, this port will redirect to https port\n  port: 80\n\n# https related config\nhttps:\n  # https port for harbor, default is 443\n  port: {{ HARBOR_TLS_PORT }}\n  # The path of cert and key files for nginx\n  certificate: {{ ca_dir }}/harbor.pem\n  private_key: {{ ca_dir }}/harbor-key.pem\n  # enable strong ssl ciphers (default: false)\n  # strong_ssl_ciphers: false\n\n# # Harbor will set ipv4 enabled only by default if this block is not configured\n# # Otherwise, please uncomment this block to configure your own ip_family stacks\n# ip_family:\n#   # ipv6Enabled set to true if ipv6 is enabled in docker network, currently it affected the nginx related component\n#   ipv6:\n#     enabled: false\n#   # ipv4Enabled set to true by default, currently it affected the nginx related component\n#   ipv4:\n#     enabled: true\n\n# # Uncomment following will enable tls communication between all harbor components\n# internal_tls:\n#   # set enabled to true means internal tls is enabled\n#   enabled: true\n#   # put your cert and key files on dir\n#   dir: /etc/harbor/tls/internal\n\n\n# Uncomment external_url if you want to enable external proxy\n# And when it enabled the hostname will no longer used\n# external_url: https://reg.mydomain.com:8433\n\n# The initial password of Harbor admin\n# It only works in first time to install harbor\n# Remember Change the admin password from UI after launching Harbor.\nharbor_admin_password: {{ harbor_password_gen.stdout }}\n\n# Harbor DB configuration\ndatabase:\n  # The password for the root user of Harbor DB. Change this before any production use.\n  password: {{ db_password_gen.stdout }}\n  # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.\n  max_idle_conns: 100\n  # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.\n  # Note: the default number of connections is 1024 for postgres of harbor.\n  max_open_conns: 900\n  # The maximum amount of time a connection may be reused. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's age.\n  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n  conn_max_lifetime: 5m\n  # The maximum amount of time a connection may be idle. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's idle time.\n  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as \"300ms\", \"-1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n  conn_max_idle_time: 0\n\n# The default data volume\ndata_volume: {{ HARBOR_PATH }}\n\n# Harbor Storage settings by default is using /data dir on local filesystem\n# Uncomment storage_service setting If you want to using external storage\n# storage_service:\n#   # ca_bundle is the path to the custom root ca certificate, which will be injected into the truststore\n#   # of registry's containers.  This is usually needed when the user hosts a internal storage with self signed certificate.\n#   ca_bundle:\n\n#   # storage backend, default is filesystem, options include filesystem, azure, gcs, s3, swift and oss\n#   # for more info about this configuration please refer https://distribution.github.io/distribution/about/configuration/\n#   # and https://distribution.github.io/distribution/storage-drivers/\n#   filesystem:\n#     maxthreads: 100\n#   # set disable to true when you want to disable registry redirect\n#   redirect:\n#     disable: false\n\n# Trivy configuration\n#\n# Trivy DB contains vulnerability information from NVD, Red Hat, and many other upstream vulnerability databases.\n# It is downloaded by Trivy from the GitHub release page https://github.com/aquasecurity/trivy-db/releases and cached\n# in the local file system. In addition, the database contains the update timestamp so Trivy can detect whether it\n# should download a newer version from the Internet or use the cached one. Currently, the database is updated every\n# 12 hours and published as a new release to GitHub.\ntrivy:\n  # ignoreUnfixed The flag to display only fixed vulnerabilities\n  ignore_unfixed: false\n  # skipUpdate The flag to enable or disable Trivy DB downloads from GitHub\n  #\n  # You might want to enable this flag in test or CI/CD environments to avoid GitHub rate limiting issues.\n  # If the flag is enabled you have to download the `trivy-offline.tar.gz` archive manually, extract `trivy.db` and\n  # `metadata.json` files and mount them in the `/home/scanner/.cache/trivy/db` path.\n  skip_update: false\n  #\n  # skipJavaDBUpdate If the flag is enabled you have to manually download the `trivy-java.db` file and mount it in the\n  # `/home/scanner/.cache/trivy/java-db/trivy-java.db` path\n  skip_java_db_update: false\n  #\n  # The offline_scan option prevents Trivy from sending API requests to identify dependencies.\n  # Scanning JAR files and pom.xml may require Internet access for better detection, but this option tries to avoid it.\n  # For example, the offline mode will not try to resolve transitive dependencies in pom.xml when the dependency doesn't\n  # exist in the local repositories. It means a number of detected vulnerabilities might be fewer in offline mode.\n  # It would work if all the dependencies are in local.\n  # This option doesn't affect DB download. You need to specify \"skip-update\" as well as \"offline-scan\" in an air-gapped environment.\n  offline_scan: false\n  #\n  # Comma-separated list of what security issues to detect. Possible values are `vuln`, `config` and `secret`. Defaults to `vuln`.\n  security_check: vuln\n  #\n  # insecure The flag to skip verifying registry certificate\n  insecure: false\n  #\n  # timeout The duration to wait for scan completion.\n  # There is upper bound of 30 minutes defined in scan job. So if this `timeout` is larger than 30m0s, it will also timeout at 30m0s.\n  timeout: 5m0s\n  #\n  # github_token The GitHub access token to download Trivy DB\n  #\n  # Anonymous downloads from GitHub are subject to the limit of 60 requests per hour. Normally such rate limit is enough\n  # for production operations. If, for any reason, it's not enough, you could increase the rate limit to 5000\n  # requests per hour by specifying the GitHub access token. For more details on GitHub rate limiting please consult\n  # https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting\n  #\n  # You can create a GitHub token by following the instructions in\n  # https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line\n  #\n  # github_token: xxx\n\njobservice:\n  # Maximum number of job workers in job service\n  max_job_workers: 10\n  # The jobLoggers backend name, only support \"STD_OUTPUT\", \"FILE\" and/or \"DB\"\n  job_loggers:\n    - STD_OUTPUT\n    - FILE\n    # - DB\n  # The jobLogger sweeper duration (ignored if `jobLogger` is `stdout`)\n  logger_sweeper_duration: 1 #days\n\nnotification:\n  # Maximum retry count for webhook job\n  webhook_job_max_retry: 3\n  # HTTP client timeout for webhook job\n  webhook_job_http_client_timeout: 3 #seconds\n\n# Log configurations\nlog:\n  # options are debug, info, warning, error, fatal\n  level: info\n  # configs for logs in local storage\n  local:\n    # Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.\n    rotate_count: 50\n    # Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes.\n    # If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G\n    # are all valid.\n    rotate_size: 200M\n    # The directory on your host that store log\n    location: /var/log/harbor\n\n  # Uncomment following lines to enable external syslog endpoint.\n  # external_endpoint:\n  #   # protocol used to transmit log to external endpoint, options is tcp or udp\n  #   protocol: tcp\n  #   # The host of external endpoint\n  #   host: localhost\n  #   # Port of external endpoint\n  #   port: 5140\n\n#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!\n_version: 2.12.0\n\n# Uncomment external_database if using external database.\n# external_database:\n#   harbor:\n#     host: harbor_db_host\n#     port: harbor_db_port\n#     db_name: harbor_db_name\n#     username: harbor_db_username\n#     password: harbor_db_password\n#     ssl_mode: disable\n#     max_idle_conns: 2\n#     max_open_conns: 0\n\n# Uncomment redis if need to customize redis db\n# redis:\n#   # db_index 0 is for core, it's unchangeable\n#   # registry_db_index: 1\n#   # jobservice_db_index: 2\n#   # trivy_db_index: 5\n#   # it's optional, the db for harbor business misc, by default is 0, uncomment it if you want to change it.\n#   # harbor_db_index: 6\n#   # it's optional, the db for harbor cache layer, by default is 0, uncomment it if you want to change it.\n#   # cache_layer_db_index: 7\n\n# Uncomment external_redis if using external Redis server\n# external_redis:\n#   # support redis, redis+sentinel\n#   # host for redis: <host_redis>:<port_redis>\n#   # host for redis+sentinel:\n#   #  <host_sentinel1>:<port_sentinel1>,<host_sentinel2>:<port_sentinel2>,<host_sentinel3>:<port_sentinel3>\n#   host: redis:6379\n#   password: \n#   # Redis AUTH command was extended in Redis 6, it is possible to use it in the two-arguments AUTH <username> <password> form.\n#   # there's a known issue when using external redis username ref:https://github.com/goharbor/harbor/issues/18892\n#   # if you care about the image pull/push performance, please refer to this https://github.com/goharbor/harbor/wiki/Harbor-FAQs#external-redis-username-password-usage\n#   # username:\n#   # sentinel_master_set must be set to support redis+sentinel\n#   #sentinel_master_set:\n#   # db_index 0 is for core, it's unchangeable\n#   registry_db_index: 1\n#   jobservice_db_index: 2\n#   trivy_db_index: 5\n#   idle_timeout_seconds: 30\n#   # it's optional, the db for harbor business misc, by default is 0, uncomment it if you want to change it.\n#   # harbor_db_index: 6\n#   # it's optional, the db for harbor cache layer, by default is 0, uncomment it if you want to change it.\n#   # cache_layer_db_index: 7\n\n# Uncomment uaa for trusting the certificate of uaa instance that is hosted via self-signed cert.\n# uaa:\n#   ca_file: /path/to/ca\n\n# Global proxy\n# Config http proxy for components, e.g. http://my.proxy.com:3128\n# Components doesn't need to connect to each others via http proxy.\n# Remove component from `components` array if want disable proxy\n# for it. If you want use proxy for replication, MUST enable proxy\n# for core and jobservice, and set `http_proxy` and `https_proxy`.\n# Add domain to the `no_proxy` field, when you want disable proxy\n# for some special registry.\nproxy:\n  http_proxy:\n  https_proxy:\n  no_proxy:\n  components:\n    - core\n    - jobservice\n    - trivy\n\n# metric:\n#   enabled: false\n#   port: 9090\n#   path: /metrics\n\n# Trace related config\n# only can enable one trace provider(jaeger or otel) at the same time,\n# and when using jaeger as provider, can only enable it with agent mode or collector mode.\n# if using jaeger collector mode, uncomment endpoint and uncomment username, password if needed\n# if using jaeger agetn mode uncomment agent_host and agent_port\n# trace:\n#   enabled: true\n#   # set sample_rate to 1 if you wanna sampling 100% of trace data; set 0.5 if you wanna sampling 50% of trace data, and so forth\n#   sample_rate: 1\n#   # # namespace used to differentiate different harbor services\n#   # namespace:\n#   # # attributes is a key value dict contains user defined attributes used to initialize trace provider\n#   # attributes:\n#   #   application: harbor\n#   # # jaeger should be 1.26 or newer.\n#   # jaeger:\n#   #   endpoint: http://hostname:14268/api/traces\n#   #   username:\n#   #   password:\n#   #   agent_host: hostname\n#   #   # export trace data by jaeger.thrift in compact mode\n#   #   agent_port: 6831\n#   # otel:\n#   #   endpoint: hostname:4318\n#   #   url_path: /v1/traces\n#   #   compression: false\n#   #   insecure: true\n#   #   # timeout is in seconds\n#   #   timeout: 10\n\n# Enable purge _upload directories\nupload_purging:\n  enabled: true\n  # remove files in _upload directories which exist for a period of time, default is one week.\n  age: 168h\n  # the interval of the purge operations\n  interval: 24h\n  dryrun: false\n\n# Cache layer configurations\n# If this feature enabled, harbor will cache the resource\n# `project/project_metadata/repository/artifact/manifest` in the redis\n# which can especially help to improve the performance of high concurrent\n# manifest pulling.\n# NOTICE\n# If you are deploying Harbor in HA mode, make sure that all the harbor\n# instances have the same behaviour, all with caching enabled or disabled,\n# otherwise it can lead to potential data inconsistency.\ncache:\n  # not enabled by default\n  enabled: false\n  # keep cache for one day by default\n  expire_hours: 24\n\n# Harbor core configurations\n# Uncomment to enable the following harbor core related configuration items.\n# core:\n#   # The provider for updating project quota(usage), there are 2 options, redis or db,\n#   # by default is implemented by db but you can switch the updation via redis which\n#   # can improve the performance of high concurrent pushing to the same project,\n#   # and reduce the database connections spike and occupies.\n#   # By redis will bring up some delay for quota usage updation for display, so only\n#   # suggest switch provider to redis if you were ran into the db connections spike around\n#   # the scenario of high concurrent pushing to same project, no improvement for other scenes.\n#   quota_update_provider: redis # Or db\n"
  },
  {
    "path": "roles/harbor/templates/harbor.service.j2",
    "content": "[Unit]\nDescription=Harbor\nAfter=docker.service systemd-networkd.service systemd-resolved.service\nRequires=docker.service\nDocumentation=http://github.com/vmware/harbor\n\n[Service]\nType=simple\nRestart=on-failure\nRestartSec=30\nExecStart={{ bin_dir }}/docker-compose -f {{ HARBOR_PATH }}/harbor/docker-compose.yml up\nExecStop={{ bin_dir }}/docker-compose -f {{ HARBOR_PATH }}/harbor/docker-compose.yml down\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/harbor/vars/main.yml",
    "content": "# harbor 主版本号\n# 从完整版本号提取出主版本号\nHARBOR_VER_MAIN: \"{{ HARBOR_VER.split('.')[0] }}.{{ HARBOR_VER.split('.')[1] }}\"\n\n# HARBOR_HOSTNAME 值设置\nHARBOR_HOSTNAME: \"{% if HARBOR_DOMAIN != '' %}{{ HARBOR_DOMAIN }}{% else %}{{ inventory_hostname }}{% endif %}\"\n\n# harobr 默认安装选项\nHARBOR_INST_OPS: \"\"\n"
  },
  {
    "path": "roles/kube-lb/clean-kube-lb.yml",
    "content": "- hosts:\n  - kube-master\n  - kube-node\n  tasks:\n  - name: stop and disable kube-lb service\n    service:\n      name: kube-lb\n      state: stopped\n      enabled: no\n    ignore_errors: true\n\n  - name: remove files and dirs\n    file: name={{ item }} state=absent\n    with_items:\n    - \"/etc/kube-lb\"\n    - \"/etc/systemd/system/kube-lb.service\"\n"
  },
  {
    "path": "roles/kube-lb/tasks/main.yml",
    "content": "- name: prepare some dirs\n  file: name={{ item }} state=directory\n  with_items:\n  - \"/etc/kube-lb/sbin\"\n  - \"/etc/kube-lb/logs\"\n  - \"/etc/kube-lb/conf\"\n\n- name: 下载二进制文件kube-lb(nginx)\n  copy: src={{ base_dir }}/bin/nginx dest=/etc/kube-lb/sbin/kube-lb mode=0755\n\n- name: 创建kube-lb的配置文件\n  template: src=kube-lb.conf.j2 dest=/etc/kube-lb/conf/kube-lb.conf\n  tags: restart_kube-lb\n\n- name: 创建kube-lb的systemd unit文件\n  template: src=kube-lb.service.j2 dest=/etc/systemd/system/kube-lb.service\n  tags: restart_kube-lb\n\n- name: 开机启用kube-lb服务\n  shell: systemctl enable kube-lb\n  ignore_errors: true\n\n- name: 开启kube-lb服务\n  shell: systemctl daemon-reload && systemctl restart kube-lb\n  ignore_errors: true\n  tags: restart_kube-lb\n\n- name: 以轮询的方式等待kube-lb服务启动\n  shell: \"systemctl is-active kube-lb.service\"\n  register: svc_status\n  until: '\"active\" in svc_status.stdout'\n  retries: 3\n  delay: 3\n  tags: restart_kube-lb\n"
  },
  {
    "path": "roles/kube-lb/templates/kube-lb.conf.j2",
    "content": "user root;\nworker_processes 1;\n\nerror_log  /etc/kube-lb/logs/error.log warn;\n\nevents {\n    worker_connections  3000;\n}\n\nstream {\n    upstream backend {\n{% for host in groups['kube_master'] %}\n        server {{ host }}:{{ SECURE_PORT }}    max_fails=2 fail_timeout=3s;\n{% endfor %}\n    }\n\n    server {\n        listen 127.0.0.1:{{ SECURE_PORT }};\n        proxy_connect_timeout 1s;\n        proxy_pass backend;\n    }\n}\n"
  },
  {
    "path": "roles/kube-lb/templates/kube-lb.service.j2",
    "content": "[Unit]\nDescription=l4 nginx proxy for kube-apiservers\nAfter=network.target\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=forking\nExecStartPre=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb -t\nExecStart=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb\nExecReload=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb -s reload\nPrivateTmp=true\nRestart=always\nRestartSec=15\nStartLimitInterval=0\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/kube-master/tasks/main.yml",
    "content": "- name: 下载 kube_master 二进制\n  copy: src={{ base_dir }}/bin/{{ item }} dest={{ bin_dir }}/{{ item }} mode=0755\n  with_items:\n  - kube-apiserver\n  - kube-controller-manager\n  - kube-scheduler\n  - kubectl\n  tags: upgrade_k8s\n\n- name: 分发controller/scheduler kubeconfig配置文件\n  copy: src={{ cluster_dir }}/{{ item }} dest=/etc/kubernetes/{{ item }}\n  with_items:\n  - kube-controller-manager.kubeconfig\n  - kube-scheduler.kubeconfig\n  tags: force_change_certs \n\n- name: 创建cluster audit相关目录\n  file: name={{ item }} state=directory\n  with_items:\n  - \"/etc/kubernetes/audit\"\n  - \"/var/log/kubernetes/audit\"\n  when: \"ENABLE_CLUSTER_AUDIT|bool\"\n\n- name: 分发cluster audit配置文件\n  template: src=audit-policy.yaml.j2 dest=/etc/kubernetes/audit/audit-policy.yaml\n  when: \"ENABLE_CLUSTER_AUDIT|bool\"\n\n- name: 创建 kubernetes 证书签名请求\n  template: src=kubernetes-csr.json.j2 dest={{ cluster_dir }}/ssl/kubernetes-csr.json\n  tags: change_cert, force_change_certs\n  connection: local\n\n- name: 创建 kubernetes 证书和私钥\n  shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n        -ca=ca.pem \\\n        -ca-key=ca-key.pem \\\n        -config=ca-config.json \\\n        -profile=kubernetes kubernetes-csr.json | {{ base_dir }}/bin/cfssljson -bare kubernetes\"\n  tags: change_cert, force_change_certs\n  connection: local\n\n# 创建aggregator proxy相关证书\n- name: 创建 aggregator proxy证书签名请求\n  template: src=aggregator-proxy-csr.json.j2 dest={{ cluster_dir }}/ssl/aggregator-proxy-csr.json\n  connection: local\n  tags: force_change_certs \n\n- name: 创建 aggregator-proxy证书和私钥\n  shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n        -ca=ca.pem \\\n        -ca-key=ca-key.pem \\\n        -config=ca-config.json \\\n        -profile=kubernetes aggregator-proxy-csr.json | {{ base_dir }}/bin/cfssljson -bare aggregator-proxy\"\n  connection: local\n  tags: force_change_certs \n\n- name: 分发 kubernetes证书\n  copy: src={{ cluster_dir }}/ssl/{{ item }} dest={{ ca_dir }}/{{ item }}\n  with_items:\n  - ca.pem\n  - ca-key.pem\n  - kubernetes.pem\n  - kubernetes-key.pem\n  - aggregator-proxy.pem\n  - aggregator-proxy-key.pem\n  tags: change_cert, force_change_certs\n\n- name: 替换 kubeconfig 的 apiserver 地址\n  lineinfile:\n    dest: \"{{ item }}\"\n    regexp: \"^    server\"\n    line: \"    server: https://127.0.0.1:{{ SECURE_PORT }}\"\n  with_items:\n  - \"/etc/kubernetes/kube-controller-manager.kubeconfig\"\n  - \"/etc/kubernetes/kube-scheduler.kubeconfig\"\n  tags: force_change_certs \n\n- name: 创建 master 服务的 systemd unit 文件\n  template: src={{ item }}.j2 dest=/etc/systemd/system/{{ item }}\n  with_items:\n  - kube-apiserver.service\n  - kube-controller-manager.service\n  - kube-scheduler.service\n  tags: restart_master, upgrade_k8s\n\n- name: enable master 服务\n  shell: systemctl enable kube-apiserver kube-controller-manager kube-scheduler\n  ignore_errors: true\n\n- name: 启动 master 服务\n  shell: \"systemctl daemon-reload && systemctl restart kube-apiserver && \\\n\tsystemctl restart kube-controller-manager && systemctl restart kube-scheduler\"\n  tags: upgrade_k8s, restart_master, force_change_certs\n\n# 轮询等待kube-apiserver启动完成\n- name: 轮询等待kube-apiserver启动\n  shell: \"systemctl is-active kube-apiserver.service\"\n  register: api_status\n  until: '\"active\" in api_status.stdout'\n  retries: 10\n  delay: 3\n  tags: upgrade_k8s, restart_master, force_change_certs\n\n# 轮询等待kube-controller-manager启动完成\n- name: 轮询等待kube-controller-manager启动\n  shell: \"systemctl is-active kube-controller-manager.service\"\n  register: cm_status\n  until: '\"active\" in cm_status.stdout'\n  retries: 8\n  delay: 3\n  tags: upgrade_k8s, restart_master, force_change_certs\n\n# 轮询等待kube-scheduler启动完成\n- name: 轮询等待kube-scheduler启动\n  shell: \"systemctl is-active kube-scheduler.service\"\n  register: sch_status\n  until: '\"active\" in sch_status.stdout'\n  retries: 8\n  delay: 3\n  tags: upgrade_k8s, restart_master, force_change_certs\n\n- block:\n    - name: 复制kubectl.kubeconfig\n      shell: 'cd {{ cluster_dir }} && cp -f kubectl.kubeconfig {{ K8S_NODENAME }}-kubectl.kubeconfig'\n      tags: upgrade_k8s, restart_master, force_change_certs\n\n    - name: 替换 kubeconfig 的 apiserver 地址\n      lineinfile:\n        dest: \"{{ cluster_dir }}/{{ K8S_NODENAME }}-kubectl.kubeconfig\"\n        regexp: \"^    server\"\n        line: \"    server: https://{{ inventory_hostname }}:{{ SECURE_PORT }}\"\n      tags: upgrade_k8s, restart_master, force_change_certs\n\n    - name: 轮询等待master服务启动完成\n      command: \"{{ base_dir }}/bin/kubectl --kubeconfig={{ cluster_dir }}/{{ K8S_NODENAME }}-kubectl.kubeconfig get node\"\n      register: result\n      until:    result.rc == 0\n      retries:  5\n      delay: 6\n      tags: upgrade_k8s, restart_master, force_change_certs\n\n    - name: 获取user:kubernetes是否已经绑定对应角色\n      shell: \"{{ base_dir }}/bin/kubectl get clusterrolebindings|grep kubernetes-crb || echo 'notfound'\"\n      register: crb_info\n      run_once: true\n\n    - name: 创建user:kubernetes角色绑定\n      command: \"{{ base_dir }}/bin/kubectl create clusterrolebinding kubernetes-crb --clusterrole=system:kubelet-api-admin --user=kubernetes\"\n      run_once: true\n      when: \"'notfound' in crb_info.stdout\"\n  connection: local\n"
  },
  {
    "path": "roles/kube-master/templates/aggregator-proxy-csr.json.j2",
    "content": "{\n  \"CN\": \"aggregator\",\n  \"hosts\": [],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/kube-master/templates/audit-policy.yaml.j2",
    "content": "apiVersion: audit.k8s.io/v1\nkind: Policy\nomitStages: [\"RequestReceived\"] # 省略请求接收阶段（减少日志量）\nrules:\n  # 根据名称空间启用详细审计\n  #- level: RequestResponse\n  #  namespaces: [\"production\"]\n  #- level: Metadata\n  #  namespaces: [\"staging\"]\n\n  # 规则：忽略健康检查、系统账号、只读操作等\n  - level: None\n    nonResourceURLs: [\"/healthz*\", \"/livez*\", \"/readyz*\", \"/metrics\", \"/version\"]\n  - level: None\n    users:\n      - \"system:kube-proxy\"\n      - \"system:kube-scheduler\"\n      - \"system:kube-controller-manager\"\n      - \"system:node:*\"\n      - \"system:serviceaccount:rocketmq:rocketmq-operator\"\n      - \"system:serviceaccount:openebs:openebs-localpv-provisioner\"\n      - \"system:serviceaccount:kb-system:kubeblocks\"\n  - level: None\n    verbs: [\"get\", \"list\", \"watch\"]\n    resources:\n      - group: \"\"\n        resources: [\"endpoints\", \"services/status\"]\n  \n  # 规则：记录敏感资源\n  - level: RequestResponse\n    verbs: [\"create\", \"update\", \"patch\", \"delete\"]\n    resources:\n      - group: \"\"\n        resources: [\"secrets\", \"configmaps\"]\n\n  # 对 ServiceAccount 的变更\n  - level: RequestResponse\n    verbs: [\"create\", \"update\", \"patch\", \"delete\"]\n    resources:\n      - group: \"\"\n        resources: [\"serviceaccounts\"]\n\n  # RBAC 变更（Role/ClusterRole/RoleBinding/ClusterRoleBinding）\n  - level: Request\n    verbs: [\"create\", \"update\", \"patch\", \"delete\"]\n    resources:\n      - group: rbac.authorization.k8s.io\n        resources: [\"roles\", \"clusterroles\", \"rolebindings\", \"clusterrolebindings\"] \n \n  # 规则：记录Namespace变更\n  - level: Metadata\n    verbs: [\"create\", \"delete\"]\n    resources:\n      - group: \"\"\n        resources: [\"namespaces\"]\n  \n  # 规则：记录工作负载写操作\n  - level: Metadata\n    verbs: [\"create\", \"update\", \"patch\", \"delete\"]\n    resources:\n      - group: apps\n        resources: [\"deployments\", \"daemonsets\", \"replicasets\", \"statefulsets\"]\n      - group: \"\"\n        resources: [\"pods\", \"pods/log\", \"pods/exec\"]\n  \n  # 规则：记录审计策略修改\n  - level: Request\n    verbs: [\"create\", \"update\", \"patch\", \"delete\"]\n    resources:\n      - group: \"audit.k8s.io\"\n        resources: [\"policies\"]\n"
  },
  {
    "path": "roles/kube-master/templates/kube-apiserver.service.j2",
    "content": "[Unit]\nDescription=Kubernetes API Server\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\nAfter=network.target\n\n[Service]\nExecStart={{ bin_dir }}/kube-apiserver \\\n{% if ENABLE_CLUSTER_AUDIT|bool %}\n  --audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml \\\n  --audit-log-path=/var/log/kubernetes/audit/audit.log \\\n  --audit-log-maxage=30 \\\n  --audit-log-maxbackup=10 \\\n  --audit-log-maxsize=100 \\\n{% endif %}\n  --allow-privileged=true \\\n  --anonymous-auth=false \\\n  --api-audiences=api,istio-ca \\\n  --authorization-mode=Node,RBAC \\\n  --bind-address={{ inventory_hostname }} \\\n  --client-ca-file={{ ca_dir }}/ca.pem \\\n  --endpoint-reconciler-type=lease \\\n  --etcd-cafile={{ ca_dir }}/ca.pem \\\n  --etcd-certfile={{ ca_dir }}/kubernetes.pem \\\n  --etcd-keyfile={{ ca_dir }}/kubernetes-key.pem \\\n  --etcd-servers={{ ETCD_ENDPOINTS }} \\\n  --kubelet-certificate-authority={{ ca_dir }}/ca.pem \\\n  --kubelet-client-certificate={{ ca_dir }}/kubernetes.pem \\\n  --kubelet-client-key={{ ca_dir }}/kubernetes-key.pem \\\n  --secure-port={{ SECURE_PORT }} \\\n  --service-account-issuer=https://kubernetes.default.svc \\\n  --service-account-signing-key-file={{ ca_dir }}/ca-key.pem \\\n  --service-account-key-file={{ ca_dir }}/ca.pem \\\n  --service-cluster-ip-range={{ SERVICE_CIDR }} \\\n  --service-node-port-range={{ NODE_PORT_RANGE }} \\\n  --tls-cert-file={{ ca_dir }}/kubernetes.pem \\\n  --tls-private-key-file={{ ca_dir }}/kubernetes-key.pem \\\n  --requestheader-client-ca-file={{ ca_dir }}/ca.pem \\\n  --requestheader-allowed-names= \\\n  --requestheader-extra-headers-prefix=X-Remote-Extra- \\\n  --requestheader-group-headers=X-Remote-Group \\\n  --requestheader-username-headers=X-Remote-User \\\n  --proxy-client-cert-file={{ ca_dir }}/aggregator-proxy.pem \\\n  --proxy-client-key-file={{ ca_dir }}/aggregator-proxy-key.pem \\\n  --enable-aggregator-routing=true \\\n  --v=2\nRestart=always\nRestartSec=5\nType=notify\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/kube-master/templates/kube-controller-manager.service.j2",
    "content": "[Unit]\nDescription=Kubernetes Controller Manager\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\n\n[Service]\nExecStart={{ bin_dir }}/kube-controller-manager \\\n  --allocate-node-cidrs=true \\\n  --authentication-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\\n  --authorization-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\\n  --bind-address=0.0.0.0 \\\n  --cluster-cidr={{ CLUSTER_CIDR }} \\\n  --cluster-name=kubernetes \\\n  --cluster-signing-cert-file={{ ca_dir }}/ca.pem \\\n  --cluster-signing-key-file={{ ca_dir }}/ca-key.pem \\\n  --kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\\n  --leader-elect=true \\\n  --node-cidr-mask-size={{ NODE_CIDR_LEN }} \\\n  --root-ca-file={{ ca_dir }}/ca.pem \\\n  --service-account-private-key-file={{ ca_dir }}/ca-key.pem \\\n  --service-cluster-ip-range={{ SERVICE_CIDR }} \\\n  --use-service-account-credentials=true \\\n  --v=2\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/kube-master/templates/kube-scheduler.service.j2",
    "content": "[Unit]\nDescription=Kubernetes Scheduler\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\n\n[Service]\nExecStart={{ bin_dir }}/kube-scheduler \\\n  --authentication-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \\\n  --authorization-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \\\n  --bind-address=0.0.0.0 \\\n  --kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \\\n  --leader-elect=true \\\n  --v=2\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/kube-master/templates/kubernetes-csr.json.j2",
    "content": "{\n  \"CN\": \"kubernetes\",\n  \"hosts\": [\n    \"127.0.0.1\",\n{% if groups['ex_lb']|length > 0 %}\n    \"{{ hostvars[groups['ex_lb'][0]]['EX_APISERVER_VIP'] }}\",\n{% endif %}\n{% for host in groups['kube_master'] %}\n    \"{{ host }}\",\n{% endfor %}\n    \"{{ CLUSTER_KUBERNETES_SVC_IP }}\",\n{% for host in MASTER_CERT_HOSTS %}\n    \"{{ host }}\",\n{% endfor %}\n    \"kubernetes\",\n    \"kubernetes.default\",\n    \"kubernetes.default.svc\",\n    \"kubernetes.default.svc.cluster\",\n    \"kubernetes.default.svc.cluster.local\",\n    \"kubernetes.default.svc.{{ CLUSTER_DNS_DOMAIN }}\"\n  ],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"k8s\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/kube-master/vars/main.yml",
    "content": "# etcd 集群服务地址列表, 根据etcd组成员自动生成\nTMP_ENDPOINTS: \"{% for h in groups['etcd'] %}https://{{ h }}:2379,{% endfor %}\"\nETCD_ENDPOINTS: \"{{ TMP_ENDPOINTS.rstrip(',') }}\"\n\n# kubernetes.default.svc 地址根据SERVICE_CIDR 设置为网段的第一个地址\nCLUSTER_KUBERNETES_SVC_IP: \"{{ SERVICE_CIDR.split('.')[0] }}.{{ SERVICE_CIDR.split('.')[1] }}.{{ SERVICE_CIDR.split('.')[2] }}.{{ SERVICE_CIDR.split('.')[3]|regex_replace('/.*', '')|int + 1 }}\"\n"
  },
  {
    "path": "roles/kube-node/tasks/create-kubelet-kubeconfig.yml",
    "content": "- block:\n    - name: 准备kubelet 证书签名请求\n      template: src=kubelet-csr.json.j2 dest={{ cluster_dir }}/ssl/{{ K8S_NODENAME }}-kubelet-csr.json\n\n    - name: 创建 kubelet 证书与私钥\n      shell: \"cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \\\n            -ca=ca.pem \\\n            -ca-key=ca-key.pem \\\n            -config=ca-config.json \\\n            -profile=kubernetes {{ K8S_NODENAME }}-kubelet-csr.json | {{ base_dir }}/bin/cfssljson -bare {{ K8S_NODENAME }}-kubelet\"\n\n    - name: 设置集群参数\n      shell: \"{{ base_dir }}/bin/kubectl config set-cluster kubernetes \\\n            --certificate-authority={{ cluster_dir }}/ssl/ca.pem \\\n            --embed-certs=true \\\n            --server={{ KUBE_APISERVER }} \\\n            --kubeconfig={{ cluster_dir }}/{{ K8S_NODENAME }}-kubelet.kubeconfig\"\n\n    - name: 设置客户端认证参数\n      shell: \"{{ base_dir }}/bin/kubectl config set-credentials system:node:{{ K8S_NODENAME }} \\\n            --client-certificate={{ cluster_dir }}/ssl/{{ K8S_NODENAME }}-kubelet.pem \\\n            --embed-certs=true \\\n            --client-key={{ cluster_dir }}/ssl/{{ K8S_NODENAME }}-kubelet-key.pem \\\n            --kubeconfig={{ cluster_dir }}/{{ K8S_NODENAME }}-kubelet.kubeconfig\"\n\n    - name: 设置上下文参数\n      shell: \"{{ base_dir }}/bin/kubectl config set-context default \\\n            --cluster=kubernetes \\\n            --user=system:node:{{ K8S_NODENAME }} \\\n            --kubeconfig={{ cluster_dir }}/{{ K8S_NODENAME }}-kubelet.kubeconfig\"\n\n    - name: 选择默认上下文\n      shell: \"{{ base_dir }}/bin/kubectl config use-context default \\\n            --kubeconfig={{ cluster_dir }}/{{ K8S_NODENAME }}-kubelet.kubeconfig\"\n  connection: local\n\n- name: 分发ca 证书\n  copy: src={{ cluster_dir }}/ssl/ca.pem dest={{ ca_dir }}/ca.pem\n\n- name: 分发kubelet 证书\n  copy: src={{ cluster_dir }}/ssl/{{ K8S_NODENAME }}-{{ item }} dest={{ ca_dir }}/{{ item }}\n  with_items:\n  - kubelet.pem\n  - kubelet-key.pem\n\n- name: 分发kubeconfig\n  copy: src={{ cluster_dir }}/{{ K8S_NODENAME }}-kubelet.kubeconfig dest=/etc/kubernetes/kubelet.kubeconfig\n"
  },
  {
    "path": "roles/kube-node/tasks/main.yml",
    "content": "- name: 创建kube_node 相关目录\n  file: name={{ item }} state=directory\n  with_items:\n  - /var/lib/kubelet\n  - /var/lib/kube-proxy\n  - /etc/cni/net.d\n  - /opt/cni/bin\n\n- name: 下载 kubelet,kube-proxy 二进制\n  copy: src={{ base_dir }}/bin/{{ item }} dest={{ bin_dir }}/{{ item }} mode=0755\n  with_items:\n  - kubectl\n  - kubelet\n  - kube-proxy\n  tags: upgrade_k8s\n\n- name: 下载 cni plugins 二进制文件\n  copy: src={{ item }} dest=/opt/cni/bin/ mode=0755\n  with_fileglob:\n  - \"{{ base_dir }}/bin/cni-bin/*\"\n\n- name: 添加 kubectl 自动补全\n  lineinfile:\n    dest: ~/.bashrc\n    state: present\n    regexp: 'kubectl completion'\n    line: 'source <(kubectl completion bash) # generated by kubeasz'\n\n##----------kubelet 配置部分--------------\n# 创建 kubelet 相关证书及 kubelet.kubeconfig\n- import_tasks: create-kubelet-kubeconfig.yml\n  tags: force_change_certs\n\n- name: 准备 cni配置文件\n  template: src=cni-default.conf.j2 dest=/etc/cni/net.d/10-default.conf\n\n- name: 创建kubelet的配置文件\n  template: src=kubelet-config.yaml.j2 dest=/var/lib/kubelet/config.yaml\n  tags: upgrade_k8s, restart_node\n\n- name: 检查文件/run/systemd/resolve/resolv.conf\n  stat: path=\"/run/systemd/resolve/resolv.conf\"\n  register: resolv\n  tags: upgrade_k8s, restart_node\n\n- name: 替换resolvConf 配置\n  lineinfile:\n    dest: /var/lib/kubelet/config.yaml\n    state: present\n    regexp: 'resolvConf'\n    line: 'resolvConf: /run/systemd/resolve/resolv.conf'\n  when: \"resolv.stat.isreg is defined\"\n  tags: upgrade_k8s, restart_node\n\n- name: 创建kubelet的systemd unit文件\n  template: src=kubelet.service.j2 dest=/etc/systemd/system/kubelet.service\n  tags: upgrade_k8s, restart_node\n\n- name: 开机启用kubelet 服务\n  shell: systemctl enable kubelet\n  ignore_errors: true\n\n- name: 开启kubelet 服务\n  shell: systemctl daemon-reload && systemctl restart kubelet\n  tags: upgrade_k8s, restart_node, force_change_certs\n\n##-------kube-proxy部分----------------\n- name: 分发 kube-proxy.kubeconfig配置文件\n  copy: src={{ cluster_dir }}/kube-proxy.kubeconfig dest=/etc/kubernetes/kube-proxy.kubeconfig\n  tags: force_change_certs\n\n- name: 替换 kube-proxy.kubeconfig 的 apiserver 地址\n  lineinfile:\n    dest: /etc/kubernetes/kube-proxy.kubeconfig\n    regexp: \"^    server\"\n    line: \"    server: {{ KUBE_APISERVER }}\"\n  tags: force_change_certs\n\n- name: 创建kube-proxy 配置\n  template: src=kube-proxy-config.yaml.j2 dest=/var/lib/kube-proxy/kube-proxy-config.yaml\n  tags: reload-kube-proxy, restart_node, upgrade_k8s\n\n- name: 创建kube-proxy 服务文件\n  template: src=kube-proxy.service.j2 dest=/etc/systemd/system/kube-proxy.service\n  tags: reload-kube-proxy, restart_node, upgrade_k8s\n\n- name: 开机启用kube-proxy 服务\n  shell: systemctl enable kube-proxy\n  ignore_errors: true\n\n- name: 开启kube-proxy 服务\n  shell: systemctl daemon-reload && systemctl restart kube-proxy\n  tags: reload-kube-proxy, upgrade_k8s, restart_node, force_change_certs\n\n# 轮询等待kube-proxy启动完成\n- name: 轮询等待kube-proxy启动\n  shell: \"systemctl is-active kube-proxy.service\"\n  register: kubeproxy_status\n  until: '\"active\" in kubeproxy_status.stdout'\n  retries: 4\n  delay: 2\n  tags: reload-kube-proxy, upgrade_k8s, restart_node, force_change_certs\n\n# 轮询等待kubelet启动完成\n- name: 轮询等待kubelet启动\n  shell: \"systemctl is-active kubelet.service\"\n  register: kubelet_status\n  until: '\"active\" in kubelet_status.stdout'\n  retries: 4\n  delay: 2\n  tags: reload-kube-proxy, upgrade_k8s, restart_node, force_change_certs\n\n- name: 轮询等待node达到Ready状态\n  shell: \"{{ base_dir }}/bin/kubectl get node {{ K8S_NODENAME }}|awk 'NR>1{print $2}'\"\n  register: node_status\n  until: node_status.stdout == \"Ready\" or node_status.stdout == \"Ready,SchedulingDisabled\"\n  retries: 8 \n  delay: 8\n  tags: upgrade_k8s, restart_node, force_change_certs\n  connection: local\n\n- block:\n  - name: Setting worker role name\n    shell: \"{{ base_dir }}/bin/kubectl label node {{ K8S_NODENAME }} kubernetes.io/role=node --overwrite\"\n\n  - name: Setting master role name\n    shell: \"{{ base_dir }}/bin/kubectl label node {{ K8S_NODENAME }} kubernetes.io/role=master --overwrite\"\n    when: \"inventory_hostname in groups['kube_master']\"\n\n  - name: Making master nodes SchedulingDisabled\n    shell: \"{{ base_dir }}/bin/kubectl cordon {{ K8S_NODENAME }} \"\n    when: \"inventory_hostname not in groups['kube_node']\"\n  ignore_errors: true\n  connection: local\n"
  },
  {
    "path": "roles/kube-node/templates/cni-default.conf.j2",
    "content": "{\n\t\"name\": \"mynet\",\n\t\"cniVersion\": \"0.3.1\",\n\t\"type\": \"bridge\",\n\t\"bridge\": \"mynet0\",\n\t\"isDefaultGateway\": true,\n\t\"ipMasq\": true,\n\t\"hairpinMode\": true,\n\t\"ipam\": {\n\t\t\"type\": \"host-local\",\n\t\t\"subnet\": \"{{ CLUSTER_CIDR }}\"\n\t}\n}\n"
  },
  {
    "path": "roles/kube-node/templates/kube-proxy-config.yaml.j2",
    "content": "kind: KubeProxyConfiguration\napiVersion: kubeproxy.config.k8s.io/v1alpha1\nbindAddress: 0.0.0.0\nclientConnection:\n  kubeconfig: \"/etc/kubernetes/kube-proxy.kubeconfig\"\n# 根据clusterCIDR 判断集群内部和外部流量，配置clusterCIDR选项后，kube-proxy 会对访问 Service IP 的请求做 SNAT\nclusterCIDR: \"{{ CLUSTER_CIDR }}\"\nconntrack:\n  maxPerCore: 32768\n  min: 131072\n  tcpCloseWaitTimeout: 1h0m0s\n  tcpEstablishedTimeout: 24h0m0s\nhealthzBindAddress: 0.0.0.0:10256\n# hostnameOverride 值必须与 kubelet 的对应一致，否则 kube-proxy 启动后会找不到该 Node，从而不会创建任何 iptables 规则\nhostnameOverride: \"{{ K8S_NODENAME }}\"\nmetricsBindAddress: 0.0.0.0:10249\nmode: \"{{ PROXY_MODE }}\"\n{% if PROXY_MODE == \"ipvs\" %}\nipvs:\n  excludeCIDRs: null\n  minSyncPeriod: 0s\n  scheduler: \"\"\n  strictARP: {{ ENABLE_IPVS_STRICT_ARP }}\n  syncPeriod: 30s\n  tcpFinTimeout: 0s\n  tcpTimeout: 0s\n  udpTimeout: 0s\n{% endif %}\n"
  },
  {
    "path": "roles/kube-node/templates/kube-proxy.service.j2",
    "content": "[Unit]\nDescription=Kubernetes Kube-Proxy Server\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\nAfter=network.target\n\n[Service]\nWorkingDirectory=/var/lib/kube-proxy\nExecStart={{ bin_dir }}/kube-proxy \\\n  --config=/var/lib/kube-proxy/kube-proxy-config.yaml\nRestart=always\nRestartSec=5\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/kube-node/templates/kubelet-config.yaml.j2",
    "content": "kind: KubeletConfiguration\napiVersion: kubelet.config.k8s.io/v1beta1\naddress: 0.0.0.0\nauthentication:\n  anonymous:\n    enabled: false\n  webhook:\n    cacheTTL: 2m0s\n    enabled: true\n  x509:\n    clientCAFile: {{ ca_dir }}/ca.pem\nauthorization:\n  mode: Webhook\n  webhook:\n    cacheAuthorizedTTL: 5m0s\n    cacheUnauthorizedTTL: 30s\ncgroupDriver: {{ CGROUP_DRIVER }} \ncgroupsPerQOS: true\nclusterDNS:\n{% if ENABLE_LOCAL_DNS_CACHE %}\n- {{ LOCAL_DNS_CACHE }}\n{% else %}\n- {{ CLUSTER_DNS_SVC_IP }}\n{% endif %}\nclusterDomain: {{ CLUSTER_DNS_DOMAIN }}\nconfigMapAndSecretChangeDetectionStrategy: Watch\ncontainerLogMaxFiles: 3 \ncontainerLogMaxSize: 10Mi\nenforceNodeAllocatable:\n- pods\n{% if KUBE_RESERVED_ENABLED == \"yes\" %}\n- kube-reserved\n{% endif %}\n{% if SYS_RESERVED_ENABLED == \"yes\" %}\n- system-reserved\n{% endif %}\neventBurst: 10\neventRecordQPS: 5\nevictionHard:\n  imagefs.available: 15%\n  memory.available: 300Mi\n  nodefs.available: 10%\n  nodefs.inodesFree: 5%\nevictionPressureTransitionPeriod: 5m0s\nfailSwapOn: true\nfileCheckFrequency: 40s\nhairpinMode: hairpin-veth \nhealthzBindAddress: 0.0.0.0\nhealthzPort: 10248\nhttpCheckFrequency: 40s\nimageGCHighThresholdPercent: 85\nimageGCLowThresholdPercent: 80\nimageMinimumGCAge: 2m0s\n{% if KUBE_RESERVED_ENABLED == \"yes\" %}\nkubeReservedCgroup: /podruntime.slice\nkubeReserved:\n  cpu: 500m\n  memory: 1000Mi\n  pid: \"1000\"\n{% endif %}\nkubeAPIBurst: 100\nkubeAPIQPS: 50\nmakeIPTablesUtilChains: true\nmaxOpenFiles: 1000000\nmaxParallelImagePulls: 5\nmaxPods: {{ MAX_PODS }}\nnodeLeaseDurationSeconds: 40\nnodeStatusReportFrequency: 1m0s\nnodeStatusUpdateFrequency: 10s\noomScoreAdj: -999\npodPidsLimit: {{ POD_MAX_PIDS }}\nport: 10250\n# disable readOnlyPort \nreadOnlyPort: 0\nresolvConf: /etc/resolv.conf\nruntimeRequestTimeout: 2m0s\nserializeImagePulls: false\nstreamingConnectionIdleTimeout: 4h0m0s\nsyncFrequency: 1m0s\n{% if SYS_RESERVED_ENABLED == \"yes\" %}\nsystemReservedCgroup: /system.slice\nsystemReserved:\n  cpu: 500m\n  memory: 1000Mi\n  pid: \"5000\"\n{% endif %}\ntlsCertFile: {{ ca_dir }}/kubelet.pem\ntlsPrivateKeyFile: {{ ca_dir }}/kubelet-key.pem\n"
  },
  {
    "path": "roles/kube-node/templates/kubelet-csr.json.j2",
    "content": "{\n  \"CN\": \"system:node:{{ K8S_NODENAME }}\",\n  \"hosts\": [\n    \"127.0.0.1\",\n    \"{{ inventory_hostname }}\",\n    \"{{ K8S_NODENAME }}\"\n  ],\n  \"key\": {\n    \"algo\": \"rsa\",\n    \"size\": 2048\n  },\n  \"names\": [\n    {\n      \"C\": \"CN\",\n      \"ST\": \"HangZhou\",\n      \"L\": \"XS\",\n      \"O\": \"system:nodes\",\n      \"OU\": \"System\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/kube-node/templates/kubelet.service.j2",
    "content": "[Unit]\nDescription=Kubernetes Kubelet\nDocumentation=https://github.com/GoogleCloudPlatform/kubernetes\n\n[Service]\nWorkingDirectory=/var/lib/kubelet\nExecStartPre=/bin/mount -o remount,rw '/sys/fs/cgroup'\n{% if KUBE_RESERVED_ENABLED == \"yes\" or SYS_RESERVED_ENABLED == \"yes\" %}\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpu/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuacct/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/systemd/podruntime.slice\n\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpu/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuacct/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/systemd/system.slice\n\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/podruntime.slice\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice\n\nExecStartPre=/bin/mkdir -p /sys/fs/cgroup/podruntime.slice\n{% endif %}\nExecStart={{ bin_dir }}/kubelet \\\n  --config=/var/lib/kubelet/config.yaml \\\n  --container-runtime-endpoint=unix://{{ CONTAINERD_STATE_DIR }}/containerd.sock \\\n  --hostname-override={{ K8S_NODENAME }} \\\n  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\\n  --root-dir={{ KUBELET_ROOT_DIR }} \\\n  --v=2\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "roles/kube-node/vars/main.yml",
    "content": "# 设置 APISERVER 地址，使用kube-lb负载均衡监听地址\nKUBE_APISERVER: \"https://127.0.0.1:{{ SECURE_PORT }}\"\n\n# cgroup driver\nCGROUP_DRIVER: \"systemd\"\n\n# coredns 服务地址，根据SERVICE_CIDR 设置，默认选择网段第二个地址\nCLUSTER_DNS_SVC_IP: \"{{ SERVICE_CIDR.split('.')[0] }}.{{ SERVICE_CIDR.split('.')[1] }}.{{ SERVICE_CIDR.split('.')[2] }}.{{ SERVICE_CIDR.split('.')[3]|regex_replace('/.*', '')|int + 2 }}\"\n\n# pod-max-pids\nPOD_MAX_PIDS: -1\n\n# Enable strict ARP by setting arp_ignore to 1 and arp_announce to 2\nENABLE_IPVS_STRICT_ARP: false\n"
  },
  {
    "path": "roles/kube-ovn/tasks/main.yml",
    "content": "# 删除原有cni配置\n- name: 删除默认cni配置\n  file: path=/etc/cni/net.d/10-default.conf state=absent\n\n- block:\n    - name: 准备安装相关文件\n      template: src={{ item }}.j2 dest={{ cluster_dir }}/yml/{{ item }}\n      with_items:\n      - \"install.sh\"\n      - \"coredns.yaml\"\n\n    - name: 准备dnscache的部署文件\n      template: src=nodelocaldns-ipvs.yaml.j2 dest={{ cluster_dir }}/yml/nodelocaldns.yaml\n      when: \"PROXY_MODE == 'ipvs'\"\n\n    - name: 准备dnscache的部署文件\n      template: src=nodelocaldns-iptables.yaml.j2 dest={{ cluster_dir }}/yml/nodelocaldns.yaml\n      when: \"PROXY_MODE == 'iptables'\"\n\n    - name: 创建coredns,dnscache部署\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/coredns.yaml && \\\n\t\t\t  {{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/nodelocaldns.yaml\"\n\n    - name: 安装kube-ovn网络\n      shell: 'export PATH=\"{{ base_dir }}/bin/:$PATH\"; cd {{ cluster_dir }}/yml/ && \\\n              bash install.sh >> /tmp/install-kube-ovn-`date +\"%Y%m%d%H%M%S\"`.log 2>&1'\n  run_once: true\n  ignore_errors: true\n  connection: local\n\n# 等待网络插件部署成功\n- name: 轮询等待kube-ovn 运行，视下载镜像速度而定\n  shell: \"{{ base_dir }}/bin/kubectl get pod -n kube-system -o wide|grep 'kube-ovn-cni'|grep ' {{ K8S_NODENAME }} '|awk '{print $3}'\"\n  register: pod_status\n  until: pod_status.stdout == \"Running\"\n  retries: 15\n  delay: 8\n  ignore_errors: true\n  connection: local\n  tags: force_change_certs\n"
  },
  {
    "path": "roles/kube-ovn/templates/coredns.yaml.j2",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: coredns\n  namespace: kube-system\n  labels:\n      kubernetes.io/cluster-service: \"true\"\n      addonmanager.kubernetes.io/mode: Reconcile\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  labels:\n    kubernetes.io/bootstrapping: rbac-defaults\n    addonmanager.kubernetes.io/mode: Reconcile\n  name: system:coredns\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - endpoints\n  - services\n  - pods\n  - namespaces\n  verbs:\n  - list\n  - watch\n- apiGroups:\n  - \"\"\n  resources:\n  - nodes\n  verbs:\n  - get\n- apiGroups:\n  - discovery.k8s.io\n  resources:\n  - endpointslices\n  verbs:\n  - list\n  - watch\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  annotations:\n    rbac.authorization.kubernetes.io/autoupdate: \"true\"\n  labels:\n    kubernetes.io/bootstrapping: rbac-defaults\n    addonmanager.kubernetes.io/mode: EnsureExists\n  name: system:coredns\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: system:coredns\nsubjects:\n- kind: ServiceAccount\n  name: coredns\n  namespace: kube-system\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: coredns\n  namespace: kube-system\n  labels:\n      addonmanager.kubernetes.io/mode: EnsureExists\ndata:\n  Corefile: |\n    .:53 {\n        errors\n        health {\n            lameduck 5s\n        }\n        ready\n        kubernetes {{ CLUSTER_DNS_DOMAIN }} in-addr.arpa ip6.arpa {\n            pods insecure\n            fallthrough in-addr.arpa ip6.arpa\n            ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf {\n            max_concurrent 1000\n        }\n        cache 30\n        reload\n        loadbalance\n    }\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: coredns\n  namespace: kube-system\n  labels:\n    k8s-app: kube-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"CoreDNS\"\nspec:\n  replicas: 1\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxUnavailable: 1\n  selector:\n    matchLabels:\n      k8s-app: kube-dns\n  template:\n    metadata:\n      labels:\n        k8s-app: kube-dns\n    spec:\n      securityContext:\n        seccompProfile:\n          type: RuntimeDefault\n      priorityClassName: system-cluster-critical\n      serviceAccountName: coredns\n      affinity:\n        podAntiAffinity:\n          preferredDuringSchedulingIgnoredDuringExecution:\n          - weight: 100\n            podAffinityTerm:\n              labelSelector:\n                matchExpressions:\n                  - key: k8s-app\n                    operator: In\n                    values: [\"kube-dns\"]\n              topologyKey: kubernetes.io/hostname\n      tolerations:\n        - key: \"CriticalAddonsOnly\"\n          operator: \"Exists\"\n      nodeSelector:\n        kubernetes.io/os: linux\n      containers:\n      - name: coredns\n        image: easzlab.io.local:5000/easzlab/coredns:{{ corednsVer }}\n        imagePullPolicy: IfNotPresent\n        resources:\n          limits:\n            memory: 300Mi\n          requests:\n            cpu: 100m\n            memory: 70Mi\n        args: [ \"-conf\", \"/etc/coredns/Corefile\" ]\n        volumeMounts:\n        - name: config-volume\n          mountPath: /etc/coredns\n          readOnly: true\n        ports:\n        - containerPort: 53\n          name: dns\n          protocol: UDP\n        - containerPort: 53\n          name: dns-tcp\n          protocol: TCP\n        - containerPort: 9153\n          name: metrics\n          protocol: TCP\n        livenessProbe:\n          httpGet:\n            path: /health\n            port: 8080\n            scheme: HTTP\n          initialDelaySeconds: 60\n          timeoutSeconds: 5\n          successThreshold: 1\n          failureThreshold: 5\n        readinessProbe:\n          httpGet:\n            path: /ready\n            port: 8181\n            scheme: HTTP\n        securityContext:\n          allowPrivilegeEscalation: false\n          capabilities:\n            add:\n            - NET_BIND_SERVICE\n            drop:\n            - all\n          readOnlyRootFilesystem: true\n      dnsPolicy: Default\n      volumes:\n        - name: config-volume\n          configMap:\n            name: coredns\n            items:\n            - key: Corefile\n              path: Corefile\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: kube-dns\n  namespace: kube-system\n  annotations:\n    prometheus.io/port: \"9153\"\n    prometheus.io/scrape: \"true\"\n  labels:\n    k8s-app: kube-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"CoreDNS\"\nspec:\n  selector:\n    k8s-app: kube-dns\n  clusterIP: {{ CLUSTER_DNS_SVC_IP }}\n  ports:\n  - name: dns\n    port: 53\n    protocol: UDP\n  - name: dns-tcp\n    port: 53\n    protocol: TCP\n  - name: metrics\n    port: 9153\n    protocol: TCP\n"
  },
  {
    "path": "roles/kube-ovn/templates/install.sh.j2",
    "content": "#!/usr/bin/env bash\nset -euo pipefail\n\nIPV6=${IPV6:-false}\nDUAL_STACK=${DUAL_STACK:-false}\nENABLE_SSL=${ENABLE_SSL:-false}\nENABLE_VLAN=${ENABLE_VLAN:-false}\nCHECK_GATEWAY=${CHECK_GATEWAY:-true}\nLOGICAL_GATEWAY=${LOGICAL_GATEWAY:-false}\nU2O_INTERCONNECTION=${U2O_INTERCONNECTION:-false}\nENABLE_MIRROR=${ENABLE_MIRROR:-false}\nVLAN_NIC=${VLAN_NIC:-}\nHW_OFFLOAD=${HW_OFFLOAD:-false}\nENABLE_LB=${ENABLE_LB:-false}\nENABLE_NP=${ENABLE_NP:-false}\nENABLE_EIP_SNAT=${ENABLE_EIP_SNAT:-false}\nLS_DNAT_MOD_DL_DST=${LS_DNAT_MOD_DL_DST:-true}\nENABLE_EXTERNAL_VPC=${ENABLE_EXTERNAL_VPC:-true}\nCNI_CONFIG_PRIORITY=${CNI_CONFIG_PRIORITY:-01}\nENABLE_LB_SVC=${ENABLE_LB_SVC:-false}\nENABLE_KEEP_VM_IP=${ENABLE_KEEP_VM_IP:-true}\n\n# exchange link names of OVS bridge and the provider nic\n# in the default provider-network\nEXCHANGE_LINK_NAME=${EXCHANGE_LINK_NAME:-false}\n# The nic to support container network can be a nic name or a group of regex\n# separated by comma, if empty will use the nic that the default route use\nIFACE=${IFACE:-}\n# Specifies the name of the dpdk tunnel iface.\n# Note that the dpdk tunnel iface and tunnel ip cidr should be diffierent with Kubernetes api cidr,otherwise the route will be a problem.\nDPDK_TUNNEL_IFACE=${DPDK_TUNNEL_IFACE:-br-phy}\nENABLE_BIND_LOCAL_IP=${ENABLE_BIND_LOCAL_IP:-true}\n\nCNI_CONF_DIR=\"/etc/cni/net.d\"\nCNI_BIN_DIR=\"/opt/cni/bin\"\n\nREGISTRY=\"easzlab.io.local:5000/kubeovn\"\nVERSION=\"v1.11.5\"\nIMAGE_PULL_POLICY=\"IfNotPresent\"\nPOD_CIDR=\"{{ CLUSTER_CIDR }}\"              # Do NOT overlap with NODE/SVC/JOIN CIDR\nPOD_GATEWAY=\"{{ CLUSTER_CIDR_GW }}\"\nSVC_CIDR=\"{{ SERVICE_CIDR }}\"              # Do NOT overlap with NODE/POD/JOIN CIDR\nJOIN_CIDR=\"100.64.0.0/16\"                  # Do NOT overlap with NODE/POD/SVC CIDR\nPINGER_EXTERNAL_ADDRESS=\"114.114.114.114\"  # Pinger check external ip probe\nPINGER_EXTERNAL_DOMAIN=\"alauda.cn\"         # Pinger check external domain probe\nSVC_YAML_IPFAMILYPOLICY=\"\"\nif [ \"$IPV6\" = \"true\" ]; then\n  POD_CIDR=\"fd00:10:16::/64\"                # Do NOT overlap with NODE/SVC/JOIN CIDR\n  POD_GATEWAY=\"fd00:10:16::1\"\n  SVC_CIDR=\"fd00:10:96::/112\"               # Do NOT overlap with NODE/POD/JOIN CIDR\n  JOIN_CIDR=\"fd00:100:64::/64\"              # Do NOT overlap with NODE/POD/SVC CIDR\n  PINGER_EXTERNAL_ADDRESS=\"2400:3200::1\"\n  PINGER_EXTERNAL_DOMAIN=\"google.com\"\nfi\nif [ \"$DUAL_STACK\" = \"true\" ]; then\n  POD_CIDR=\"10.16.0.0/16,fd00:10:16::/64\"                # Do NOT overlap with NODE/SVC/JOIN CIDR\n  POD_GATEWAY=\"10.16.0.1,fd00:10:16::1\"\n  SVC_CIDR=\"10.96.0.0/12,fd00:10:96::/112\"               # Do NOT overlap with NODE/POD/JOIN CIDR\n  JOIN_CIDR=\"100.64.0.0/16,fd00:100:64::/64\"             # Do NOT overlap with NODE/POD/SVC CIDR\n  PINGER_EXTERNAL_ADDRESS=\"114.114.114.114,2400:3200::1\"\n  PINGER_EXTERNAL_DOMAIN=\"google.com\"\n  SVC_YAML_IPFAMILYPOLICY=\"ipFamilyPolicy: PreferDualStack\"\nfi\n\nEXCLUDE_IPS=\"\"                                    # EXCLUDE_IPS for default subnet\nLABEL=\"kubernetes.io/role=master\"                 # The node label to deploy OVN DB\nDEPRECATED_LABEL=\"node-role.kubernetes.io/master\" # The node label to deploy OVN DB in earlier versions\nNETWORK_TYPE=\"geneve\"                             # geneve or vlan\nTUNNEL_TYPE=\"geneve\"                              # geneve, vxlan or stt. ATTENTION: some networkpolicy cannot take effect when using vxlan and stt need custom compile ovs kernel module\nPOD_NIC_TYPE=\"veth-pair\"                          # veth-pair or internal-port\nPOD_DEFAULT_FIP_TYPE=\"\"                           # iptables, pod can set iptables fip automatically by enable fip annotation\n\n# VLAN Config only take effect when NETWORK_TYPE is vlan\nPROVIDER_NAME=\"provider\"\nVLAN_INTERFACE_NAME=\"\"\nVLAN_NAME=\"ovn-vlan\"\nVLAN_ID=\"100\"\n\nif [ \"$ENABLE_VLAN\" = \"true\" ]; then\n  NETWORK_TYPE=\"vlan\"\n  if [ \"$VLAN_NIC\" != \"\" ]; then\n    VLAN_INTERFACE_NAME=\"$VLAN_NIC\"\n  fi\nfi\n\n# hybrid dpdk\nHYBRID_DPDK=\"false\"\n\n# DPDK\nDPDK=\"false\"\nDPDK_SUPPORTED_VERSIONS=(\"19.11\")\nDPDK_VERSION=\"\"\nDPDK_CPU=\"1000m\"                        # Default CPU configuration for if --dpdk-cpu flag is not included\nDPDK_MEMORY=\"2Gi\"                       # Default Memory configuration for it --dpdk-memory flag is not included\n\n# performance\nMODULES=\"kube_ovn_fastpath.ko\"\nRPMS=\"openvswitch-kmod\"\nGC_INTERVAL=360\nINSPECT_INTERVAL=20\n\ndisplay_help() {\n    echo \"Usage: $0 [option...]\"\n    echo\n    echo \"  -h, --help               Print Help (this message) and exit\"\n    echo \"  --with-hybrid-dpdk       Install Kube-OVN with nodes which run ovs-dpdk or ovs-kernel\"\n    echo \"  --with-dpdk=<version>    Install Kube-OVN with OVS-DPDK instead of kernel OVS\"\n    echo \"  --dpdk-cpu=<amount>m     Configure DPDK to use a specific amount of CPU\"\n    echo \"  --dpdk-memory=<amount>Gi Configure DPDK to use a specific amount of memory\"\n    echo\n    exit 0\n}\n\nif [ -n \"${1-}\" ]\nthen\n  set +u\n  while :; do\n    case $1 in\n      -h|--help)\n        display_help\n      ;;\n      --with-hybrid-dpdk)\n      HYBRID_DPDK=\"true\"\n      ;;\n      --with-dpdk=*)\n        DPDK=true\n        DPDK_VERSION=\"${1#*=}\"\n        if [[ ! \"${DPDK_SUPPORTED_VERSIONS[@]}\" = \"${DPDK_VERSION}\" ]] || [[ -z \"${DPDK_VERSION}\" ]]; then\n          echo \"Unsupported DPDK version: ${DPDK_VERSION}\"\n          echo \"Supported DPDK versions: ${DPDK_SUPPORTED_VERSIONS[*]}\"\n          exit 1\n        fi\n      ;;\n      --dpdk-cpu=*)\n        DPDK_CPU=\"${1#*=}\"\n        if [[ $DPDK_CPU =~ ^[0-9]+(m)$ ]]\n        then\n           echo \"CPU $DPDK_CPU\"\n        else\n           echo \"$DPDK_CPU is not valid, please use the format --dpdk-cpu=<amount>m\"\n           exit 1\n        fi\n      ;;\n      --dpdk-memory=*)\n        DPDK_MEMORY=\"${1#*=}\"\n        if [[ $DPDK_MEMORY =~ ^[0-9]+(Gi)$ ]]\n        then\n           echo \"MEMORY $DPDK_MEMORY\"\n        else\n           echo \"$DPDK_MEMORY is not valid, please use the format --dpdk-memory=<amount>Gi\"\n           exit 1\n        fi\n      ;;\n      -?*)\n        echo \"Unknown argument $1\"\n        exit 1\n      ;;\n      *) break\n    esac\n    shift\n  done\n  set -u\nfi\n\necho \"-------------------------------\"\necho \"Kube-OVN Version:     $VERSION\"\necho \"Default Network Mode: $NETWORK_TYPE\"\nif [[ $NETWORK_TYPE = \"vlan\" ]];then\n  echo \"Default Vlan Nic:     $VLAN_INTERFACE_NAME\"\n  echo \"Default Vlan ID:      $VLAN_ID\"\nfi\necho \"Default Subnet CIDR:  $POD_CIDR\"\necho \"Join Subnet CIDR:     $JOIN_CIDR\"\necho \"Enable SVC LB:        $ENABLE_LB\"\necho \"Enable Networkpolicy: $ENABLE_NP\"\necho \"Enable EIP and SNAT:  $ENABLE_EIP_SNAT\"\necho \"Enable Mirror:        $ENABLE_MIRROR\"\necho \"-------------------------------\"\n\nif [[ $ENABLE_SSL = \"true\" ]];then\n  echo \"[Step 0/6] Generate SSL key and cert\"\n  exist=$(kubectl get secret -n kube-system kube-ovn-tls --ignore-not-found)\n  if [[ $exist == \"\" ]];then\n    docker run --rm -v \"$PWD\":/etc/ovn $REGISTRY/kube-ovn:$VERSION bash generate-ssl.sh\n    kubectl create secret generic -n kube-system kube-ovn-tls --from-file=cacert=cacert.pem --from-file=cert=ovn-cert.pem --from-file=key=ovn-privkey.pem\n    rm -rf cacert.pem ovn-cert.pem ovn-privkey.pem ovn-req.pem\n  fi\n  echo \"-------------------------------\"\n  echo \"\"\nfi\n\necho \"[Step 1/6] Label kube-ovn-master node and label datapath type\"\ncount=$(kubectl get no -l$LABEL --no-headers | wc -l)\nnode_label=\"$LABEL\"\nif [ $count -eq 0 ]; then\n  count=$(kubectl get no -l$DEPRECATED_LABEL --no-headers | wc -l)\n  node_label=\"$DEPRECATED_LABEL\"\n  if [ $count -eq 0 ]; then\n    echo \"ERROR: No node with label $LABEL or $DEPRECATED_LABEL found\"\n    exit 1\n  fi\nfi\nkubectl label no -l$node_label kube-ovn/role=master --overwrite\n\nif [ \"$DPDK\" = \"true\" -o \"$HYBRID_DPDK\" = \"true\" ]; then\n  kubectl label no -lovn.kubernetes.io/ovs_dp_type!=userspace ovn.kubernetes.io/ovs_dp_type=kernel --overwrite\nfi\n\necho \"-------------------------------\"\necho \"\"\n\necho \"[Step 2/6] Install OVN components\"\naddresses=$(kubectl get no -lkube-ovn/role=master --no-headers -o wide | awk '{print $6}' | tr \\\\n ',')\ncount=$(kubectl get no -lkube-ovn/role=master --no-headers | wc -l)\necho \"Install OVN DB in $addresses\"\n\ncat <<EOF > kube-ovn-crd.yaml\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: vpc-dnses.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: vpc-dnses\n    singular: vpc-dns\n    shortNames:\n      - vpc-dns\n    kind: VpcDns\n    listKind: VpcDnsList\n  scope: Cluster\n  versions:\n    - additionalPrinterColumns:\n        - jsonPath: .status.active\n          name: Active\n          type: boolean\n        - jsonPath: .spec.vpc\n          name: Vpc\n          type: string\n        - jsonPath: .spec.subnet\n          name: Subnet\n          type: string\n      name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              properties:\n                vpc:\n                  type: string\n                subnet:\n                  type: string\n            status:\n              type: object\n              properties:\n                active:\n                  type: boolean\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: switch-lb-rules.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: switch-lb-rules\n    singular: switch-lb-rule\n    shortNames:\n      - slr\n    kind: SwitchLBRule\n    listKind: SwitchLBRuleList\n  scope: Cluster\n  versions:\n    - additionalPrinterColumns:\n        - jsonPath: .spec.vip\n          name: vip\n          type: string\n        - jsonPath: .status.ports\n          name: port(s)\n          type: string\n        - jsonPath: .status.service\n          name: service\n          type: string\n        - jsonPath: .metadata.creationTimestamp\n          name: age\n          type: date\n      name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              properties:\n                namespace:\n                  type: string\n                vip:\n                  type: string\n                sessionAffinity:\n                  type: string\n                ports:\n                  items:\n                    properties:\n                      name:\n                        type: string\n                      port:\n                        type: integer\n                        minimum: 1\n                        maximum: 65535\n                      protocol:\n                        type: string\n                      targetPort:\n                        type: integer\n                        minimum: 1\n                        maximum: 65535\n                    type: object\n                  type: array\n                selector:\n                  items:\n                    type: string\n                  type: array\n            status:\n              type: object\n              properties:\n                ports:\n                  type: string\n                service:\n                  type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: vpc-nat-gateways.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: vpc-nat-gateways\n    singular: vpc-nat-gateway\n    shortNames:\n      - vpc-nat-gw\n    kind: VpcNatGateway\n    listKind: VpcNatGatewayList\n  scope: Cluster\n  versions:\n    - additionalPrinterColumns:\n        - jsonPath: .spec.vpc\n          name: Vpc\n          type: string\n        - jsonPath: .spec.subnet\n          name: Subnet\n          type: string\n        - jsonPath: .spec.lanIp\n          name: LanIP\n          type: string\n      name: v1\n      served: true\n      storage: true\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              properties:\n                lanIp:\n                  type: string\n                subnet:\n                  type: string\n                vpc:\n                  type: string\n                selector:\n                  type: array\n                  items:\n                    type: string\n                tolerations:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      key:\n                        type: string\n                      operator:\n                        type: string\n                      value:\n                        type: string\n                      effect:\n                        type: string\n                      tolerationSeconds:\n                        type: integer\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: iptables-eips.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: iptables-eips\n    singular: iptables-eip\n    shortNames:\n      - eip\n    kind: IptablesEIP\n    listKind: IptablesEIPList\n  scope: Cluster\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      additionalPrinterColumns:\n      - jsonPath: .status.ip\n        name: IP\n        type: string\n      - jsonPath: .spec.macAddress\n        name: Mac\n        type: string\n      - jsonPath: .status.nat\n        name: Nat\n        type: string\n      - jsonPath: .spec.natGwDp\n        name: NatGwDp\n        type: string\n      - jsonPath: .status.ready\n        name: Ready\n        type: boolean\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            status:\n              type: object\n              properties:\n                ready:\n                  type: boolean\n                ip:\n                  type: string\n                nat:\n                  type: string\n                redo:\n                  type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n            spec:\n              type: object\n              properties:\n                v4ip:\n                  type: string\n                v6ip:\n                  type: string\n                macAddress:\n                  type: string\n                natGwDp:\n                  type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: iptables-fip-rules.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: iptables-fip-rules\n    singular: iptables-fip-rule\n    shortNames:\n      - fip\n    kind: IptablesFIPRule\n    listKind: IptablesFIPRuleList\n  scope: Cluster\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      additionalPrinterColumns:\n      - jsonPath: .spec.eip\n        name: Eip\n        type: string\n      - jsonPath: .status.v4ip\n        name: V4ip\n        type: string\n      - jsonPath: .spec.internalIp\n        name: InternalIp\n        type: string\n      - jsonPath: .status.v6ip\n        name: V6ip\n        type: string\n      - jsonPath: .status.ready\n        name: Ready\n        type: boolean\n      - jsonPath: .status.natGwDp\n        name: NatGwDp\n        type: string\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            status:\n              type: object\n              properties:\n                ready:\n                  type: boolean\n                v4ip:\n                  type: string\n                v6ip:\n                  type: string\n                natGwDp:\n                  type: string\n                redo:\n                  type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n            spec:\n              type: object\n              properties:\n                eip:\n                  type: string\n                internalIp:\n                  type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: iptables-dnat-rules.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: iptables-dnat-rules\n    singular: iptables-dnat-rule\n    shortNames:\n      - dnat\n    kind: IptablesDnatRule\n    listKind: IptablesDnatRuleList\n  scope: Cluster\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      additionalPrinterColumns:\n      - jsonPath: .spec.eip\n        name: Eip\n        type: string\n      - jsonPath: .spec.protocol\n        name: Protocol\n        type: string\n      - jsonPath: .status.v4ip\n        name: V4ip\n        type: string\n      - jsonPath: .status.v6ip\n        name: V6ip\n        type: string\n      - jsonPath: .spec.internalIp\n        name: InternalIp\n        type: string\n      - jsonPath: .spec.externalPort\n        name: ExternalPort\n        type: string\n      - jsonPath: .spec.internalPort\n        name: InternalPort\n        type: string\n      - jsonPath: .status.natGwDp\n        name: NatGwDp\n        type: string\n      - jsonPath: .status.ready\n        name: Ready\n        type: boolean\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            status:\n              type: object\n              properties:\n                ready:\n                  type: boolean\n                v4ip:\n                  type: string\n                v6ip:\n                  type: string\n                natGwDp:\n                  type: string\n                redo:\n                  type: string\n                protocol:\n                  type: string\n                internalIp:\n                  type: string\n                internalPort:\n                  type: string\n                externalPort:\n                  type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n            spec:\n              type: object\n              properties:\n                eip:\n                  type: string\n                externalPort:\n                  type: string\n                protocol:\n                  type: string\n                internalIp:\n                  type: string\n                internalPort:\n                  type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: iptables-snat-rules.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: iptables-snat-rules\n    singular: iptables-snat-rule\n    shortNames:\n      - snat\n    kind: IptablesSnatRule\n    listKind: IptablesSnatRuleList\n  scope: Cluster\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      additionalPrinterColumns:\n      - jsonPath: .spec.eip\n        name: EIP\n        type: string\n      - jsonPath: .status.v4ip\n        name: V4ip\n        type: string\n      - jsonPath: .status.v6ip\n        name: V6ip\n        type: string\n      - jsonPath: .spec.internalCIDR\n        name: InternalCIDR\n        type: string\n      - jsonPath: .status.natGwDp\n        name: NatGwDp\n        type: string\n      - jsonPath: .status.ready\n        name: Ready\n        type: boolean\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            status:\n              type: object\n              properties:\n                ready:\n                  type: boolean\n                v4ip:\n                  type: string\n                v6ip:\n                  type: string\n                natGwDp:\n                  type: string\n                redo:\n                  type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n            spec:\n              type: object\n              properties:\n                eip:\n                  type: string\n                internalCIDR:\n                  type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: ovn-eips.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: ovn-eips\n    singular: ovn-eip\n    shortNames:\n      - oeip\n    kind: OvnEip\n    listKind: OvnEipList\n  scope: Cluster\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      additionalPrinterColumns:\n      - jsonPath: .spec.v4ip\n        name: IP\n        type: string\n      - jsonPath: .spec.macAddress\n        name: Mac\n        type: string\n      - jsonPath: .spec.type\n        name: Type\n        type: string\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            status:\n              type: object\n              properties:\n                v4Ip:\n                  type: string\n                macAddress:\n                  type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n            spec:\n              type: object\n              properties:\n                externalSubnet:\n                  type: string\n                type:\n                  type: string\n                v4ip:\n                  type: string\n                macAddress:\n                  type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: ovn-fips.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: ovn-fips\n    singular: ovn-fip\n    shortNames:\n      - ofip\n    kind: OvnFip\n    listKind: OvnFipList\n  scope: Cluster\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      additionalPrinterColumns:\n      - jsonPath: .status.vpc\n        name: Vpc\n        type: string\n      - jsonPath: .status.v4Eip\n        name: V4Eip\n        type: string\n      - jsonPath: .status.v4Ip\n        name: V4Ip\n        type: string\n      - jsonPath: .status.ready\n        name: Ready\n        type: boolean\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            status:\n              type: object\n              properties:\n                ready:\n                  type: boolean\n                v4Eip:\n                  type: string\n                v4Ip:\n                  type: string\n                macAddress:\n                  type: string\n                vpc:\n                  type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n            spec:\n              type: object\n              properties:\n                ovnEip:\n                  type: string\n                ipName:\n                  type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: ovn-snat-rules.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: ovn-snat-rules\n    singular: ovn-snat-rule\n    shortNames:\n      - osnat\n    kind: OvnSnatRule\n    listKind: OvnSnatRuleList\n  scope: Cluster\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      additionalPrinterColumns:\n      - jsonPath: .status.vpc\n        name: Vpc\n        type: string\n      - jsonPath: .status.v4Eip\n        name: V4Eip\n        type: string\n      - jsonPath: .status.v4ipCidr\n        name: V4Ip\n        type: string\n      - jsonPath: .status.ready\n        name: Ready\n        type: boolean\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            status:\n              type: object\n              properties:\n                ready:\n                  type: boolean\n                v4Eip:\n                  type: string\n                v4ipCidr:\n                  type: string\n                vpc:\n                  type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n            spec:\n              type: object\n              properties:\n                ovnEip:\n                  type: string\n                vpcSubnet:\n                  type: string\n                ipName:\n                  type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: vpcs.kubeovn.io\nspec:\n  group: kubeovn.io\n  versions:\n    - additionalPrinterColumns:\n        - jsonPath: .status.enableExternal\n          name: EnableExternal\n          type: boolean\n        - jsonPath: .status.standby\n          name: Standby\n          type: boolean\n        - jsonPath: .status.subnets\n          name: Subnets\n          type: string\n        - jsonPath: .spec.namespaces\n          name: Namespaces\n          type: string\n      name: v1\n      schema:\n        openAPIV3Schema:\n          properties:\n            spec:\n              properties:\n                enableExternal:\n                  type: boolean\n                namespaces:\n                  items:\n                    type: string\n                  type: array\n                staticRoutes:\n                  items:\n                    properties:\n                      policy:\n                        type: string\n                      cidr:\n                        type: string\n                      nextHopIP:\n                        type: string\n                    type: object\n                  type: array\n                policyRoutes:\n                  items:\n                    properties:\n                      priority:\n                        type: integer\n                      action:\n                        type: string\n                      match:\n                        type: string\n                      nextHopIP:\n                        type: string\n                    type: object\n                  type: array\n                vpcPeerings:\n                  items:\n                    properties:\n                      remoteVpc:\n                        type: string\n                      localConnectIP:\n                        type: string\n                    type: object\n                  type: array\n              type: object\n            status:\n              properties:\n                conditions:\n                  items:\n                    properties:\n                      lastTransitionTime:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      message:\n                        type: string\n                      reason:\n                        type: string\n                      status:\n                        type: string\n                      type:\n                        type: string\n                    type: object\n                  type: array\n                default:\n                  type: boolean\n                defaultLogicalSwitch:\n                  type: string\n                router:\n                  type: string\n                standby:\n                  type: boolean\n                enableExternal:\n                  type: boolean\n                subnets:\n                  items:\n                    type: string\n                  type: array\n                vpcPeerings:\n                  items:\n                    type: string\n                  type: array\n                tcpLoadBalancer:\n                  type: string\n                tcpSessionLoadBalancer:\n                  type: string\n                udpLoadBalancer:\n                  type: string\n                udpSessionLoadBalancer:\n                  type: string\n                sctpLoadBalancer:\n                  type: string\n                sctpSessionLoadBalancer:\n                  type: string\n              type: object\n          type: object\n      served: true\n      storage: true\n      subresources:\n        status: {}\n  names:\n    kind: Vpc\n    listKind: VpcList\n    plural: vpcs\n    shortNames:\n      - vpc\n    singular: vpc\n  scope: Cluster\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: ips.kubeovn.io\nspec:\n  group: kubeovn.io\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      additionalPrinterColumns:\n      - name: V4IP\n        type: string\n        jsonPath: .spec.v4IpAddress\n      - name: V6IP\n        type: string\n        jsonPath: .spec.v6IpAddress\n      - name: Mac\n        type: string\n        jsonPath: .spec.macAddress\n      - name: Node\n        type: string\n        jsonPath: .spec.nodeName\n      - name: Subnet\n        type: string\n        jsonPath: .spec.subnet\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              properties:\n                podName:\n                  type: string\n                namespace:\n                  type: string\n                subnet:\n                  type: string\n                attachSubnets:\n                  type: array\n                  items:\n                    type: string\n                nodeName:\n                  type: string\n                ipAddress:\n                  type: string\n                v4IpAddress:\n                  type: string\n                v6IpAddress:\n                  type: string\n                attachIps:\n                  type: array\n                  items:\n                    type: string\n                macAddress:\n                  type: string\n                attachMacs:\n                  type: array\n                  items:\n                    type: string\n                containerID:\n                  type: string\n                podType:\n                  type: string\n  scope: Cluster\n  names:\n    plural: ips\n    singular: ip\n    kind: IP\n    shortNames:\n      - ip\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: vips.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: vips\n    singular: vip\n    shortNames:\n      - vip\n    kind: Vip\n    listKind: VipList\n  scope: Cluster\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      additionalPrinterColumns:\n      - name: V4IP\n        type: string\n        jsonPath: .status.v4ip\n      - name: PV4IP\n        type: string\n        jsonPath: .spec.parentV4ip\n      - name: Mac\n        type: string\n        jsonPath: .status.mac\n      - name: PMac\n        type: string\n        jsonPath: .spec.parentMac\n      - name: V6IP\n        type: string\n        jsonPath: .status.v6ip\n      - name: PV6IP\n        type: string\n        jsonPath: .spec.parentV6ip\n      - name: Subnet\n        type: string\n        jsonPath: .spec.subnet\n      - jsonPath: .status.ready\n        name: Ready\n        type: boolean\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            status:\n              type: object\n              properties:\n                ready:\n                  type: boolean\n                v4ip:\n                  type: string\n                v6ip:\n                  type: string\n                mac:\n                  type: string\n                pv4ip:\n                  type: string\n                pv6ip:\n                  type: string\n                pmac:\n                  type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n            spec:\n              type: object\n              properties:\n                namespace:\n                  type: string\n                subnet:\n                  type: string\n                attachSubnets:\n                  type: array\n                  items:\n                    type: string\n                v4ip:\n                  type: string\n                macAddress:\n                  type: string\n                v6ip:\n                  type: string\n                parentV4ip:\n                  type: string\n                parentMac:\n                  type: string\n                parentV6ip:\n                  type: string\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: subnets.kubeovn.io\nspec:\n  group: kubeovn.io\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      additionalPrinterColumns:\n      - name: Provider\n        type: string\n        jsonPath: .spec.provider\n      - name: Vpc\n        type: string\n        jsonPath: .spec.vpc\n      - name: Protocol\n        type: string\n        jsonPath: .spec.protocol\n      - name: CIDR\n        type: string\n        jsonPath: .spec.cidrBlock\n      - name: Private\n        type: boolean\n        jsonPath: .spec.private\n      - name: NAT\n        type: boolean\n        jsonPath: .spec.natOutgoing\n      - name: Default\n        type: boolean\n        jsonPath: .spec.default\n      - name: GatewayType\n        type: string\n        jsonPath: .spec.gatewayType\n      - name: V4Used\n        type: number\n        jsonPath: .status.v4usingIPs\n      - name: V4Available\n        type: number\n        jsonPath: .status.v4availableIPs\n      - name: V6Used\n        type: number\n        jsonPath: .status.v6usingIPs\n      - name: V6Available\n        type: number\n        jsonPath: .status.v6availableIPs\n      - name: ExcludeIPs\n        type: string\n        jsonPath: .spec.excludeIps\n      - name: U2OInterconnectionIP\n        type: string\n        jsonPath: .status.u2oInterconnectionIP\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            status:\n              type: object\n              properties:\n                v4availableIPs:\n                  type: number\n                v4usingIPs:\n                  type: number\n                v6availableIPs:\n                  type: number\n                v6usingIPs:\n                  type: number\n                activateGateway:\n                  type: string\n                dhcpV4OptionsUUID:\n                  type: string\n                dhcpV6OptionsUUID:\n                  type: string\n                u2oInterconnectionIP:\n                  type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n            spec:\n              type: object\n              properties:\n                vpc:\n                  type: string\n                default:\n                  type: boolean\n                protocol:\n                  type: string\n                  enum:\n                    - IPv4\n                    - IPv6\n                    - Dual\n                cidrBlock:\n                  type: string\n                namespaces:\n                  type: array\n                  items:\n                    type: string\n                gateway:\n                  type: string\n                provider:\n                  type: string\n                excludeIps:\n                  type: array\n                  items:\n                    type: string\n                vips:\n                  type: array\n                  items:\n                    type: string\n                gatewayType:\n                  type: string\n                allowSubnets:\n                  type: array\n                  items:\n                    type: string\n                gatewayNode:\n                  type: string\n                natOutgoing:\n                  type: boolean\n                u2oRouting:\n                  type: boolean\n                externalEgressGateway:\n                  type: string\n                policyRoutingPriority:\n                  type: integer\n                  minimum: 1\n                  maximum: 32765\n                policyRoutingTableID:\n                  type: integer\n                  minimum: 1\n                  maximum: 2147483647\n                  not:\n                    enum:\n                      - 252 # compat\n                      - 253 # default\n                      - 254 # main\n                      - 255 # local\n                private:\n                  type: boolean\n                vlan:\n                  type: string\n                logicalGateway:\n                  type: boolean\n                disableGatewayCheck:\n                  type: boolean\n                disableInterConnection:\n                  type: boolean\n                enableDHCP:\n                  type: boolean\n                dhcpV4Options:\n                  type: string\n                dhcpV6Options:\n                  type: string\n                enableIPv6RA:\n                  type: boolean\n                ipv6RAConfigs:\n                  type: string\n                acls:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      direction:\n                        type: string\n                        enum:\n                          - from-lport\n                          - to-lport\n                      priority:\n                        type: integer\n                        minimum: 0\n                        maximum: 32767\n                      match:\n                        type: string\n                      action:\n                        type: string\n                        enum:\n                          - allow-related\n                          - allow-stateless\n                          - allow\n                          - drop\n                          - reject\n                u2oInterconnection:\n                  type: boolean\n  scope: Cluster\n  names:\n    plural: subnets\n    singular: subnet\n    kind: Subnet\n    shortNames:\n      - subnet\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: vlans.kubeovn.io\nspec:\n  group: kubeovn.io\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              properties:\n                id:\n                  type: integer\n                  minimum: 0\n                  maximum: 4095\n                provider:\n                  type: string\n                vlanId:\n                  type: integer\n                  description: Deprecated in favor of id\n                providerInterfaceName:\n                  type: string\n                  description: Deprecated in favor of provider\n              required:\n                - provider\n            status:\n              type: object\n              properties:\n                subnets:\n                  type: array\n                  items:\n                    type: string\n      additionalPrinterColumns:\n      - name: ID\n        type: string\n        jsonPath: .spec.id\n      - name: Provider\n        type: string\n        jsonPath: .spec.provider\n  scope: Cluster\n  names:\n    plural: vlans\n    singular: vlan\n    kind: Vlan\n    shortNames:\n      - vlan\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: provider-networks.kubeovn.io\nspec:\n  group: kubeovn.io\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      subresources:\n        status: {}\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            metadata:\n              type: object\n              properties:\n                name:\n                  type: string\n                  maxLength: 12\n                  not:\n                    enum:\n                      - int\n                      - external\n            spec:\n              type: object\n              properties:\n                defaultInterface:\n                  type: string\n                  maxLength: 15\n                  pattern: '^[^/\\s]+$'\n                customInterfaces:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      interface:\n                        type: string\n                        maxLength: 15\n                        pattern: '^[^/\\s]+$'\n                      nodes:\n                        type: array\n                        items:\n                          type: string\n                exchangeLinkName:\n                  type: boolean\n                excludeNodes:\n                  type: array\n                  items:\n                    type: string\n              required:\n                - defaultInterface\n            status:\n              type: object\n              properties:\n                ready:\n                  type: boolean\n                readyNodes:\n                  type: array\n                  items:\n                    type: string\n                notReadyNodes:\n                  type: array\n                  items:\n                    type: string\n                vlans:\n                  type: array\n                  items:\n                    type: string\n                conditions:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      node:\n                        type: string\n                      type:\n                        type: string\n                      status:\n                        type: string\n                      reason:\n                        type: string\n                      message:\n                        type: string\n                      lastUpdateTime:\n                        type: string\n                      lastTransitionTime:\n                        type: string\n      additionalPrinterColumns:\n      - name: DefaultInterface\n        type: string\n        jsonPath: .spec.defaultInterface\n      - name: Ready\n        type: boolean\n        jsonPath: .status.ready\n  scope: Cluster\n  names:\n    plural: provider-networks\n    singular: provider-network\n    kind: ProviderNetwork\n    listKind: ProviderNetworkList\n---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: security-groups.kubeovn.io\nspec:\n  group: kubeovn.io\n  names:\n    plural: security-groups\n    singular: security-group\n    shortNames:\n      - sg\n    kind: SecurityGroup\n    listKind: SecurityGroupList\n  scope: Cluster\n  versions:\n    - name: v1\n      served: true\n      storage: true\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              properties:\n                ingressRules:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      ipVersion:\n                        type: string\n                      protocol:\n                        type: string\n                      priority:\n                        type: integer\n                      remoteType:\n                        type: string\n                      remoteAddress:\n                        type: string\n                      remoteSecurityGroup:\n                        type: string\n                      portRangeMin:\n                        type: integer\n                      portRangeMax:\n                        type: integer\n                      policy:\n                        type: string\n                egressRules:\n                  type: array\n                  items:\n                    type: object\n                    properties:\n                      ipVersion:\n                        type: string\n                      protocol:\n                        type: string\n                      priority:\n                        type: integer\n                      remoteType:\n                        type: string\n                      remoteAddress:\n                        type: string\n                      remoteSecurityGroup:\n                        type: string\n                      portRangeMin:\n                        type: integer\n                      portRangeMax:\n                        type: integer\n                      policy:\n                        type: string\n                allowSameGroupTraffic:\n                  type: boolean\n            status:\n              type: object\n              properties:\n                portGroup:\n                  type: string\n                allowSameGroupTraffic:\n                  type: boolean\n                ingressMd5:\n                  type: string\n                egressMd5:\n                  type: string\n                ingressLastSyncSuccess:\n                  type: boolean\n                egressLastSyncSuccess:\n                  type: boolean\n      subresources:\n        status: {}\n  conversion:\n    strategy: None\nEOF\n\nif $DPDK; then\n  cat <<EOF > ovn.yaml\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: ovn\n  namespace: kube-system\n\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  annotations:\n    rbac.authorization.k8s.io/system-only: \"true\"\n  name: system:ovn\nrules:\n  - apiGroups:\n      - \"kubeovn.io\"\n    resources:\n      - vpcs\n      - vpcs/status\n      - vpc-nat-gateways\n      - subnets\n      - subnets/status\n      - ips\n      - vips\n      - vips/status\n      - vlans\n      - vlans/status\n      - provider-networks\n      - provider-networks/status\n      - security-groups\n      - security-groups/status\n      - iptables-eips\n      - iptables-fip-rules\n      - iptables-dnat-rules\n      - iptables-snat-rules\n      - iptables-eips/status\n      - iptables-fip-rules/status\n      - iptables-dnat-rules/status\n      - iptables-snat-rules/status\n      - ovn-eips\n      - ovn-fips\n      - ovn-snat-rules\n      - ovn-eips/status\n      - ovn-fips/status\n      - ovn-snat-rules/status\n      - switch-lb-rules\n      - switch-lb-rules/status\n      - vpc-dnses\n      - vpc-dnses/status\n    verbs:\n      - \"*\"\n  - apiGroups:\n      - \"\"\n    resources:\n      - pods\n      - pods/exec\n      - namespaces\n      - nodes\n      - configmaps\n    verbs:\n      - create\n      - get\n      - list\n      - watch\n      - patch\n      - update\n  - apiGroups:\n      - \"k8s.cni.cncf.io\"\n    resources:\n      - network-attachment-definitions\n    verbs:\n      - create\n      - delete\n      - get\n      - list\n      - update\n  - apiGroups:\n      - \"\"\n      - networking.k8s.io\n      - apps\n      - extensions\n    resources:\n      - networkpolicies\n      - services\n      - services/status\n      - endpoints\n      - statefulsets\n      - daemonsets\n      - deployments\n      - deployments/scale\n    verbs:\n      - create\n      - delete\n      - update\n      - patch\n      - get\n      - list\n      - watch\n  - apiGroups:\n      - \"\"\n    resources:\n      - events\n    verbs:\n      - create\n      - patch\n      - update\n  - apiGroups:\n      - coordination.k8s.io\n    resources:\n      - leases\n    verbs:\n      - \"*\"\n  - apiGroups:\n      - \"kubevirt.io\"\n    resources:\n      - virtualmachines\n      - virtualmachineinstances\n    verbs:\n      - get\n      - list\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: ovn\nroleRef:\n  name: system:ovn\n  kind: ClusterRole\n  apiGroup: rbac.authorization.k8s.io\nsubjects:\n  - kind: ServiceAccount\n    name: ovn\n    namespace: kube-system\n\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: ovn-nb\n  namespace: kube-system\nspec:\n  ports:\n    - name: ovn-nb\n      protocol: TCP\n      port: 6641\n      targetPort: 6641\n  type: ClusterIP\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: ovn-central\n    ovn-nb-leader: \"true\"\n  sessionAffinity: None\n\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: ovn-sb\n  namespace: kube-system\nspec:\n  ports:\n    - name: ovn-sb\n      protocol: TCP\n      port: 6642\n      targetPort: 6642\n  type: ClusterIP\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: ovn-central\n    ovn-sb-leader: \"true\"\n  sessionAffinity: None\n\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: ovn-northd\n  namespace: kube-system\nspec:\n  ports:\n    - name: ovn-northd\n      protocol: TCP\n      port: 6643\n      targetPort: 6643\n  type: ClusterIP\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: ovn-central\n    ovn-northd-leader: \"true\"\n  sessionAffinity: None\n---\nkind: Deployment\napiVersion: apps/v1\nmetadata:\n  name: ovn-central\n  namespace: kube-system\n  annotations:\n    kubernetes.io/description: |\n      OVN components: northd, nb and sb.\nspec:\n  replicas: $count\n  strategy:\n    rollingUpdate:\n      maxSurge: 0\n      maxUnavailable: 1\n    type: RollingUpdate\n  selector:\n    matchLabels:\n      app: ovn-central\n  template:\n    metadata:\n      labels:\n        app: ovn-central\n        component: network\n        type: infra\n    spec:\n      tolerations:\n        - effect: NoSchedule\n          operator: Exists\n        - effect: NoExecute\n          operator: Exists\n        - key: CriticalAddonsOnly\n          operator: Exists\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - labelSelector:\n                matchLabels:\n                  app: ovn-central\n              topologyKey: kubernetes.io/hostname\n      priorityClassName: system-cluster-critical\n      serviceAccountName: ovn\n      hostNetwork: true\n      containers:\n        - name: ovn-central\n          image: \"$REGISTRY/kube-ovn:$VERSION\"\n          imagePullPolicy: $IMAGE_PULL_POLICY\n          command: [\"/kube-ovn/start-db.sh\"]\n          securityContext:\n            capabilities:\n              add: [\"SYS_NICE\"]\n          env:\n            - name: ENABLE_SSL\n              value: \"$ENABLE_SSL\"\n            - name: NODE_IPS\n              value: $addresses\n            - name: POD_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_IPS\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIPs\n            - name: ENABLE_BIND_LOCAL_IP\n              value: \"$ENABLE_BIND_LOCAL_IP\"\n          resources:\n            requests:\n              cpu: 300m\n              memory: 300Mi\n            limits:\n              cpu: 3\n              memory: 4Gi\n          volumeMounts:\n            - mountPath: /var/run/openvswitch\n              name: host-run-ovs\n            - mountPath: /var/run/ovn\n              name: host-run-ovn\n            - mountPath: /sys\n              name: host-sys\n              readOnly: true\n            - mountPath: /etc/openvswitch\n              name: host-config-openvswitch\n            - mountPath: /etc/ovn\n              name: host-config-ovn\n            - mountPath: /var/log/openvswitch\n              name: host-log-ovs\n            - mountPath: /var/log/ovn\n              name: host-log-ovn\n            - mountPath: /etc/localtime\n              name: localtime\n            - mountPath: /var/run/tls\n              name: kube-ovn-tls\n          readinessProbe:\n            exec:\n              command:\n                - bash\n                - /kube-ovn/ovn-healthcheck.sh\n            periodSeconds: 15\n            timeoutSeconds: 45\n          livenessProbe:\n            exec:\n              command:\n                - bash\n                - /kube-ovn/ovn-healthcheck.sh\n            initialDelaySeconds: 30\n            periodSeconds: 15\n            failureThreshold: 5\n            timeoutSeconds: 45\n      nodeSelector:\n        kubernetes.io/os: \"linux\"\n        kube-ovn/role: \"master\"\n      volumes:\n        - name: host-run-ovs\n          hostPath:\n            path: /run/openvswitch\n        - name: host-run-ovn\n          hostPath:\n            path: /run/ovn\n        - name: host-sys\n          hostPath:\n            path: /sys\n        - name: host-config-openvswitch\n          hostPath:\n            path: /etc/origin/openvswitch\n        - name: host-config-ovn\n          hostPath:\n            path: /etc/origin/ovn\n        - name: host-log-ovs\n          hostPath:\n            path: /var/log/openvswitch\n        - name: host-log-ovn\n          hostPath:\n            path: /var/log/ovn\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n        - name: kube-ovn-tls\n          secret:\n            optional: true\n            secretName: kube-ovn-tls\n\n---\nkind: DaemonSet\napiVersion: apps/v1\nmetadata:\n  name: ovs-ovn\n  namespace: kube-system\n  annotations:\n    kubernetes.io/description: |\n      This daemon set launches the openvswitch daemon.\nspec:\n  selector:\n    matchLabels:\n      app: ovs\n  updateStrategy:\n    type: OnDelete\n  template:\n    metadata:\n      labels:\n        app: ovs\n        component: network\n        type: infra\n    spec:\n      tolerations:\n        - effect: NoSchedule\n          operator: Exists\n        - effect: NoExecute\n          operator: Exists\n        - key: CriticalAddonsOnly\n          operator: Exists\n      priorityClassName: system-node-critical\n      serviceAccountName: ovn\n      hostNetwork: true\n      hostPID: true\n      containers:\n        - name: openvswitch\n          image: \"$REGISTRY/kube-ovn-dpdk:$DPDK_VERSION-$VERSION\"\n          imagePullPolicy: $IMAGE_PULL_POLICY\n          command: [\"/kube-ovn/start-ovs-dpdk.sh\"]\n          securityContext:\n            runAsUser: 0\n            privileged: true\n          env:\n            - name: ENABLE_SSL\n              value: \"$ENABLE_SSL\"\n            - name: POD_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: KUBE_NODE_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: spec.nodeName\n            - name: OVN_DB_IPS\n              value: $addresses\n          volumeMounts:\n            - mountPath: /var/run/netns\n              name: host-ns\n              mountPropagation: HostToContainer\n            - mountPath: /lib/modules\n              name: host-modules\n              readOnly: true\n            - mountPath: /var/run/openvswitch\n              name: host-run-ovs\n            - mountPath: /var/run/ovn\n              name: host-run-ovn\n            - mountPath: /sys\n              name: host-sys\n              readOnly: true\n            - mountPath: /etc/cni/net.d\n              name: cni-conf\n            - mountPath: /etc/openvswitch\n              name: host-config-openvswitch\n            - mountPath: /etc/ovn\n              name: host-config-ovn\n            - mountPath: /var/log/openvswitch\n              name: host-log-ovs\n            - mountPath: /var/log/ovn\n              name: host-log-ovn\n            - mountPath: /opt/ovs-config\n              name: host-config-ovs\n            - mountPath: /dev/hugepages\n              name: hugepage\n            - mountPath: /etc/localtime\n              name: localtime\n            - mountPath: /var/run/tls\n              name: kube-ovn-tls\n          readinessProbe:\n            exec:\n              command:\n                - bash\n                - /kube-ovn/ovs-dpdk-healthcheck.sh\n            periodSeconds: 5\n            timeoutSeconds: 45\n          livenessProbe:\n            exec:\n              command:\n                - bash\n                - /kube-ovn/ovs-dpdk-healthcheck.sh\n            initialDelaySeconds: 60\n            periodSeconds: 5\n            failureThreshold: 5\n            timeoutSeconds: 45\n          resources:\n            requests:\n              cpu: $DPDK_CPU\n              memory: $DPDK_MEMORY\n            limits:\n              cpu: $DPDK_CPU\n              memory: $DPDK_MEMORY\n              hugepages-1Gi: 1Gi\n      nodeSelector:\n        kubernetes.io/os: \"linux\"\n        ovn.kubernetes.io/ovs_dp_type: \"kernel\"\n      volumes:\n        - name: host-modules\n          hostPath:\n            path: /lib/modules\n        - name: host-run-ovs\n          hostPath:\n            path: /run/openvswitch\n        - name: host-run-ovn\n          hostPath:\n            path: /run/ovn\n        - name: host-sys\n          hostPath:\n            path: /sys\n        - name: host-ns\n          hostPath:\n            path: /var/run/netns\n        - name: cni-conf\n          hostPath:\n            path: /etc/cni/net.d\n        - name: host-config-openvswitch\n          hostPath:\n            path: /etc/origin/openvswitch\n        - name: host-config-ovn\n          hostPath:\n            path: /etc/origin/ovn\n        - name: host-log-ovs\n          hostPath:\n            path: /var/log/openvswitch\n        - name: host-log-ovn\n          hostPath:\n            path: /var/log/ovn\n        - name: host-config-ovs\n          hostPath:\n            path: /opt/ovs-config\n            type: DirectoryOrCreate\n        - name: hugepage\n          emptyDir:\n            medium: HugePages\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n        - name: kube-ovn-tls\n          secret:\n            optional: true\n            secretName: kube-ovn-tls\nEOF\n\nelse\n  cat <<EOF > ovn.yaml\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: ovn\n  namespace: kube-system\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  annotations:\n    rbac.authorization.k8s.io/system-only: \"true\"\n  name: system:ovn\nrules:\n  - apiGroups:\n      - \"kubeovn.io\"\n    resources:\n      - vpcs\n      - vpcs/status\n      - vpc-nat-gateways\n      - subnets\n      - subnets/status\n      - ips\n      - vips\n      - vips/status\n      - vlans\n      - vlans/status\n      - provider-networks\n      - provider-networks/status\n      - security-groups\n      - security-groups/status\n      - iptables-eips\n      - iptables-fip-rules\n      - iptables-dnat-rules\n      - iptables-snat-rules\n      - iptables-eips/status\n      - iptables-fip-rules/status\n      - iptables-dnat-rules/status\n      - iptables-snat-rules/status\n      - ovn-eips\n      - ovn-fips\n      - ovn-snat-rules\n      - ovn-eips/status\n      - ovn-fips/status\n      - ovn-snat-rules/status\n      - vpc-dnses\n      - vpc-dnses/status\n      - switch-lb-rules\n      - switch-lb-rules/status\n    verbs:\n      - \"*\"\n  - apiGroups:\n      - \"\"\n    resources:\n      - pods\n      - pods/exec\n      - namespaces\n      - nodes\n      - configmaps\n    verbs:\n      - create\n      - get\n      - list\n      - watch\n      - patch\n      - update\n  - apiGroups:\n      - \"\"\n      - networking.k8s.io\n      - apps\n      - extensions\n    resources:\n      - networkpolicies\n      - services\n      - services/status\n      - endpoints\n      - statefulsets\n      - daemonsets\n      - deployments\n      - deployments/scale\n    verbs:\n      - create\n      - delete\n      - update\n      - patch\n      - get\n      - list\n      - watch\n  - apiGroups:\n      - \"\"\n    resources:\n      - events\n    verbs:\n      - create\n      - patch\n      - update\n  - apiGroups:\n      - coordination.k8s.io\n    resources:\n      - leases\n    verbs:\n      - \"*\"\n  - apiGroups:\n      - \"k8s.cni.cncf.io\"\n    resources:\n      - network-attachment-definitions\n    verbs:\n      - create\n      - delete\n      - get\n      - list\n      - update\n  - apiGroups:\n      - \"kubevirt.io\"\n    resources:\n      - virtualmachines\n      - virtualmachineinstances\n    verbs:\n      - get\n      - list\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: ovn\nroleRef:\n  name: system:ovn\n  kind: ClusterRole\n  apiGroup: rbac.authorization.k8s.io\nsubjects:\n  - kind: ServiceAccount\n    name: ovn\n    namespace: kube-system\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: ovn-nb\n  namespace: kube-system\nspec:\n  ports:\n    - name: ovn-nb\n      protocol: TCP\n      port: 6641\n      targetPort: 6641\n  type: ClusterIP\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: ovn-central\n    ovn-nb-leader: \"true\"\n  sessionAffinity: None\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: ovn-sb\n  namespace: kube-system\nspec:\n  ports:\n    - name: ovn-sb\n      protocol: TCP\n      port: 6642\n      targetPort: 6642\n  type: ClusterIP\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: ovn-central\n    ovn-sb-leader: \"true\"\n  sessionAffinity: None\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: ovn-northd\n  namespace: kube-system\nspec:\n  ports:\n    - name: ovn-northd\n      protocol: TCP\n      port: 6643\n      targetPort: 6643\n  type: ClusterIP\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: ovn-central\n    ovn-northd-leader: \"true\"\n  sessionAffinity: None\n---\nkind: Deployment\napiVersion: apps/v1\nmetadata:\n  name: ovn-central\n  namespace: kube-system\n  annotations:\n    kubernetes.io/description: |\n      OVN components: northd, nb and sb.\nspec:\n  replicas: $count\n  strategy:\n    rollingUpdate:\n      maxSurge: 0\n      maxUnavailable: 1\n    type: RollingUpdate\n  selector:\n    matchLabels:\n      app: ovn-central\n  template:\n    metadata:\n      labels:\n        app: ovn-central\n        component: network\n        type: infra\n    spec:\n      tolerations:\n        - effect: NoSchedule\n          operator: Exists\n        - effect: NoExecute\n          operator: Exists\n        - key: CriticalAddonsOnly\n          operator: Exists\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - labelSelector:\n                matchLabels:\n                  app: ovn-central\n              topologyKey: kubernetes.io/hostname\n      priorityClassName: system-cluster-critical\n      serviceAccountName: ovn\n      hostNetwork: true\n      containers:\n        - name: ovn-central\n          image: \"$REGISTRY/kube-ovn:$VERSION\"\n          imagePullPolicy: $IMAGE_PULL_POLICY\n          command: [\"/kube-ovn/start-db.sh\"]\n          securityContext:\n            capabilities:\n              add: [\"SYS_NICE\"]\n          env:\n            - name: ENABLE_SSL\n              value: \"$ENABLE_SSL\"\n            - name: NODE_IPS\n              value: $addresses\n            - name: POD_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_IPS\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIPs\n            - name: ENABLE_BIND_LOCAL_IP\n              value: \"$ENABLE_BIND_LOCAL_IP\"\n          resources:\n            requests:\n              cpu: 300m\n              memory: 200Mi\n            limits:\n              cpu: 3\n              memory: 4Gi\n          volumeMounts:\n            - mountPath: /var/run/openvswitch\n              name: host-run-ovs\n            - mountPath: /var/run/ovn\n              name: host-run-ovn\n            - mountPath: /sys\n              name: host-sys\n              readOnly: true\n            - mountPath: /etc/openvswitch\n              name: host-config-openvswitch\n            - mountPath: /etc/ovn\n              name: host-config-ovn\n            - mountPath: /var/log/openvswitch\n              name: host-log-ovs\n            - mountPath: /var/log/ovn\n              name: host-log-ovn\n            - mountPath: /etc/localtime\n              name: localtime\n            - mountPath: /var/run/tls\n              name: kube-ovn-tls\n          readinessProbe:\n            exec:\n              command:\n                - bash\n                - /kube-ovn/ovn-healthcheck.sh\n            periodSeconds: 15\n            timeoutSeconds: 45\n          livenessProbe:\n            exec:\n              command:\n                - bash\n                - /kube-ovn/ovn-healthcheck.sh\n            initialDelaySeconds: 30\n            periodSeconds: 15\n            failureThreshold: 5\n            timeoutSeconds: 45\n      nodeSelector:\n        kubernetes.io/os: \"linux\"\n        kube-ovn/role: \"master\"\n      volumes:\n        - name: host-run-ovs\n          hostPath:\n            path: /run/openvswitch\n        - name: host-run-ovn\n          hostPath:\n            path: /run/ovn\n        - name: host-sys\n          hostPath:\n            path: /sys\n        - name: host-config-openvswitch\n          hostPath:\n            path: /etc/origin/openvswitch\n        - name: host-config-ovn\n          hostPath:\n            path: /etc/origin/ovn\n        - name: host-log-ovs\n          hostPath:\n            path: /var/log/openvswitch\n        - name: host-log-ovn\n          hostPath:\n            path: /var/log/ovn\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n        - name: kube-ovn-tls\n          secret:\n            optional: true\n            secretName: kube-ovn-tls\n---\nkind: DaemonSet\napiVersion: apps/v1\nmetadata:\n  name: ovs-ovn\n  namespace: kube-system\n  annotations:\n    kubernetes.io/description: |\n      This daemon set launches the openvswitch daemon.\nspec:\n  selector:\n    matchLabels:\n      app: ovs\n  updateStrategy:\n    type: OnDelete\n  template:\n    metadata:\n      labels:\n        app: ovs\n        component: network\n        type: infra\n    spec:\n      tolerations:\n        - effect: NoSchedule\n          operator: Exists\n        - effect: NoExecute\n          operator: Exists\n        - key: CriticalAddonsOnly\n          operator: Exists\n      priorityClassName: system-node-critical\n      serviceAccountName: ovn\n      hostNetwork: true\n      hostPID: true\n      containers:\n        - name: openvswitch\n          image: \"$REGISTRY/kube-ovn:$VERSION\"\n          imagePullPolicy: $IMAGE_PULL_POLICY\n          command: [\"/kube-ovn/start-ovs.sh\"]\n          securityContext:\n            runAsUser: 0\n            privileged: true\n          env:\n            - name: ENABLE_SSL\n              value: \"$ENABLE_SSL\"\n            - name: POD_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: HW_OFFLOAD\n              value: \"$HW_OFFLOAD\"\n            - name: TUNNEL_TYPE\n              value: \"$TUNNEL_TYPE\"\n            - name: KUBE_NODE_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: spec.nodeName\n            - name: OVN_DB_IPS\n              value: $addresses\n          volumeMounts:\n            - mountPath: /var/run/netns\n              name: host-ns\n              mountPropagation: HostToContainer\n            - mountPath: /lib/modules\n              name: host-modules\n              readOnly: true\n            - mountPath: /var/run/openvswitch\n              name: host-run-ovs\n            - mountPath: /var/run/ovn\n              name: host-run-ovn\n            - mountPath: /sys\n              name: host-sys\n              readOnly: true\n            - mountPath: /etc/cni/net.d\n              name: cni-conf\n            - mountPath: /etc/openvswitch\n              name: host-config-openvswitch\n            - mountPath: /etc/ovn\n              name: host-config-ovn\n            - mountPath: /var/log/openvswitch\n              name: host-log-ovs\n            - mountPath: /var/log/ovn\n              name: host-log-ovn\n            - mountPath: /etc/localtime\n              name: localtime\n            - mountPath: /var/run/tls\n              name: kube-ovn-tls\n            - mountPath: /var{{ CONTAINERD_STATE_DIR }}\n              name: cruntime\n          readinessProbe:\n            exec:\n              command:\n                - bash\n                - -c\n                - LOG_ROTATE=true /kube-ovn/ovs-healthcheck.sh\n            periodSeconds: 5\n            timeoutSeconds: 45\n          livenessProbe:\n            exec:\n              command:\n                - bash\n                - /kube-ovn/ovs-healthcheck.sh\n            initialDelaySeconds: 60\n            periodSeconds: 5\n            failureThreshold: 5\n            timeoutSeconds: 45\n          resources:\n            requests:\n              cpu: 200m\n              memory: 200Mi\n            limits:\n              cpu: 1000m\n              memory: 1000Mi\n      nodeSelector:\n        kubernetes.io/os: \"linux\"\n      volumes:\n        - name: host-modules\n          hostPath:\n            path: /lib/modules\n        - name: host-run-ovs\n          hostPath:\n            path: /run/openvswitch\n        - name: host-run-ovn\n          hostPath:\n            path: /run/ovn\n        - name: host-sys\n          hostPath:\n            path: /sys\n        - name: host-ns\n          hostPath:\n            path: /var/run/netns\n        - name: cni-conf\n          hostPath:\n            path: /etc/cni/net.d\n        - name: host-config-openvswitch\n          hostPath:\n            path: /etc/origin/openvswitch\n        - name: host-config-ovn\n          hostPath:\n            path: /etc/origin/ovn\n        - name: host-log-ovs\n          hostPath:\n            path: /var/log/openvswitch\n        - name: host-log-ovn\n          hostPath:\n            path: /var/log/ovn\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n        - hostPath:\n            path: /var{{ CONTAINERD_STATE_DIR }}\n          name: cruntime\n        - name: kube-ovn-tls\n          secret:\n            optional: true\n            secretName: kube-ovn-tls\nEOF\nfi\n\nkubectl apply -f kube-ovn-crd.yaml\nkubectl apply -f ovn.yaml\n\nif $HYBRID_DPDK; then\n\ncat <<EOF > ovn-dpdk.yaml\nkind: DaemonSet\napiVersion: apps/v1\nmetadata:\n  name: ovs-ovn-dpdk\n  namespace: kube-system\n  annotations:\n    kubernetes.io/description: |\n      This daemon set launches the openvswitch daemon.\nspec:\n  selector:\n    matchLabels:\n      app: ovs-dpdk\n  updateStrategy:\n    type: OnDelete\n  template:\n    metadata:\n      labels:\n        app: ovs-dpdk\n        component: network\n        type: infra\n    spec:\n      tolerations:\n      - operator: Exists\n      priorityClassName: system-node-critical\n      serviceAccountName: ovn\n      hostNetwork: true\n      hostPID: true\n      containers:\n        - name: openvswitch\n          image: \"$REGISTRY/kube-ovn:${VERSION}-dpdk\"\n          imagePullPolicy: $IMAGE_PULL_POLICY\n          command: [\"/kube-ovn/start-ovs-dpdk-v2.sh\"]\n          securityContext:\n            runAsUser: 0\n            privileged: true\n          env:\n            - name: ENABLE_SSL\n              value: \"$ENABLE_SSL\"\n            - name: POD_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: HW_OFFLOAD\n              value: \"$HW_OFFLOAD\"\n            - name: TUNNEL_TYPE\n              value: \"$TUNNEL_TYPE\"\n            - name: DPDK_TUNNEL_IFACE\n              value: \"$DPDK_TUNNEL_IFACE\"\n            - name: KUBE_NODE_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: spec.nodeName\n            - name: OVN_DB_IPS\n              value: $addresses\n          volumeMounts:\n            - mountPath: /opt/ovs-config\n              name: host-config-ovs\n            - name: shareddir\n              mountPath: /var/lib/kubelet/pods\n            - name: hugepage\n              mountPath: /dev/hugepages\n            - mountPath: /lib/modules\n              name: host-modules\n              readOnly: true\n            - mountPath: /var/run/openvswitch\n              name: host-run-ovs\n              mountPropagation: HostToContainer\n            - mountPath: /var/run/ovn\n              name: host-run-ovn\n            - mountPath: /sys\n              name: host-sys\n            - mountPath: /etc/cni/net.d\n              name: cni-conf\n            - mountPath: /etc/openvswitch\n              name: host-config-openvswitch\n            - mountPath: /etc/ovn\n              name: host-config-ovn\n            - mountPath: /var/log/openvswitch\n              name: host-log-ovs\n            - mountPath: /var/log/ovn\n              name: host-log-ovn\n            - mountPath: /etc/localtime\n              name: localtime\n            - mountPath: /var/run/tls\n              name: kube-ovn-tls\n          readinessProbe:\n            exec:\n              command:\n                - bash\n                - -c\n                - LOG_ROTATE=true /kube-ovn/ovs-healthcheck.sh\n            periodSeconds: 5\n            timeoutSeconds: 45\n          livenessProbe:\n            exec:\n              command:\n                - bash\n                - /kube-ovn/ovs-healthcheck.sh\n            initialDelaySeconds: 60\n            periodSeconds: 5\n            failureThreshold: 5\n            timeoutSeconds: 45\n          resources:\n            requests:\n              cpu: 200m\n              hugepages-2Mi: 1Gi\n              memory: 200Mi\n            limits:\n              cpu: 1000m\n              hugepages-2Mi: 1Gi\n              memory: 800Mi\n      nodeSelector:\n        kubernetes.io/os: \"linux\"\n        ovn.kubernetes.io/ovs_dp_type: \"userspace\"\n      volumes:\n        - name: host-config-ovs\n          hostPath:\n            path: /opt/ovs-config\n            type: DirectoryOrCreate\n        - name: shareddir\n          hostPath:\n            path: /var/lib/kubelet/pods\n            type: ''\n        - name: hugepage\n          emptyDir:\n            medium: HugePages\n        - name: host-modules\n          hostPath:\n            path: /lib/modules\n        - name: host-run-ovs\n          hostPath:\n            path: /run/openvswitch\n        - name: host-run-ovn\n          hostPath:\n            path: /run/ovn\n        - name: host-sys\n          hostPath:\n            path: /sys\n        - name: cni-conf\n          hostPath:\n            path: /etc/cni/net.d\n        - name: host-config-openvswitch\n          hostPath:\n            path: /etc/origin/openvswitch\n        - name: host-config-ovn\n          hostPath:\n            path: /etc/origin/ovn\n        - name: host-log-ovs\n          hostPath:\n            path: /var/log/openvswitch\n        - name: host-log-ovn\n          hostPath:\n            path: /var/log/ovn\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n        - name: kube-ovn-tls\n          secret:\n            optional: true\n            secretName: kube-ovn-tls\nEOF\nkubectl apply -f ovn-dpdk.yaml\nfi\nkubectl rollout status deployment/ovn-central -n kube-system --timeout 300s\necho \"-------------------------------\"\necho \"\"\n\necho \"[Step 3/6] Install Kube-OVN\"\n\ncat <<EOF > kube-ovn.yaml\n---\nkind: Deployment\napiVersion: apps/v1\nmetadata:\n  name: kube-ovn-controller\n  namespace: kube-system\n  annotations:\n    kubernetes.io/description: |\n      kube-ovn controller\nspec:\n  replicas: $count\n  selector:\n    matchLabels:\n      app: kube-ovn-controller\n  strategy:\n    rollingUpdate:\n      maxSurge: 0%\n      maxUnavailable: 100%\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: kube-ovn-controller\n        component: network\n        type: infra\n    spec:\n      tolerations:\n        - effect: NoSchedule\n          operator: Exists\n        - key: CriticalAddonsOnly\n          operator: Exists\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - labelSelector:\n                matchLabels:\n                  app: kube-ovn-controller\n              topologyKey: kubernetes.io/hostname\n      priorityClassName: system-cluster-critical\n      serviceAccountName: ovn\n      hostNetwork: true\n      containers:\n        - name: kube-ovn-controller\n          image: \"$REGISTRY/kube-ovn:$VERSION\"\n          imagePullPolicy: $IMAGE_PULL_POLICY\n          args:\n          - /kube-ovn/start-controller.sh\n          - --default-cidr=$POD_CIDR\n          - --default-gateway=$POD_GATEWAY\n          - --default-gateway-check=$CHECK_GATEWAY\n          - --default-logical-gateway=$LOGICAL_GATEWAY\n          - --default-u2o-interconnection=$U2O_INTERCONNECTION\n          - --default-exclude-ips=$EXCLUDE_IPS\n          - --node-switch-cidr=$JOIN_CIDR\n          - --service-cluster-ip-range=$SVC_CIDR\n          - --network-type=$NETWORK_TYPE\n          - --default-interface-name=$VLAN_INTERFACE_NAME\n          - --default-exchange-link-name=$EXCHANGE_LINK_NAME\n          - --default-vlan-id=$VLAN_ID\n          - --ls-dnat-mod-dl-dst=$LS_DNAT_MOD_DL_DST\n          - --pod-nic-type=$POD_NIC_TYPE\n          - --enable-lb=$ENABLE_LB\n          - --enable-np=$ENABLE_NP\n          - --enable-eip-snat=$ENABLE_EIP_SNAT\n          - --enable-external-vpc=$ENABLE_EXTERNAL_VPC\n          - --logtostderr=false\n          - --alsologtostderr=true\n          - --gc-interval=$GC_INTERVAL\n          - --inspect-interval=$INSPECT_INTERVAL\n          - --log_file=/var/log/kube-ovn/kube-ovn-controller.log\n          - --log_file_max_size=0\n          - --enable-lb-svc=$ENABLE_LB_SVC\n          - --keep-vm-ip=$ENABLE_KEEP_VM_IP\n          - --pod-default-fip-type=$POD_DEFAULT_FIP_TYPE\n          env:\n            - name: ENABLE_SSL\n              value: \"$ENABLE_SSL\"\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: KUBE_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: KUBE_NODE_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: spec.nodeName\n            - name: OVN_DB_IPS\n              value: $addresses\n            - name: POD_IPS\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIPs\n            - name: ENABLE_BIND_LOCAL_IP\n              value: \"$ENABLE_BIND_LOCAL_IP\"\n          volumeMounts:\n            - mountPath: /etc/localtime\n              name: localtime\n            - mountPath: /var/log/kube-ovn\n              name: kube-ovn-log\n            - mountPath: /var/run/tls\n              name: kube-ovn-tls\n          readinessProbe:\n            exec:\n              command:\n                - /kube-ovn/kube-ovn-controller-healthcheck\n            periodSeconds: 3\n            timeoutSeconds: 45\n          livenessProbe:\n            exec:\n              command:\n                - /kube-ovn/kube-ovn-controller-healthcheck\n            initialDelaySeconds: 300\n            periodSeconds: 7\n            failureThreshold: 5\n            timeoutSeconds: 45\n          resources:\n            requests:\n              cpu: 200m\n              memory: 200Mi\n            limits:\n              cpu: 1000m\n              memory: 1Gi\n      nodeSelector:\n        kubernetes.io/os: \"linux\"\n      volumes:\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n        - name: kube-ovn-log\n          hostPath:\n            path: /var/log/kube-ovn\n        - name: kube-ovn-tls\n          secret:\n            optional: true\n            secretName: kube-ovn-tls\n\n---\nkind: DaemonSet\napiVersion: apps/v1\nmetadata:\n  name: kube-ovn-cni\n  namespace: kube-system\n  annotations:\n    kubernetes.io/description: |\n      This daemon set launches the kube-ovn cni daemon.\nspec:\n  selector:\n    matchLabels:\n      app: kube-ovn-cni\n  template:\n    metadata:\n      labels:\n        app: kube-ovn-cni\n        component: network\n        type: infra\n    spec:\n      tolerations:\n        - effect: NoSchedule\n          operator: Exists\n        - effect: NoExecute\n          operator: Exists\n        - key: CriticalAddonsOnly\n          operator: Exists\n      priorityClassName: system-node-critical\n      serviceAccountName: ovn\n      hostNetwork: true\n      hostPID: true\n      initContainers:\n      - name: install-cni\n        image: \"$REGISTRY/kube-ovn:$VERSION\"\n        imagePullPolicy: $IMAGE_PULL_POLICY\n        command: [\"/kube-ovn/install-cni.sh\"]\n        securityContext:\n          runAsUser: 0\n          privileged: true\n        volumeMounts:\n          - mountPath: /opt/cni/bin\n            name: cni-bin\n          - mountPath: /usr/local/bin\n            name: local-bin\n      containers:\n      - name: cni-server\n        image: \"$REGISTRY/kube-ovn:$VERSION\"\n        imagePullPolicy: $IMAGE_PULL_POLICY\n        command:\n          - bash\n          - /kube-ovn/start-cniserver.sh\n        args:\n          - --enable-mirror=$ENABLE_MIRROR\n          - --encap-checksum=true\n          - --service-cluster-ip-range=$SVC_CIDR\n          - --iface=${IFACE}\n          - --dpdk-tunnel-iface=${DPDK_TUNNEL_IFACE}\n          - --network-type=$TUNNEL_TYPE\n          - --default-interface-name=$VLAN_INTERFACE_NAME\n          - --cni-conf-name=${CNI_CONFIG_PRIORITY}-kube-ovn.conflist\n          - --logtostderr=false\n          - --alsologtostderr=true\n          - --log_file=/var/log/kube-ovn/kube-ovn-cni.log\n          - --log_file_max_size=0\n        securityContext:\n          runAsUser: 0\n          privileged: true\n        env:\n          - name: ENABLE_SSL\n            value: \"$ENABLE_SSL\"\n          - name: POD_IP\n            valueFrom:\n              fieldRef:\n                fieldPath: status.podIP\n          - name: KUBE_NODE_NAME\n            valueFrom:\n              fieldRef:\n                fieldPath: spec.nodeName\n          - name: MODULES\n            value: $MODULES\n          - name: RPMS\n            value: $RPMS\n          - name: POD_IPS\n            valueFrom:\n              fieldRef:\n                fieldPath: status.podIPs\n          - name: ENABLE_BIND_LOCAL_IP\n            value: \"$ENABLE_BIND_LOCAL_IP\"\n          - name: DBUS_SYSTEM_BUS_ADDRESS\n            value: \"unix:path=/host/var/run/dbus/system_bus_socket\"\n        volumeMounts:\n          - name: host-modules\n            mountPath: /lib/modules\n            readOnly: true\n          - name: shared-dir\n            mountPath: /var/lib/kubelet/pods\n          - mountPath: /etc/openvswitch\n            name: systemid\n          - mountPath: /etc/cni/net.d\n            name: cni-conf\n          - mountPath: /run/openvswitch\n            name: host-run-ovs\n            mountPropagation: Bidirectional\n          - mountPath: /run/ovn\n            name: host-run-ovn\n          - mountPath: /host/var/run/dbus\n            name: host-dbus\n            mountPropagation: HostToContainer\n          - mountPath: /var/run/netns\n            name: host-ns\n            mountPropagation: HostToContainer\n          - mountPath: /var/log/kube-ovn\n            name: kube-ovn-log\n          - mountPath: /var/log/openvswitch\n            name: host-log-ovs\n          - mountPath: /var/log/ovn\n            name: host-log-ovn\n          - mountPath: /etc/localtime\n            name: localtime\n          - mountPath: /tmp\n            name: tmp\n        livenessProbe:\n          failureThreshold: 3\n          initialDelaySeconds: 30\n          periodSeconds: 7\n          successThreshold: 1\n          tcpSocket:\n            port: 10665\n          timeoutSeconds: 3\n        readinessProbe:\n          failureThreshold: 3\n          initialDelaySeconds: 30\n          periodSeconds: 7\n          successThreshold: 1\n          tcpSocket:\n            port: 10665\n          timeoutSeconds: 3\n        resources:\n          requests:\n            cpu: 100m\n            memory: 100Mi\n          limits:\n            cpu: 1000m\n            memory: 1Gi\n      nodeSelector:\n        kubernetes.io/os: \"linux\"\n      volumes:\n        - name: host-modules\n          hostPath:\n            path: /lib/modules\n        - name: shared-dir\n          hostPath:\n            path: /var/lib/kubelet/pods\n        - name: systemid\n          hostPath:\n            path: /etc/origin/openvswitch\n        - name: host-run-ovs\n          hostPath:\n            path: /run/openvswitch\n        - name: host-run-ovn\n          hostPath:\n            path: /run/ovn\n        - name: cni-conf\n          hostPath:\n            path: $CNI_CONF_DIR\n        - name: cni-bin\n          hostPath:\n            path: $CNI_BIN_DIR\n        - name: host-ns\n          hostPath:\n            path: /var/run/netns\n        - name: host-dbus\n          hostPath:\n            path: /var/run/dbus\n        - name: host-log-ovs\n          hostPath:\n            path: /var/log/openvswitch\n        - name: kube-ovn-log\n          hostPath:\n            path: /var/log/kube-ovn\n        - name: host-log-ovn\n          hostPath:\n            path: /var/log/ovn\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n        - name: tmp\n          hostPath:\n            path: /tmp\n        - name: local-bin\n          hostPath:\n            path: /usr/local/bin\n\n---\nkind: DaemonSet\napiVersion: apps/v1\nmetadata:\n  name: kube-ovn-pinger\n  namespace: kube-system\n  annotations:\n    kubernetes.io/description: |\n      This daemon set launches the openvswitch daemon.\nspec:\n  selector:\n    matchLabels:\n      app: kube-ovn-pinger\n  updateStrategy:\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: kube-ovn-pinger\n        component: network\n        type: infra\n    spec:\n      priorityClassName: system-node-critical\n      serviceAccountName: ovn\n      hostPID: true\n      containers:\n        - name: pinger\n          image: \"$REGISTRY/kube-ovn:$VERSION\"\n          command:\n          - /kube-ovn/kube-ovn-pinger\n          args:\n          - --external-address=$PINGER_EXTERNAL_ADDRESS\n          - --external-dns=$PINGER_EXTERNAL_DOMAIN\n          - --logtostderr=false\n          - --alsologtostderr=true\n          - --log_file=/var/log/kube-ovn/kube-ovn-pinger.log\n          - --log_file_max_size=0\n          imagePullPolicy: $IMAGE_PULL_POLICY\n          securityContext:\n            runAsUser: 0\n            privileged: false\n          env:\n            - name: ENABLE_SSL\n              value: \"$ENABLE_SSL\"\n            - name: POD_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIP\n            - name: HOST_IP\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.hostIP\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: NODE_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: spec.nodeName\n          volumeMounts:\n            - mountPath: /lib/modules\n              name: host-modules\n              readOnly: true\n            - mountPath: /run/openvswitch\n              name: host-run-ovs\n            - mountPath: /var/run/openvswitch\n              name: host-run-ovs\n            - mountPath: /var/run/ovn\n              name: host-run-ovn\n            - mountPath: /sys\n              name: host-sys\n              readOnly: true\n            - mountPath: /etc/openvswitch\n              name: host-config-openvswitch\n            - mountPath: /var/log/openvswitch\n              name: host-log-ovs\n            - mountPath: /var/log/ovn\n              name: host-log-ovn\n            - mountPath: /var/log/kube-ovn\n              name: kube-ovn-log\n            - mountPath: /etc/localtime\n              name: localtime\n            - mountPath: /var/run/tls\n              name: kube-ovn-tls\n          resources:\n            requests:\n              cpu: 100m\n              memory: 100Mi\n            limits:\n              cpu: 200m\n              memory: 400Mi\n      nodeSelector:\n        kubernetes.io/os: \"linux\"\n      volumes:\n        - name: host-modules\n          hostPath:\n            path: /lib/modules\n        - name: host-run-ovs\n          hostPath:\n            path: /run/openvswitch\n        - name: host-run-ovn\n          hostPath:\n            path: /run/ovn\n        - name: host-sys\n          hostPath:\n            path: /sys\n        - name: host-config-openvswitch\n          hostPath:\n            path: /etc/origin/openvswitch\n        - name: host-log-ovs\n          hostPath:\n            path: /var/log/openvswitch\n        - name: kube-ovn-log\n          hostPath:\n            path: /var/log/kube-ovn\n        - name: host-log-ovn\n          hostPath:\n            path: /var/log/ovn\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n        - name: kube-ovn-tls\n          secret:\n            optional: true\n            secretName: kube-ovn-tls\n---\nkind: Deployment\napiVersion: apps/v1\nmetadata:\n  name: kube-ovn-monitor\n  namespace: kube-system\n  annotations:\n    kubernetes.io/description: |\n      Metrics for OVN components: northd, nb and sb.\nspec:\n  replicas: 1\n  strategy:\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 1\n    type: RollingUpdate\n  selector:\n    matchLabels:\n      app: kube-ovn-monitor\n  template:\n    metadata:\n      labels:\n        app: kube-ovn-monitor\n        component: network\n        type: infra\n    spec:\n      tolerations:\n        - effect: NoSchedule\n          operator: Exists\n        - key: CriticalAddonsOnly\n          operator: Exists\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            - labelSelector:\n                matchLabels:\n                  app: kube-ovn-monitor\n              topologyKey: kubernetes.io/hostname\n      priorityClassName: system-cluster-critical\n      serviceAccountName: ovn\n      hostNetwork: true\n      containers:\n        - name: kube-ovn-monitor\n          image: \"$REGISTRY/kube-ovn:$VERSION\"\n          imagePullPolicy: $IMAGE_PULL_POLICY\n          command: [\"/kube-ovn/start-ovn-monitor.sh\"]\n          securityContext:\n            runAsUser: 0\n            privileged: false\n          env:\n            - name: ENABLE_SSL\n              value: \"$ENABLE_SSL\"\n            - name: KUBE_NODE_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: spec.nodeName\n            - name: POD_IPS\n              valueFrom:\n                fieldRef:\n                  fieldPath: status.podIPs\n            - name: ENABLE_BIND_LOCAL_IP\n              value: \"$ENABLE_BIND_LOCAL_IP\"\n          resources:\n            requests:\n              cpu: 200m\n              memory: 200Mi\n            limits:\n              cpu: 200m\n              memory: 200Mi\n          volumeMounts:\n            - mountPath: /var/run/openvswitch\n              name: host-run-ovs\n            - mountPath: /var/run/ovn\n              name: host-run-ovn\n            - mountPath: /etc/openvswitch\n              name: host-config-openvswitch\n            - mountPath: /etc/ovn\n              name: host-config-ovn\n            - mountPath: /var/log/openvswitch\n              name: host-log-ovs\n            - mountPath: /var/log/ovn\n              name: host-log-ovn\n            - mountPath: /etc/localtime\n              name: localtime\n            - mountPath: /var/run/tls\n              name: kube-ovn-tls\n          readinessProbe:\n            exec:\n              command:\n              - cat\n              - /var/run/ovn/ovn-controller.pid\n            periodSeconds: 10\n            timeoutSeconds: 45\n          livenessProbe:\n            exec:\n              command:\n              - cat\n              - /var/run/ovn/ovn-controller.pid\n            initialDelaySeconds: 30\n            periodSeconds: 10\n            failureThreshold: 5\n            timeoutSeconds: 45\n      nodeSelector:\n        kubernetes.io/os: \"linux\"\n        kube-ovn/role: \"master\"\n      volumes:\n        - name: host-run-ovs\n          hostPath:\n            path: /run/openvswitch\n        - name: host-run-ovn\n          hostPath:\n            path: /run/ovn\n        - name: host-config-openvswitch\n          hostPath:\n            path: /etc/origin/openvswitch\n        - name: host-config-ovn\n          hostPath:\n            path: /etc/origin/ovn\n        - name: host-log-ovs\n          hostPath:\n            path: /var/log/openvswitch\n        - name: host-log-ovn\n          hostPath:\n            path: /var/log/ovn\n        - name: localtime\n          hostPath:\n            path: /etc/localtime\n        - name: kube-ovn-tls\n          secret:\n            optional: true\n            secretName: kube-ovn-tls\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: kube-ovn-monitor\n  namespace: kube-system\n  labels:\n    app: kube-ovn-monitor\nspec:\n  ports:\n    - name: metrics\n      port: 10661\n  type: ClusterIP\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: kube-ovn-monitor\n  sessionAffinity: None\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: kube-ovn-pinger\n  namespace: kube-system\n  labels:\n    app: kube-ovn-pinger\nspec:\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: kube-ovn-pinger\n  ports:\n    - port: 8080\n      name: metrics\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: kube-ovn-controller\n  namespace: kube-system\n  labels:\n    app: kube-ovn-controller\nspec:\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: kube-ovn-controller\n  ports:\n    - port: 10660\n      name: metrics\n---\nkind: Service\napiVersion: v1\nmetadata:\n  name: kube-ovn-cni\n  namespace: kube-system\n  labels:\n    app: kube-ovn-cni\nspec:\n  ${SVC_YAML_IPFAMILYPOLICY}\n  selector:\n    app: kube-ovn-cni\n  ports:\n    - port: 10665\n      name: metrics\nEOF\n\nkubectl apply -f kube-ovn.yaml\nkubectl rollout status deployment/kube-ovn-controller -n kube-system --timeout 300s\nkubectl rollout status daemonset/kube-ovn-cni -n kube-system --timeout 300s\necho \"-------------------------------\"\necho \"\"\n\necho \"[Step 4/6] Delete pod that not in host network mode\"\nfor ns in $(kubectl get ns --no-headers -o custom-columns=NAME:.metadata.name); do\n  for pod in $(kubectl get pod --no-headers -n \"$ns\" --field-selector spec.restartPolicy=Always -o custom-columns=NAME:.metadata.name,HOST:spec.hostNetwork | awk '{if ($2!=\"true\") print $1}'); do\n    kubectl delete pod \"$pod\" -n \"$ns\" --ignore-not-found\n  done\ndone\n\nsleep 5\nkubectl rollout status daemonset/kube-ovn-pinger -n kube-system --timeout 300s\n#kubectl rollout status deployment/coredns -n kube-system --timeout 600s\necho \"-------------------------------\"\necho \"\"\n\necho \"[Step 5/6] Add kubectl plugin PATH\"\n\nif ! sh -c \"echo \\\":$PATH:\\\" | grep -q \\\":/usr/local/bin:\\\"\"; then\n  echo \"Tips:Please join the /usr/local/bin to your PATH. Temporarily, we do it for this execution.\"\n  export PATH=/usr/local/bin:$PATH\n  echo \"-------------------------------\"\n  echo \"\"\nfi\n\necho \"[Step 6/6] Run network diagnose\"\nkubectl cp kube-system/$(kubectl  -n kube-system get pods -o wide | grep cni | awk '{print $1}' | awk 'NR==1{print}'):/kube-ovn/kubectl-ko /usr/local/bin/kubectl-ko\nchmod +x /usr/local/bin/kubectl-ko\nkubectl ko diagnose all\n\necho \"-------------------------------\"\necho \"\n                    ,,,,\n                    ,::,\n                   ,,::,,,,\n            ,,,,,::::::::::::,,,,,\n         ,,,::::::::::::::::::::::,,,\n       ,,::::::::::::::::::::::::::::,,\n     ,,::::::::::::::::::::::::::::::::,,\n    ,::::::::::::::::::::::::::::::::::::,\n   ,:::::::::::::,,   ,,:::::,,,::::::::::,\n ,,:::::::::::::,       ,::,     ,:::::::::,\n ,:::::::::::::,   :x,  ,::  :,   ,:::::::::,\n,:::::::::::::::,  ,,,  ,::, ,,  ,::::::::::,\n,:::::::::::::::::,,,,,,:::::,,,,::::::::::::,    ,:,   ,:,            ,xx,                            ,:::::,   ,:,     ,:: :::,    ,x\n,::::::::::::::::::::::::::::::::::::::::::::,    :x: ,:xx:        ,   :xx,                          :xxxxxxxxx, :xx,   ,xx:,xxxx,   :x\n,::::::::::::::::::::::::::::::::::::::::::::,    :xxxxx:,  ,xx,  :x:  :xxx:x::,  ::xxxx:           :xx:,  ,:xxx  :xx, ,xx: ,xxxxx:, :x\n,::::::::::::::::::::::::::::::::::::::::::::,    :xxxxx,   :xx,  :x:  :xxx,,:xx,:xx:,:xx, ,,,,,,,,,xxx,    ,xx:   :xx:xx:  ,xxx,:xx::x\n,::::::,,::::::::,,::::::::,,:::::::,,,::::::,    :x:,xxx:  ,xx,  :xx  :xx:  ,xx,xxxxxx:, ,xxxxxxx:,xxx:,  ,xxx,    :xxx:   ,xxx, :xxxx\n,::::,    ,::::,   ,:::::,   ,,::::,    ,::::,    :x:  ,:xx,,:xx::xxxx,,xxx::xx: :xx::::x: ,,,,,,   ,xxxxxxxxx,     ,xx:    ,xxx,  :xxx\n,::::,    ,::::,    ,::::,    ,::::,    ,::::,    ,:,    ,:,  ,,::,,:,  ,::::,,   ,:::::,            ,,:::::,        ,,      :x:    ,::\n,::::,    ,::::,    ,::::,    ,::::,    ,::::,\n ,,,,,    ,::::,    ,::::,    ,::::,    ,:::,             ,,,,,,,,,,,,,\n          ,::::,    ,::::,    ,::::,    ,:::,        ,,,:::::::::::::::,\n          ,::::,    ,::::,    ,::::,    ,::::,  ,,,,:::::::::,,,,,,,:::,\n          ,::::,    ,::::,    ,::::,     ,::::::::::::,,,,,\n           ,,,,     ,::::,     ,,,,       ,,,::::,,,,\n                    ,::::,\n                    ,,::,\n\"\necho \"Thanks for choosing Kube-OVN!\nFor more advanced features, please read https://kubeovn.github.io/docs/stable/en/\nIf you have any question, please file an issue https://github.com/kubeovn/kube-ovn/issues/new/choose\"\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "roles/kube-ovn/templates/nodelocaldns-iptables.yaml.j2",
    "content": "# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: kube-dns-upstream\n  namespace: kube-system\n  labels:\n    k8s-app: kube-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"KubeDNSUpstream\"\nspec:\n  ports:\n  - name: dns\n    port: 53\n    protocol: UDP\n    targetPort: 53\n  - name: dns-tcp\n    port: 53\n    protocol: TCP\n    targetPort: 53\n  selector:\n    k8s-app: kube-dns\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    addonmanager.kubernetes.io/mode: Reconcile\ndata:\n  Corefile: |\n    {{ CLUSTER_DNS_DOMAIN }}:53 {\n        errors\n        cache {\n                success 9984 30\n                denial 9984 5\n        }\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }} {{ CLUSTER_DNS_SVC_IP }}\n        forward . __PILLAR__CLUSTER__DNS__ {\n                force_tcp\n        }\n        prometheus :9253\n        health {{ LOCAL_DNS_CACHE }}:8080\n        }\n    in-addr.arpa:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }} {{ CLUSTER_DNS_SVC_IP }}\n        forward . __PILLAR__CLUSTER__DNS__ {\n                force_tcp\n        }\n        prometheus :9253\n        }\n    ip6.arpa:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }} {{ CLUSTER_DNS_SVC_IP }}\n        forward . __PILLAR__CLUSTER__DNS__ {\n                force_tcp\n        }\n        prometheus :9253\n        }\n    .:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }} {{ CLUSTER_DNS_SVC_IP }}\n        forward . __PILLAR__UPSTREAM__SERVERS__\n        prometheus :9253\n        }\n---\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    k8s-app: node-local-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  updateStrategy:\n    rollingUpdate:\n      maxUnavailable: 10%\n  selector:\n    matchLabels:\n      k8s-app: node-local-dns\n  template:\n    metadata:\n      labels:\n        k8s-app: node-local-dns\n      annotations:\n        prometheus.io/port: \"9253\"\n        prometheus.io/scrape: \"true\"\n    spec:\n      priorityClassName: system-node-critical\n      serviceAccountName: node-local-dns\n      hostNetwork: true\n      dnsPolicy: Default  # Don't use cluster DNS.\n      tolerations:\n      - key: \"CriticalAddonsOnly\"\n        operator: \"Exists\"\n      - effect: \"NoExecute\"\n        operator: \"Exists\"\n      - effect: \"NoSchedule\"\n        operator: \"Exists\"\n      containers:\n      - name: node-cache\n        #image: k8s.gcr.io/dns/k8s-dns-node-cache:1.16.0\n        image: easzlab.io.local:5000/easzlab/k8s-dns-node-cache:{{ dnsNodeCacheVer }}\n        resources:\n          requests:\n            cpu: 25m\n            memory: 5Mi\n        args: [ \"-localip\", \"{{ LOCAL_DNS_CACHE }},{{ CLUSTER_DNS_SVC_IP }}\", \"-conf\", \"/etc/Corefile\", \"-upstreamsvc\", \"kube-dns-upstream\" ]\n        securityContext:\n          capabilities:\n            add:\n            - NET_ADMIN\n        ports:\n        - containerPort: 53\n          name: dns\n          protocol: UDP\n        - containerPort: 53\n          name: dns-tcp\n          protocol: TCP\n        - containerPort: 9253\n          name: metrics\n          protocol: TCP\n        livenessProbe:\n          httpGet:\n            host: {{ LOCAL_DNS_CACHE }}\n            path: /health\n            port: 8080\n          initialDelaySeconds: 60\n          timeoutSeconds: 5\n        volumeMounts:\n        - mountPath: /run/xtables.lock\n          name: xtables-lock\n          readOnly: false\n        - name: config-volume\n          mountPath: /etc/coredns\n        - name: kube-dns-config\n          mountPath: /etc/kube-dns\n      volumes:\n      - name: xtables-lock\n        hostPath:\n          path: /run/xtables.lock\n          type: FileOrCreate\n      - name: kube-dns-config\n        configMap:\n          name: kube-dns\n          optional: true\n      - name: config-volume\n        configMap:\n          name: node-local-dns\n          items:\n            - key: Corefile\n              path: Corefile.base\n---\n# A headless service is a service with a service IP but instead of load-balancing it will return the IPs of our associated Pods.\n# We use this to expose metrics to Prometheus.\napiVersion: v1\nkind: Service\nmetadata:\n  annotations:\n    prometheus.io/port: \"9253\"\n    prometheus.io/scrape: \"true\"\n  labels:\n    k8s-app: node-local-dns\n  name: node-local-dns\n  namespace: kube-system\nspec:\n  clusterIP: None\n  ports:\n    - name: metrics\n      port: 9253\n      targetPort: 9253\n  selector:\n    k8s-app: node-local-dns\n"
  },
  {
    "path": "roles/kube-ovn/templates/nodelocaldns-ipvs.yaml.j2",
    "content": "# Copyright 2018 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: kube-dns-upstream\n  namespace: kube-system\n  labels:\n    k8s-app: kube-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\n    kubernetes.io/name: \"KubeDNSUpstream\"\nspec:\n  ports:\n  - name: dns\n    port: 53\n    protocol: UDP\n    targetPort: 53\n  - name: dns-tcp\n    port: 53\n    protocol: TCP\n    targetPort: 53\n  selector:\n    k8s-app: kube-dns\n---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    addonmanager.kubernetes.io/mode: Reconcile\ndata:\n  Corefile: |\n    {{ CLUSTER_DNS_DOMAIN }}:53 {\n        errors\n        cache {\n                success 9984 30\n                denial 9984 5\n        }\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }}\n        forward . {{ CLUSTER_DNS_SVC_IP }} {\n                force_tcp\n        }\n        prometheus :9253\n        health {{ LOCAL_DNS_CACHE }}:8080\n        }\n    in-addr.arpa:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }}\n        forward . {{ CLUSTER_DNS_SVC_IP }} {\n                force_tcp\n        }\n        prometheus :9253\n        }\n    ip6.arpa:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }}\n        forward . {{ CLUSTER_DNS_SVC_IP }} {\n                force_tcp\n        }\n        prometheus :9253\n        }\n    .:53 {\n        errors\n        cache 30\n        reload\n        loop\n        bind {{ LOCAL_DNS_CACHE }}\n        forward . __PILLAR__CLUSTER__DNS__\n        prometheus :9253\n        }\n---\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: node-local-dns\n  namespace: kube-system\n  labels:\n    k8s-app: node-local-dns\n    kubernetes.io/cluster-service: \"true\"\n    addonmanager.kubernetes.io/mode: Reconcile\nspec:\n  updateStrategy:\n    rollingUpdate:\n      maxUnavailable: 10%\n  selector:\n    matchLabels:\n      k8s-app: node-local-dns\n  template:\n    metadata:\n      labels:\n        k8s-app: node-local-dns\n      annotations:\n        prometheus.io/port: \"9253\"\n        prometheus.io/scrape: \"true\"\n    spec:\n      priorityClassName: system-node-critical\n      serviceAccountName: node-local-dns\n      hostNetwork: true\n      dnsPolicy: Default  # Don't use cluster DNS.\n      tolerations:\n      - key: \"CriticalAddonsOnly\"\n        operator: \"Exists\"\n      - effect: \"NoExecute\"\n        operator: \"Exists\"\n      - effect: \"NoSchedule\"\n        operator: \"Exists\"\n      containers:\n      - name: node-cache\n        #image: k8s.gcr.io/dns/k8s-dns-node-cache:1.16.0\n        image: easzlab.io.local:5000/easzlab/k8s-dns-node-cache:{{ dnsNodeCacheVer }}\n        resources:\n          requests:\n            cpu: 25m\n            memory: 5Mi\n        args: [ \"-localip\", \"{{ LOCAL_DNS_CACHE }}\", \"-conf\", \"/etc/Corefile\", \"-upstreamsvc\", \"kube-dns-upstream\" ]\n        securityContext:\n          capabilities:\n            add:\n            - NET_ADMIN\n        ports:\n        - containerPort: 53\n          name: dns\n          protocol: UDP\n        - containerPort: 53\n          name: dns-tcp\n          protocol: TCP\n        - containerPort: 9253\n          name: metrics\n          protocol: TCP\n        livenessProbe:\n          httpGet:\n            host: {{ LOCAL_DNS_CACHE }}\n            path: /health\n            port: 8080\n          initialDelaySeconds: 60\n          timeoutSeconds: 5\n        volumeMounts:\n        - mountPath: /run/xtables.lock\n          name: xtables-lock\n          readOnly: false\n        - name: config-volume\n          mountPath: /etc/coredns\n        - name: kube-dns-config\n          mountPath: /etc/kube-dns\n      volumes:\n      - name: xtables-lock\n        hostPath:\n          path: /run/xtables.lock\n          type: FileOrCreate\n      - name: kube-dns-config\n        configMap:\n          name: kube-dns\n          optional: true\n      - name: config-volume\n        configMap:\n          name: node-local-dns\n          items:\n            - key: Corefile\n              path: Corefile.base\n---\n# A headless service is a service with a service IP but instead of load-balancing it will return the IPs of our associated Pods.\n# We use this to expose metrics to Prometheus.\napiVersion: v1\nkind: Service\nmetadata:\n  annotations:\n    prometheus.io/port: \"9253\"\n    prometheus.io/scrape: \"true\"\n  labels:\n    k8s-app: node-local-dns\n  name: node-local-dns\n  namespace: kube-system\nspec:\n  clusterIP: None\n  ports:\n    - name: metrics\n      port: 9253\n      targetPort: 9253\n  selector:\n    k8s-app: node-local-dns\n"
  },
  {
    "path": "roles/kube-ovn/vars/main.yml",
    "content": "# CLUSTER_CIDR_GW 作为 POD_GATEWAY，选取CLUSTER_CIDR 网段中的第一个地址\nCLUSTER_CIDR_GW: \"{{ CLUSTER_CIDR.split('.')[0] }}.{{ CLUSTER_CIDR.split('.')[1] }}.{{ CLUSTER_CIDR.split('.')[2] }}.{{ CLUSTER_CIDR.split('.')[3]|regex_replace('/.*', '')|int + 1 }}\"\n\n# coredns 服务地址，根据SERVICE_CIDR 设置，默认选择网段第二个地址\nCLUSTER_DNS_SVC_IP: \"{{ SERVICE_CIDR.split('.')[0] }}.{{ SERVICE_CIDR.split('.')[1] }}.{{ SERVICE_CIDR.split('.')[2] }}.{{ SERVICE_CIDR.split('.')[3]|regex_replace('/.*', '')|int + 2 }}\"\n"
  },
  {
    "path": "roles/kube-router/kube-router.yml",
    "content": "- hosts:\n  - kube_master\n  - kube_node\n  roles:\n  - kube-router\n"
  },
  {
    "path": "roles/kube-router/tasks/main.yml",
    "content": "- block:\n    - name: 准备配置 kube-router DaemonSet\n      template: src=kuberouter.yaml.j2 dest={{ cluster_dir }}/yml/kube-router.yaml\n\n    - name: 删除 kube-router DaemonSet\n      shell: \"{{ base_dir }}/bin/kubectl delete -f {{ cluster_dir }}/yml/kube-router.yaml || echo true; sleep 3\"\n      when: 'CHANGE_CA|bool'\n\n    # 只需单节点执行一次\n    - name: 运行 kube-router DaemonSet\n      shell: \"{{ base_dir }}/bin/kubectl apply -f {{ cluster_dir }}/yml/kube-router.yaml\"\n  run_once: true\n  connection: local\n  tags: force_change_certs\n\n# 删除原有cni配置\n- name: 删除默认cni配置 \n  file: path=/etc/cni/net.d/10-default.conf state=absent\n\n# 等待网络插件部署成功，视下载镜像速度而定\n- name: 轮询等待kube-router 运行，视下载镜像速度而定\n  shell: \"{{ base_dir }}/bin/kubectl get pod -n kube-system -o wide|grep 'kube-router'|grep ' {{ K8S_NODENAME }} '|awk '{print $3}'\"\n  register: pod_status\n  until: pod_status.stdout == \"Running\"\n  retries: 15\n  delay: 8\n  ignore_errors: true\n  connection: local\n  tags: force_change_certs\n"
  },
  {
    "path": "roles/kube-router/templates/kuberouter.yaml.j2",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: kube-router-cfg\n  namespace: kube-system\n  labels:\n    tier: node\n    k8s-app: kube-router\ndata:\n  cni-conf.json: |\n    {\n       \"cniVersion\":\"0.3.0\",\n       \"name\":\"mynet\",\n       \"plugins\":[\n          {\n             \"name\":\"kubernetes\",\n             \"type\":\"bridge\",\n             \"bridge\":\"kube-bridge\",\n             \"isDefaultGateway\":true,\n             \"ipam\":{\n                \"type\":\"host-local\"\n             }\n          }\n       ]\n    }\n\n---\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  labels:\n    k8s-app: kube-router\n    tier: node\n  name: kube-router\n  namespace: kube-system\nspec:\n  selector:\n    matchLabels:\n      k8s-app: kube-router\n      tier: node\n  template:\n    metadata:\n      labels:\n        k8s-app: kube-router\n        tier: node\n    spec:\n      priorityClassName: system-node-critical\n      serviceAccountName: kube-router\n      containers:\n      - name: kube-router\n        image: easzlab.io.local:5000/cloudnativelabs/kube-router:{{ kube_router_ver }}\n        imagePullPolicy: IfNotPresent\n        args:\n        - \"--hostname-override=RT-{{ inventory_hostname }}\"\n        - \"--overlay-type={{ OVERLAY_TYPE }}\"\n        - \"--run-router=true\"\n        - \"--run-firewall={{ FIREWALL_ENABLE }}\"\n        - \"--run-service-proxy=false\"\n        - \"--bgp-graceful-restart=true\"\n        env:\n        - name: NODE_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: spec.nodeName\n        - name: KUBE_ROUTER_CNI_CONF_FILE\n          value: /etc/cni/net.d/10-kuberouter.conflist\n        livenessProbe:\n          httpGet:\n            path: /healthz\n            port: 20244\n          initialDelaySeconds: 10\n          periodSeconds: 3\n        resources:\n          requests:\n            cpu: 250m\n            memory: 250Mi\n        securityContext:\n          privileged: true\n        volumeMounts:\n        - name: lib-modules\n          mountPath: /lib/modules\n          readOnly: true\n        - name: cni-conf-dir\n          mountPath: /etc/cni/net.d\n        - name: xtables-lock\n          mountPath: /run/xtables.lock\n          readOnly: false\n      initContainers:\n      - name: install-cni\n        image: easzlab.io.local:5000/cloudnativelabs/kube-router:{{ kube_router_ver }}\n        imagePullPolicy: IfNotPresent\n        command:\n        - /bin/sh\n        - -c\n        - set -e -x;\n          if [ ! -f /etc/cni/net.d/10-kuberouter.conflist ]; then\n            if [ -f /etc/cni/net.d/*.conf ]; then\n              rm -f /etc/cni/net.d/*.conf;\n            fi;\n            TMP=/etc/cni/net.d/.tmp-kuberouter-cfg;\n            cp /etc/kube-router/cni-conf.json ${TMP};\n            mv ${TMP} /etc/cni/net.d/10-kuberouter.conflist;\n          fi\n        volumeMounts:\n        - mountPath: /etc/cni/net.d\n          name: cni-conf-dir\n        - mountPath: /etc/kube-router\n          name: kube-router-cfg\n      hostNetwork: true\n      tolerations:\n      - effect: NoSchedule\n        operator: Exists\n      - key: CriticalAddonsOnly\n        operator: Exists\n      - effect: NoExecute\n        operator: Exists\n      volumes:\n      - name: lib-modules\n        hostPath:\n          path: /lib/modules\n      - name: cni-conf-dir\n        hostPath:\n          path: /etc/cni/net.d\n      - name: kube-router-cfg\n        configMap:\n          name: kube-router-cfg\n      - name: xtables-lock\n        hostPath:\n          path: /run/xtables.lock\n          type: FileOrCreate\n\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: kube-router\n  namespace: kube-system\n\n---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: kube-router\n  namespace: kube-system\nrules:\n  - apiGroups:\n    - \"\"\n    resources:\n      - namespaces\n      - pods\n      - services\n      - nodes\n      - endpoints\n    verbs:\n      - list\n      - get\n      - watch\n  - apiGroups:\n    - \"networking.k8s.io\"\n    resources:\n      - networkpolicies\n    verbs:\n      - list\n      - get\n      - watch\n  - apiGroups:\n    - extensions\n    resources:\n      - networkpolicies\n    verbs:\n      - get\n      - list\n      - watch\n\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: kube-router\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: kube-router\nsubjects:\n- kind: ServiceAccount\n  name: kube-router\n  namespace: kube-system\n"
  },
  {
    "path": "roles/os-harden/CHANGELOG.md",
    "content": "# Changelog\n\n## [6.3.0](https://github.com/dev-sec/ansible-os-hardening/tree/6.3.0) (2020-10-28)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/6.2.0...6.3.0)\n\n**Implemented enhancements:**\n\n- Breaking change in ansible-lint - set file permissions explicitly [\\#299](https://github.com/dev-sec/ansible-os-hardening/issues/299)\n- Improve Documentation [\\#315](https://github.com/dev-sec/ansible-os-hardening/pull/315) ([schurzi](https://github.com/schurzi))\n- Arch support [\\#303](https://github.com/dev-sec/ansible-os-hardening/pull/303) ([rndmh3ro](https://github.com/rndmh3ro))\n- fix linting for molecule [\\#301](https://github.com/dev-sec/ansible-os-hardening/pull/301) ([schurzi](https://github.com/schurzi))\n- file permissions explicitly defined [\\#300](https://github.com/dev-sec/ansible-os-hardening/pull/300) ([danielkubat](https://github.com/danielkubat))\n\n**Fixed bugs:**\n\n- Task \"set 10.hardcore.conf perms to 0400 and root ownership\" fails in check mode [\\#313](https://github.com/dev-sec/ansible-os-hardening/issues/313)\n- use touch for 10.hardcore.conf to avoid problems with dry-run [\\#314](https://github.com/dev-sec/ansible-os-hardening/pull/314) ([schurzi](https://github.com/schurzi))\n- use touch with no date changes [\\#310](https://github.com/dev-sec/ansible-os-hardening/pull/310) ([rndmh3ro](https://github.com/rndmh3ro))\n- do not touch sysctl file to avoid idempotency problems [\\#309](https://github.com/dev-sec/ansible-os-hardening/pull/309) ([rndmh3ro](https://github.com/rndmh3ro))\n\n**Closed issues:**\n\n- Any planned support for RHEL/CentOS 8? [\\#298](https://github.com/dev-sec/ansible-os-hardening/issues/298)\n\n**Merged pull requests:**\n\n- prettier markdown files action added [\\#322](https://github.com/dev-sec/ansible-os-hardening/pull/322) ([danielkubat](https://github.com/danielkubat))\n- adjust permissions on shadow file on suse [\\#311](https://github.com/dev-sec/ansible-os-hardening/pull/311) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [6.2.0](https://github.com/dev-sec/ansible-os-hardening/tree/6.2.0) (2020-08-17)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/6.1.0...6.2.0)\n\n**Implemented enhancements:**\n\n- Optimize and unify when clause [\\#295](https://github.com/dev-sec/ansible-os-hardening/pull/295) ([Alexhha](https://github.com/Alexhha))\n- use find module instead of shell [\\#294](https://github.com/dev-sec/ansible-os-hardening/pull/294) ([danielkubat](https://github.com/danielkubat))\n- improve testing [\\#287](https://github.com/dev-sec/ansible-os-hardening/pull/287) ([schurzi](https://github.com/schurzi))\n\n**Fixed bugs:**\n\n- Inconsistent use of role vars/role defaults [\\#284](https://github.com/dev-sec/ansible-os-hardening/issues/284)\n- replace module parameter fixed [\\#297](https://github.com/dev-sec/ansible-os-hardening/pull/297) ([danielkubat](https://github.com/danielkubat))\n\n**Closed issues:**\n\n- Consider using find module instead of shell [\\#293](https://github.com/dev-sec/ansible-os-hardening/issues/293)\n- Optimize logical OR in when clause [\\#292](https://github.com/dev-sec/ansible-os-hardening/issues/292)\n- vfat added to dev-sec.conf, but efi is used [\\#288](https://github.com/dev-sec/ansible-os-hardening/issues/288)\n- OpenSUSE Support [\\#249](https://github.com/dev-sec/ansible-os-hardening/issues/249)\n\n**Merged pull requests:**\n\n- fix fedora build [\\#296](https://github.com/dev-sec/ansible-os-hardening/pull/296) ([rndmh3ro](https://github.com/rndmh3ro))\n- do not blacklist used filesystems [\\#289](https://github.com/dev-sec/ansible-os-hardening/pull/289) ([schurzi](https://github.com/schurzi))\n- move hidepid vars into defaults so theyre overwritable [\\#285](https://github.com/dev-sec/ansible-os-hardening/pull/285) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [6.1.0](https://github.com/dev-sec/ansible-os-hardening/tree/6.1.0) (2020-07-21)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/6.0.3...6.1.0)\n\n**Implemented enhancements:**\n\n- Mount proc filesystem using hidepid option [\\#283](https://github.com/dev-sec/ansible-os-hardening/pull/283) ([alegrey91](https://github.com/alegrey91))\n\n**Fixed bugs:**\n\n- Is it safe to use on Debian 10? The build is failing. [\\#281](https://github.com/dev-sec/ansible-os-hardening/issues/281)\n\n**Closed issues:**\n\n- The state of the galaxy release [\\#269](https://github.com/dev-sec/ansible-os-hardening/issues/269)\n\n**Merged pull requests:**\n\n- install procps in debian so sysctl.conf exists [\\#282](https://github.com/dev-sec/ansible-os-hardening/pull/282) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [6.0.3](https://github.com/dev-sec/ansible-os-hardening/tree/6.0.3) (2020-06-06)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/6.0.2...6.0.3)\n\n**Implemented enhancements:**\n\n- unify changelog and release actions [\\#279](https://github.com/dev-sec/ansible-os-hardening/pull/279) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [6.0.2](https://github.com/dev-sec/ansible-os-hardening/tree/6.0.2) (2020-06-02)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/6.0.1...6.0.2)\n\n**Implemented enhancements:**\n\n- purge insecure packages [\\#275](https://github.com/dev-sec/ansible-os-hardening/pull/275) ([chris-rock](https://github.com/chris-rock))\n\n## [6.0.1](https://github.com/dev-sec/ansible-os-hardening/tree/6.0.1) (2020-05-09)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/6.0.0...6.0.1)\n\n**Implemented enhancements:**\n\n- add changelog and release workflow [\\#271](https://github.com/dev-sec/ansible-os-hardening/pull/271) ([rndmh3ro](https://github.com/rndmh3ro))\n- github action for changelog generation [\\#270](https://github.com/dev-sec/ansible-os-hardening/pull/270) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [6.0.0](https://github.com/dev-sec/ansible-os-hardening/tree/6.0.0) (2020-05-05)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/5.2.1...6.0.0)\n\n**Implemented enhancements:**\n\n- Configure audit=1 for more accurate auid auditing [\\#253](https://github.com/dev-sec/ansible-os-hardening/issues/253)\n- Add Debian Buster support for ansible-os-hardening [\\#233](https://github.com/dev-sec/ansible-os-hardening/issues/233)\n- Add CentOS 8 support for ansible-os-hardening [\\#232](https://github.com/dev-sec/ansible-os-hardening/issues/232)\n- Add selinux configuration [\\#154](https://github.com/dev-sec/ansible-os-hardening/issues/154)\n- Make useradd defaults in login.defs dependent on OS [\\#266](https://github.com/dev-sec/ansible-os-hardening/pull/266) ([aisbergg](https://github.com/aisbergg))\n- Add kernel hardening parameters from Tails and CIS Benchmark [\\#263](https://github.com/dev-sec/ansible-os-hardening/pull/263) ([kravietz](https://github.com/kravietz))\n- add ansible-lint [\\#262](https://github.com/dev-sec/ansible-os-hardening/pull/262) ([rndmh3ro](https://github.com/rndmh3ro))\n- Remove trailing space [\\#261](https://github.com/dev-sec/ansible-os-hardening/pull/261) ([kravietz](https://github.com/kravietz))\n- Add kernel parameter information to README [\\#259](https://github.com/dev-sec/ansible-os-hardening/pull/259) ([jaredledvina](https://github.com/jaredledvina))\n- Remove trailing whitespaces \\(ansible-lint 201\\) [\\#254](https://github.com/dev-sec/ansible-os-hardening/pull/254) ([kravietz](https://github.com/kravietz))\n- Standardize the var ordering [\\#251](https://github.com/dev-sec/ansible-os-hardening/pull/251) ([dustinmiller1337](https://github.com/dustinmiller1337))\n- Add intial support for OpenSUSE [\\#250](https://github.com/dev-sec/ansible-os-hardening/pull/250) ([dustinmiller1337](https://github.com/dustinmiller1337))\n- Make max_log_file_action for auditd configurable [\\#246](https://github.com/dev-sec/ansible-os-hardening/pull/246) ([jandd](https://github.com/jandd))\n- Add exception in sysctl task [\\#240](https://github.com/dev-sec/ansible-os-hardening/pull/240) ([ghost](https://github.com/ghost))\n- Fedora - Use new auto ansible_python_interpreter for dnf [\\#239](https://github.com/dev-sec/ansible-os-hardening/pull/239) ([jaredledvina](https://github.com/jaredledvina))\n- add test support for CentOS8 [\\#237](https://github.com/dev-sec/ansible-os-hardening/pull/237) ([yeoldegrove](https://github.com/yeoldegrove))\n- Support configuring SELinux and default to enforcing [\\#236](https://github.com/dev-sec/ansible-os-hardening/pull/236) ([jaredledvina](https://github.com/jaredledvina))\n- Add test support for debian buster [\\#234](https://github.com/dev-sec/ansible-os-hardening/pull/234) ([123Haynes](https://github.com/123Haynes))\n- Changed local var name to a less common one [\\#231](https://github.com/dev-sec/ansible-os-hardening/pull/231) ([rgarrigue](https://github.com/rgarrigue))\n- Use ansible facts for vars [\\#226](https://github.com/dev-sec/ansible-os-hardening/pull/226) ([joshuatalb](https://github.com/joshuatalb))\n\n**Fixed bugs:**\n\n- /etc/login.defs alters centos 7/8 default values [\\#265](https://github.com/dev-sec/ansible-os-hardening/issues/265)\n- Invalid Conditionals in user_accounts.yml [\\#255](https://github.com/dev-sec/ansible-os-hardening/issues/255)\n- `auth-system` related files are created for non-RHEL systems \\(e.g. Debian\\) [\\#247](https://github.com/dev-sec/ansible-os-hardening/issues/247)\n- NSA website links are stale [\\#227](https://github.com/dev-sec/ansible-os-hardening/issues/227)\n- Running ansible on python3 throughs \"TypeError: '\\<=' not supported between instances of 'str' and 'int'\" [\\#223](https://github.com/dev-sec/ansible-os-hardening/issues/223)\n- \\[lots of\\] deprecation warnings in Ansible 2.8 [\\#221](https://github.com/dev-sec/ansible-os-hardening/issues/221)\n- Add a \"don't fail on error\" switch ? [\\#148](https://github.com/dev-sec/ansible-os-hardening/issues/148)\n- Addressing issue \\#255 [\\#258](https://github.com/dev-sec/ansible-os-hardening/pull/258) ([ljkimmel](https://github.com/ljkimmel))\n- Fix \\#247, cleanup conditions [\\#248](https://github.com/dev-sec/ansible-os-hardening/pull/248) ([fernandezcuesta](https://github.com/fernandezcuesta))\n- Fix error on applying the sysctl vars on containers [\\#243](https://github.com/dev-sec/ansible-os-hardening/pull/243) ([ghost](https://github.com/ghost))\n- Update location of NSA RHEL 5 Guide [\\#235](https://github.com/dev-sec/ansible-os-hardening/pull/235) ([jaredledvina](https://github.com/jaredledvina))\n\n## [5.2.1](https://github.com/dev-sec/ansible-os-hardening/tree/5.2.1) (2019-06-09)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/5.2.0...5.2.1)\n\n**Implemented enhancements:**\n\n- Fix deprecation warnings in Ansible 2.8 [\\#224](https://github.com/dev-sec/ansible-os-hardening/pull/224) ([Normo](https://github.com/Normo))\n- add docs to find-task in minimize access. fix \\#219 [\\#220](https://github.com/dev-sec/ansible-os-hardening/pull/220) ([rndmh3ro](https://github.com/rndmh3ro))\n\n**Fixed bugs:**\n\n- `squash\\_actions` deprecation warning [\\#218](https://github.com/dev-sec/ansible-os-hardening/issues/218)\n\n## [5.2.0](https://github.com/dev-sec/ansible-os-hardening/tree/5.2.0) (2019-05-04)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/5.1.0...5.2.0)\n\n**Implemented enhancements:**\n\n- Speed up \"minimize access on found files\" task [\\#208](https://github.com/dev-sec/ansible-os-hardening/issues/208)\n- Fedora support? [\\#163](https://github.com/dev-sec/ansible-os-hardening/issues/163)\n- remove eol'd OS and add new [\\#217](https://github.com/dev-sec/ansible-os-hardening/pull/217) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add note about docker under warning [\\#214](https://github.com/dev-sec/ansible-os-hardening/pull/214) ([ChrisMcKee](https://github.com/ChrisMcKee))\n- change minimize access tasks to speed them up [\\#209](https://github.com/dev-sec/ansible-os-hardening/pull/209) ([rndmh3ro](https://github.com/rndmh3ro))\n- Added fedora support [\\#206](https://github.com/dev-sec/ansible-os-hardening/pull/206) ([jonaswre](https://github.com/jonaswre))\n- Pass package list directly to apt and yum modules without using with_items loop [\\#200](https://github.com/dev-sec/ansible-os-hardening/pull/200) ([Normo](https://github.com/Normo))\n\n**Fixed bugs:**\n\n- login.defs.j2 template: ENV_PATH is missing ':' before variable substitution [\\#202](https://github.com/dev-sec/ansible-os-hardening/issues/202)\n- 'sysctl_rhel_config' is undefined [\\#167](https://github.com/dev-sec/ansible-os-hardening/issues/167)\n- RHEL 7.4: Too many setuid bits removed [\\#140](https://github.com/dev-sec/ansible-os-hardening/issues/140)\n- Fix typo [\\#212](https://github.com/dev-sec/ansible-os-hardening/pull/212) ([ruslo](https://github.com/ruslo))\n- Update modprobe to 0644 [\\#211](https://github.com/dev-sec/ansible-os-hardening/pull/211) ([joshuatalb](https://github.com/joshuatalb))\n- Test Kitchen Vagrant Fixes [\\#210](https://github.com/dev-sec/ansible-os-hardening/pull/210) ([joshuatalb](https://github.com/joshuatalb))\n- \\[readme\\] Update documentation link [\\#207](https://github.com/dev-sec/ansible-os-hardening/pull/207) ([pmav99](https://github.com/pmav99))\n- fix ansible lint remarks [\\#204](https://github.com/dev-sec/ansible-os-hardening/pull/204) ([rndmh3ro](https://github.com/rndmh3ro))\n- add colon to user env paths - fix \\#202 [\\#203](https://github.com/dev-sec/ansible-os-hardening/pull/203) ([rndmh3ro](https://github.com/rndmh3ro))\n- Fix errors produced by ansible-lint [\\#159](https://github.com/dev-sec/ansible-os-hardening/pull/159) ([zbrojny120](https://github.com/zbrojny120))\n\n## [5.1.0](https://github.com/dev-sec/ansible-os-hardening/tree/5.1.0) (2018-10-17)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/5.0.0...5.1.0)\n\n**Implemented enhancements:**\n\n- add ubuntu 1804 support [\\#196](https://github.com/dev-sec/ansible-os-hardening/pull/196) ([rndmh3ro](https://github.com/rndmh3ro))\n- add option to disable auditd [\\#192](https://github.com/dev-sec/ansible-os-hardening/pull/192) ([rndmh3ro](https://github.com/rndmh3ro))\n\n**Fixed bugs:**\n\n- auditd causing v5.0 to fail on unpriviledged LXC's [\\#191](https://github.com/dev-sec/ansible-os-hardening/issues/191)\n- Setting os_security_users_allow has no effect [\\#175](https://github.com/dev-sec/ansible-os-hardening/issues/175)\n- add /usr/bin/su to suid_guid whitelist [\\#199](https://github.com/dev-sec/ansible-os-hardening/pull/199) ([ccolic](https://github.com/ccolic))\n- ensure that permissions to su-binary are not restricted to root user and group only, if os_security_users_allow contains the value change_user [\\#197](https://github.com/dev-sec/ansible-os-hardening/pull/197) ([szEvEz](https://github.com/szEvEz))\n\n## [5.0.0](https://github.com/dev-sec/ansible-os-hardening/tree/5.0.0) (2018-09-02)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/4.3.0...5.0.0)\n\n**Implemented enhancements:**\n\n- Warning about \"include\" for tasks for ansible-playbook 2.4.0 \\(devel f0a5854e39\\) [\\#131](https://github.com/dev-sec/ansible-os-hardening/issues/131)\n- fix problems with efi and vfat [\\#190](https://github.com/dev-sec/ansible-os-hardening/pull/190) ([rndmh3ro](https://github.com/rndmh3ro))\n- added os_hardening_enabled flag [\\#186](https://github.com/dev-sec/ansible-os-hardening/pull/186) ([jcheroske](https://github.com/jcheroske))\n- add amazon run opts to travis [\\#183](https://github.com/dev-sec/ansible-os-hardening/pull/183) ([rndmh3ro](https://github.com/rndmh3ro))\n- use package instead of yum and apt [\\#180](https://github.com/dev-sec/ansible-os-hardening/pull/180) ([rndmh3ro](https://github.com/rndmh3ro))\n- add oracle7 to travis [\\#178](https://github.com/dev-sec/ansible-os-hardening/pull/178) ([rndmh3ro](https://github.com/rndmh3ro))\n- fix wrong permissions passwdqc \\#170 [\\#176](https://github.com/dev-sec/ansible-os-hardening/pull/176) ([rndmh3ro](https://github.com/rndmh3ro))\n- ipv4 forwarding comment is inconsistent with example [\\#174](https://github.com/dev-sec/ansible-os-hardening/pull/174) ([carchrae](https://github.com/carchrae))\n- Rename pam_passwdqd.j2 to pam_passwdqc.j2 [\\#172](https://github.com/dev-sec/ansible-os-hardening/pull/172) ([martinbydefault](https://github.com/martinbydefault))\n- Use package state 'present' since 'installed' is deprecated [\\#168](https://github.com/dev-sec/ansible-os-hardening/pull/168) ([Normo](https://github.com/Normo))\n- Update syntax to Ansible 2.4 [\\#161](https://github.com/dev-sec/ansible-os-hardening/pull/161) ([thomasjpfan](https://github.com/thomasjpfan))\n- add amazon linux testing [\\#160](https://github.com/dev-sec/ansible-os-hardening/pull/160) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add support for Amazon Linux [\\#158](https://github.com/dev-sec/ansible-os-hardening/pull/158) ([woneill](https://github.com/woneill))\n- install and configure auditd - fix inspec package-08 [\\#144](https://github.com/dev-sec/ansible-os-hardening/pull/144) ([rndmh3ro](https://github.com/rndmh3ro))\n- Remove deprecated include for static tasks and use instead import_tasks fix \\#131 [\\#132](https://github.com/dev-sec/ansible-os-hardening/pull/132) ([HelioCampos](https://github.com/HelioCampos))\n\n**Fixed bugs:**\n\n- minimize_access: maximum recursion depth exceeded on Ansible 2.5 [\\#171](https://github.com/dev-sec/ansible-os-hardening/issues/171)\n- wrong permissions passwdqc [\\#170](https://github.com/dev-sec/ansible-os-hardening/issues/170)\n- Update deprecated `include` statements [\\#166](https://github.com/dev-sec/ansible-os-hardening/issues/166)\n- Strongly recommend against disabling vfat by default [\\#162](https://github.com/dev-sec/ansible-os-hardening/issues/162)\n- System completely unresponsive after role execution [\\#145](https://github.com/dev-sec/ansible-os-hardening/issues/145)\n- do not install passwdqc on amazon linux [\\#189](https://github.com/dev-sec/ansible-os-hardening/pull/189) ([rndmh3ro](https://github.com/rndmh3ro))\n- add back run opts for debian 8 in travis [\\#184](https://github.com/dev-sec/ansible-os-hardening/pull/184) ([rndmh3ro](https://github.com/rndmh3ro))\n- Fix core dump config file creation when core dumps are disabled [\\#182](https://github.com/dev-sec/ansible-os-hardening/pull/182) ([Normo](https://github.com/Normo))\n- change minimize access method [\\#181](https://github.com/dev-sec/ansible-os-hardening/pull/181) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [4.3.0](https://github.com/dev-sec/ansible-os-hardening/tree/4.3.0) (2018-01-03)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/4.3.1...4.3.0)\n\n**Implemented enhancements:**\n\n- Update some RH settings in this role [\\#155](https://github.com/dev-sec/ansible-os-hardening/issues/155)\n- Removal of core dump hardening configuration if core dumps are allowed [\\#129](https://github.com/dev-sec/ansible-os-hardening/issues/129)\n- Don't create home for system accounts [\\#156](https://github.com/dev-sec/ansible-os-hardening/pull/156) ([oakey-b1](https://github.com/oakey-b1))\n- Prevent disabling of filesystems via whitelist [\\#153](https://github.com/dev-sec/ansible-os-hardening/pull/153) ([manuelprinz](https://github.com/manuelprinz))\n- Add kernel hardening settings from Ubuntu /etc/sysctl.d [\\#150](https://github.com/dev-sec/ansible-os-hardening/pull/150) ([kravietz](https://github.com/kravietz))\n- Removal of core dump hardening configuration if core dumps are allowed [\\#146](https://github.com/dev-sec/ansible-os-hardening/pull/146) ([martinbydefault](https://github.com/martinbydefault))\n- add missing sysctl parameter [\\#143](https://github.com/dev-sec/ansible-os-hardening/pull/143) ([rndmh3ro](https://github.com/rndmh3ro))\n- update readme [\\#139](https://github.com/dev-sec/ansible-os-hardening/pull/139) ([rndmh3ro](https://github.com/rndmh3ro))\n\n**Fixed bugs:**\n\n- bug in ufw.j2 template [\\#151](https://github.com/dev-sec/ansible-os-hardening/issues/151)\n- replace single ticks with double ticks. fix \\#151 [\\#152](https://github.com/dev-sec/ansible-os-hardening/pull/152) ([rndmh3ro](https://github.com/rndmh3ro))\n- fixed tag [\\#149](https://github.com/dev-sec/ansible-os-hardening/pull/149) ([martinbydefault](https://github.com/martinbydefault))\n\n**Closed issues:**\n\n- ansible hardening fails on ubuntu 16.04 with msg\": \"ERROR! 'sysctl_rhel_config' is undefined [\\#147](https://github.com/dev-sec/ansible-os-hardening/issues/147)\n- Enhancement: Test with TestInfra and Molecule [\\#128](https://github.com/dev-sec/ansible-os-hardening/issues/128)\n\n**Merged pull requests:**\n\n- move defaults to os-specific vars [\\#157](https://github.com/dev-sec/ansible-os-hardening/pull/157) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [4.3.1](https://github.com/dev-sec/ansible-os-hardening/tree/4.3.1) (2017-09-13)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/4.2.0...4.3.1)\n\n**Fixed bugs:**\n\n- os_security_kernel_enable_sysrq is not implemented [\\#115](https://github.com/dev-sec/ansible-os-hardening/issues/115)\n\n## [4.2.0](https://github.com/dev-sec/ansible-os-hardening/tree/4.2.0) (2017-08-08)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/4.1.0...4.2.0)\n\n**Implemented enhancements:**\n\n- add modprobe template, control os-10 [\\#138](https://github.com/dev-sec/ansible-os-hardening/pull/138) ([rndmh3ro](https://github.com/rndmh3ro))\n- new task for delete netrc files, control os-09 [\\#137](https://github.com/dev-sec/ansible-os-hardening/pull/137) ([rndmh3ro](https://github.com/rndmh3ro))\n- add passwd task, control os-03 [\\#136](https://github.com/dev-sec/ansible-os-hardening/pull/136) ([rndmh3ro](https://github.com/rndmh3ro))\n- remove prelink package, control package-09 [\\#135](https://github.com/dev-sec/ansible-os-hardening/pull/135) ([rndmh3ro](https://github.com/rndmh3ro))\n- style update [\\#134](https://github.com/dev-sec/ansible-os-hardening/pull/134) ([rndmh3ro](https://github.com/rndmh3ro))\n- Fix ansible.cfg and use comment filter [\\#130](https://github.com/dev-sec/ansible-os-hardening/pull/130) ([fazlearefin](https://github.com/fazlearefin))\n\n**Fixed bugs:**\n\n- Why is rsync removed? [\\#141](https://github.com/dev-sec/ansible-os-hardening/issues/141)\n- playbook makes OS undetectable [\\#124](https://github.com/dev-sec/ansible-os-hardening/issues/124)\n- Centos7/RHEL7: Exec shield is enabled by default and not manageable anymore by sysctl.conf [\\#118](https://github.com/dev-sec/ansible-os-hardening/issues/118)\n- Remove rsync from package blacklist [\\#142](https://github.com/dev-sec/ansible-os-hardening/pull/142) ([duk3luk3](https://github.com/duk3luk3))\n\n**Merged pull requests:**\n\n- add more sysctl settings, allow overwriting [\\#120](https://github.com/dev-sec/ansible-os-hardening/pull/120) ([rndmh3ro](https://github.com/rndmh3ro))\n- remove execshield sysctl-parameter on rhel7 [\\#119](https://github.com/dev-sec/ansible-os-hardening/pull/119) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [4.1.0](https://github.com/dev-sec/ansible-os-hardening/tree/4.1.0) (2017-06-27)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/4.0.0...4.1.0)\n\n**Fixed bugs:**\n\n- Change system accounts not on the user provided ignore-list items are not JSON serializable [\\#125](https://github.com/dev-sec/ansible-os-hardening/issues/125)\n- Could not find gem 'ruby \\(\\>= 2.1.0\\)' [\\#116](https://github.com/dev-sec/ansible-os-hardening/issues/116)\n- The task sysctl fails when /etc/initramfs-tools is not present [\\#111](https://github.com/dev-sec/ansible-os-hardening/issues/111)\n- Deprecation warning always_run [\\#103](https://github.com/dev-sec/ansible-os-hardening/issues/103)\n\n**Closed issues:**\n\n- Enhancement: Pin python dependencies for development and testing [\\#127](https://github.com/dev-sec/ansible-os-hardening/issues/127)\n- Update readme to include baselines [\\#122](https://github.com/dev-sec/ansible-os-hardening/issues/122)\n\n**Merged pull requests:**\n\n- Converts set to JSON-serializable list [\\#126](https://github.com/dev-sec/ansible-os-hardening/pull/126) ([pestaa](https://github.com/pestaa))\n\n## [4.0.0](https://github.com/dev-sec/ansible-os-hardening/tree/4.0.0) (2017-03-14)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/3.2.0...4.0.0)\n\n**Implemented enhancements:**\n\n- Description of the Ansible roles of dev-sec says \"This Ansible playbook\" [\\#97](https://github.com/dev-sec/ansible-os-hardening/issues/97)\n- install initramfs-tools [\\#114](https://github.com/dev-sec/ansible-os-hardening/pull/114) ([rndmh3ro](https://github.com/rndmh3ro))\n- omit empty variables [\\#106](https://github.com/dev-sec/ansible-os-hardening/pull/106) ([rndmh3ro](https://github.com/rndmh3ro))\n\n**Fixed bugs:**\n\n- The role fails when conditionally included [\\#105](https://github.com/dev-sec/ansible-os-hardening/issues/105)\n\n**Closed issues:**\n\n- Error running on RHEL 7 due to syntax issues [\\#112](https://github.com/dev-sec/ansible-os-hardening/issues/112)\n- disable password age [\\#109](https://github.com/dev-sec/ansible-os-hardening/issues/109)\n\n**Merged pull requests:**\n\n- change shadow owner in debian systems [\\#117](https://github.com/dev-sec/ansible-os-hardening/pull/117) ([rndmh3ro](https://github.com/rndmh3ro))\n- Rhel7 [\\#113](https://github.com/dev-sec/ansible-os-hardening/pull/113) ([tyrken](https://github.com/tyrken))\n- use new Docker images [\\#110](https://github.com/dev-sec/ansible-os-hardening/pull/110) ([rndmh3ro](https://github.com/rndmh3ro))\n- Don’t refer to this role as \"playbook\" in the role description [\\#104](https://github.com/dev-sec/ansible-os-hardening/pull/104) ([ypid](https://github.com/ypid))\n\n## [3.2.0](https://github.com/dev-sec/ansible-os-hardening/tree/3.2.0) (2016-10-24)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/3.1.0...3.2.0)\n\n**Fixed bugs:**\n\n- CentOS 7 selinux dependencies [\\#102](https://github.com/dev-sec/ansible-os-hardening/issues/102)\n- ubuntu xenial warning during activate gpg-check for yum-repos [\\#99](https://github.com/dev-sec/ansible-os-hardening/issues/99)\n- rhel_system_auth.j2 is still using pam_passwdqc.so for CentOS 7 [\\#98](https://github.com/dev-sec/ansible-os-hardening/issues/98)\n- Enable pam_pwquality in rhel-family \\> 7 [\\#73](https://github.com/dev-sec/ansible-os-hardening/issues/73)\n- \"irc\" user always changed after reboot [\\#53](https://github.com/dev-sec/ansible-os-hardening/issues/53)\n\n**Merged pull requests:**\n\n- update template [\\#101](https://github.com/dev-sec/ansible-os-hardening/pull/101) ([rndmh3ro](https://github.com/rndmh3ro))\n- fix deprecation warning for undefined error. \\#99 [\\#100](https://github.com/dev-sec/ansible-os-hardening/pull/100) ([rndmh3ro](https://github.com/rndmh3ro))\n- add rhel7 pam_pwquality. fix \\#73 [\\#94](https://github.com/dev-sec/ansible-os-hardening/pull/94) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [3.1.0](https://github.com/dev-sec/ansible-os-hardening/tree/3.1.0) (2016-08-03)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/3.1...3.1.0)\n\n## [3.1](https://github.com/dev-sec/ansible-os-hardening/tree/3.1) (2016-07-27)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/3.0.0...3.1)\n\n**Implemented enhancements:**\n\n- Supports --check mode [\\#93](https://github.com/dev-sec/ansible-os-hardening/pull/93) ([conorsch](https://github.com/conorsch))\n- Adds support for CentOS 7 [\\#91](https://github.com/dev-sec/ansible-os-hardening/pull/91) ([conorsch](https://github.com/conorsch))\n- Docker [\\#90](https://github.com/dev-sec/ansible-os-hardening/pull/90) ([rndmh3ro](https://github.com/rndmh3ro))\n- debian 8 support [\\#88](https://github.com/dev-sec/ansible-os-hardening/pull/88) ([rndmh3ro](https://github.com/rndmh3ro))\n- Ufw manage defaults [\\#85](https://github.com/dev-sec/ansible-os-hardening/pull/85) ([fitz123](https://github.com/fitz123))\n- replace ignore_errors to failed_when to supress ugly error warnings [\\#81](https://github.com/dev-sec/ansible-os-hardening/pull/81) ([fitz123](https://github.com/fitz123))\n- fix bare variables usage for loops [\\#79](https://github.com/dev-sec/ansible-os-hardening/pull/79) ([fitz123](https://github.com/fitz123))\n\n**Fixed bugs:**\n\n- Centos 7.1 fails at \\[Change various sysctl-settings on rhel-hosts...\\] [\\#74](https://github.com/dev-sec/ansible-os-hardening/issues/74)\n- Hardening fails on Centos 7.1 at task 'minimize access' [\\#71](https://github.com/dev-sec/ansible-os-hardening/issues/71)\n\n**Closed issues:**\n\n- Permissions on /etc/shadow can lock out GUI users [\\#86](https://github.com/dev-sec/ansible-os-hardening/issues/86)\n- network related sysctl rewritten by ufw in ubuntu [\\#82](https://github.com/dev-sec/ansible-os-hardening/issues/82)\n- ansible \\>= 2.0 complains: Using bare variables is deprecated [\\#78](https://github.com/dev-sec/ansible-os-hardening/issues/78)\n\n**Merged pull requests:**\n\n- Fix a formatting issue in readme. [\\#92](https://github.com/dev-sec/ansible-os-hardening/pull/92) ([vivekagr](https://github.com/vivekagr))\n- Permits overriding permissions on /etc/shadow [\\#89](https://github.com/dev-sec/ansible-os-hardening/pull/89) ([conorsch](https://github.com/conorsch))\n\n## [3.0.0](https://github.com/dev-sec/ansible-os-hardening/tree/3.0.0) (2016-03-13)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/2.0.0...3.0.0)\n\n**Implemented enhancements:**\n\n- update platforms in meta-file [\\#69](https://github.com/dev-sec/ansible-os-hardening/pull/69) ([rndmh3ro](https://github.com/rndmh3ro))\n- add webhook for ansible galaxy [\\#68](https://github.com/dev-sec/ansible-os-hardening/pull/68) ([rndmh3ro](https://github.com/rndmh3ro))\n- Move sysctl vars to defaults [\\#67](https://github.com/dev-sec/ansible-os-hardening/pull/67) ([rndmh3ro](https://github.com/rndmh3ro))\n- make sys_uid and sys_gid configurable [\\#62](https://github.com/dev-sec/ansible-os-hardening/pull/62) ([rndmh3ro](https://github.com/rndmh3ro))\n- Ansible 2.0 support [\\#59](https://github.com/dev-sec/ansible-os-hardening/pull/59) ([rndmh3ro](https://github.com/rndmh3ro))\n- use inspec as test framework [\\#58](https://github.com/dev-sec/ansible-os-hardening/pull/58) ([chris-rock](https://github.com/chris-rock))\n- Packages as attributes [\\#57](https://github.com/dev-sec/ansible-os-hardening/pull/57) ([rndmh3ro](https://github.com/rndmh3ro))\n- Change categories to tags for upcoming ansible 2.0 [\\#56](https://github.com/dev-sec/ansible-os-hardening/pull/56) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add SINGLE and PROMPT parameters. [\\#55](https://github.com/dev-sec/ansible-os-hardening/pull/55) ([rndmh3ro](https://github.com/rndmh3ro))\n- add changelog generator [\\#54](https://github.com/dev-sec/ansible-os-hardening/pull/54) ([chris-rock](https://github.com/chris-rock))\n\n**Fixed bugs:**\n\n- Updates \"tags\" parameters on includes in main.yml [\\#66](https://github.com/dev-sec/ansible-os-hardening/pull/66) ([conorsch](https://github.com/conorsch))\n- Suid set def var, fix \\#64 [\\#63](https://github.com/dev-sec/ansible-os-hardening/pull/63) ([rndmh3ro](https://github.com/rndmh3ro))\n\n**Closed issues:**\n\n- Hardening fails on Centos 7.1 at task 'remove suid/sgid bit from all binaries except in system and user whitelist' [\\#72](https://github.com/dev-sec/ansible-os-hardening/issues/72)\n- ansible 2.0 | \"remove suid/sgid\" task fails [\\#64](https://github.com/dev-sec/ansible-os-hardening/issues/64)\n- Custom sysctl [\\#50](https://github.com/dev-sec/ansible-os-hardening/issues/50)\n\n**Merged pull requests:**\n\n- Release 3.0.0 [\\#75](https://github.com/dev-sec/ansible-os-hardening/pull/75) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [2.0.0](https://github.com/dev-sec/ansible-os-hardening/tree/2.0.0) (2015-11-28)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/1.0.0...2.0.0)\n\n**Closed issues:**\n\n- Fix directory structure. [\\#48](https://github.com/dev-sec/ansible-os-hardening/issues/48)\n- pam auth update error [\\#47](https://github.com/dev-sec/ansible-os-hardening/issues/47)\n\n**Merged pull requests:**\n\n- Add explicit role-path to kitchen.yml [\\#52](https://github.com/dev-sec/ansible-os-hardening/pull/52) ([rndmh3ro](https://github.com/rndmh3ro))\n- Fix pam passwdqc template [\\#51](https://github.com/dev-sec/ansible-os-hardening/pull/51) ([rndmh3ro](https://github.com/rndmh3ro))\n- New dir layout [\\#49](https://github.com/dev-sec/ansible-os-hardening/pull/49) ([rndmh3ro](https://github.com/rndmh3ro))\n- remove duplicate \"update pam\" task [\\#46](https://github.com/dev-sec/ansible-os-hardening/pull/46) ([fitz123](https://github.com/fitz123))\n- Fix stuck in case pam files was updated before by force update [\\#45](https://github.com/dev-sec/ansible-os-hardening/pull/45) ([fitz123](https://github.com/fitz123))\n- Fix nologin shell path [\\#44](https://github.com/dev-sec/ansible-os-hardening/pull/44) ([fitz123](https://github.com/fitz123))\n- improved travis-tests to cover more cases [\\#42](https://github.com/dev-sec/ansible-os-hardening/pull/42) ([rndmh3ro](https://github.com/rndmh3ro))\n\n## [1.0.0](https://github.com/dev-sec/ansible-os-hardening/tree/1.0.0) (2015-09-01)\n\n[Full Changelog](https://github.com/dev-sec/ansible-os-hardening/compare/06d1464e95cad7ccc24734b934a158b16dfc5014...1.0.0)\n\n**Closed issues:**\n\n- ansible-os-hardening/tasks/minimize_access.yml [\\#38](https://github.com/dev-sec/ansible-os-hardening/issues/38)\n- Role configuration. vars/main.yml? [\\#34](https://github.com/dev-sec/ansible-os-hardening/issues/34)\n- Sysctl reloading [\\#18](https://github.com/dev-sec/ansible-os-hardening/issues/18)\n- Add conditions for disabling of ip forwarding [\\#15](https://github.com/dev-sec/ansible-os-hardening/issues/15)\n- Disable System Accounts [\\#6](https://github.com/dev-sec/ansible-os-hardening/issues/6)\n\n**Merged pull requests:**\n\n- Update kitchen-ansible, remove separate debian install [\\#40](https://github.com/dev-sec/ansible-os-hardening/pull/40) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add mode to su-binary task. Fix \\#38 [\\#39](https://github.com/dev-sec/ansible-os-hardening/pull/39) ([rndmh3ro](https://github.com/rndmh3ro))\n- update common kitchen.yml platforms \\(ansible\\), kitchen_debian.yml platforms \\(ansible\\) [\\#37](https://github.com/dev-sec/ansible-os-hardening/pull/37) ([chris-rock](https://github.com/chris-rock))\n- Change oneliner if-statements to be more readable [\\#36](https://github.com/dev-sec/ansible-os-hardening/pull/36) ([rndmh3ro](https://github.com/rndmh3ro))\n- Separate system-vars from editable vars. Fix \\#34 [\\#35](https://github.com/dev-sec/ansible-os-hardening/pull/35) ([rndmh3ro](https://github.com/rndmh3ro))\n- Create limits.d-directory if it does not exist. [\\#33](https://github.com/dev-sec/ansible-os-hardening/pull/33) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add correct CONTRIB-file [\\#32](https://github.com/dev-sec/ansible-os-hardening/pull/32) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add Ansible Galaxy badge [\\#31](https://github.com/dev-sec/ansible-os-hardening/pull/31) ([rndmh3ro](https://github.com/rndmh3ro))\n- Update readme, todo, changelog, vars [\\#30](https://github.com/dev-sec/ansible-os-hardening/pull/30) ([rndmh3ro](https://github.com/rndmh3ro))\n- List-cleanup and follow symlinks added [\\#29](https://github.com/dev-sec/ansible-os-hardening/pull/29) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add module configuration [\\#28](https://github.com/dev-sec/ansible-os-hardening/pull/28) ([rndmh3ro](https://github.com/rndmh3ro))\n- Fix two sysctl-settings [\\#27](https://github.com/dev-sec/ansible-os-hardening/pull/27) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add meta-files for Ansible Galaxy [\\#26](https://github.com/dev-sec/ansible-os-hardening/pull/26) ([rndmh3ro](https://github.com/rndmh3ro))\n- Disable System Accounts. Fix \\#6 [\\#25](https://github.com/dev-sec/ansible-os-hardening/pull/25) ([rndmh3ro](https://github.com/rndmh3ro))\n- Use changed_when to avoid changed tasks [\\#24](https://github.com/dev-sec/ansible-os-hardening/pull/24) ([rndmh3ro](https://github.com/rndmh3ro))\n- Delete authconfig-task on rhel-systems [\\#23](https://github.com/dev-sec/ansible-os-hardening/pull/23) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add missing rhosts-include task [\\#21](https://github.com/dev-sec/ansible-os-hardening/pull/21) ([rndmh3ro](https://github.com/rndmh3ro))\n- Change sysctl-task. Fix \\#18 [\\#20](https://github.com/dev-sec/ansible-os-hardening/pull/20) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add travis-support [\\#17](https://github.com/dev-sec/ansible-os-hardening/pull/17) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add conditions for various tasks. Fix \\#15 [\\#16](https://github.com/dev-sec/ansible-os-hardening/pull/16) ([rndmh3ro](https://github.com/rndmh3ro))\n- fix configuration of playbook path [\\#14](https://github.com/dev-sec/ansible-os-hardening/pull/14) ([chris-rock](https://github.com/chris-rock))\n- Make tasks clearer [\\#13](https://github.com/dev-sec/ansible-os-hardening/pull/13) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add remove suid/sgid function [\\#12](https://github.com/dev-sec/ansible-os-hardening/pull/12) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add task to remove unused repos and pkgs [\\#11](https://github.com/dev-sec/ansible-os-hardening/pull/11) ([rndmh3ro](https://github.com/rndmh3ro))\n- Edit README to fit to os-hardening [\\#10](https://github.com/dev-sec/ansible-os-hardening/pull/10) ([rndmh3ro](https://github.com/rndmh3ro))\n- ignore RAs on Ipv6 [\\#9](https://github.com/dev-sec/ansible-os-hardening/pull/9) ([rndmh3ro](https://github.com/rndmh3ro))\n- Repair debian install script [\\#8](https://github.com/dev-sec/ansible-os-hardening/pull/8) ([rndmh3ro](https://github.com/rndmh3ro))\n- Separate tasks into multiple smaller files [\\#7](https://github.com/dev-sec/ansible-os-hardening/pull/7) ([rndmh3ro](https://github.com/rndmh3ro))\n- Enable gpg-check on all yum-repositories [\\#5](https://github.com/dev-sec/ansible-os-hardening/pull/5) ([rndmh3ro](https://github.com/rndmh3ro))\n- Change playbook-path to accomodate test-repo [\\#4](https://github.com/dev-sec/ansible-os-hardening/pull/4) ([rndmh3ro](https://github.com/rndmh3ro))\n- treat securetty config as an array [\\#3](https://github.com/dev-sec/ansible-os-hardening/pull/3) ([arlimus](https://github.com/arlimus))\n- Add Securetty-support [\\#2](https://github.com/dev-sec/ansible-os-hardening/pull/2) ([rndmh3ro](https://github.com/rndmh3ro))\n- Add profile.conf configuration [\\#1](https://github.com/dev-sec/ansible-os-hardening/pull/1) ([rndmh3ro](https://github.com/rndmh3ro))\n\n\\* _This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)_\n"
  },
  {
    "path": "roles/os-harden/README.md",
    "content": "# devsec.os_hardening\n\n**deprecated** this role is outdated, not testified with the latest k8s cluster setup\n\n![devsec.os_hardening](https://github.com/dev-sec/ansible-os-hardening/workflows/devsec.os_hardening/badge.svg)\n\n## Looking for the old ansible-os-hardening role?\n\nThis role is now part of the hardening-collection. You can find the old role in the branch `legacy`.\n\n## Description\n\nThis role provides numerous security-related configurations, providing all-round base protection. It is intended to be compliant with the [DevSec Linux Baseline](https://github.com/dev-sec/linux-baseline).\n\nIt configures:\n\n- Remove unused yum repositories and enable GPG key-checking\n- Remove packages with known issues\n- Configures pam for strong password checks\n- Installs and configures auditd\n- Disable core dumps via soft limits\n- sets a restrictive umask\n- Configures execute permissions of files in system paths\n- Hardens access to shadow and passwd files\n- Disables unused filesystems\n- Disables rhosts\n- Configures secure ttys\n- Configures kernel parameters via sysctl\n- Enables selinux on EL-based systems\n- Remove SUIDs and GUIDs\n- Configures login and passwords of system accounts\n\nIt will not:\n\n- Update system packages\n- Install security patches\n\n## Requirements\n\n- Ansible 2.9.0\n\n## Known Limitations\n\n### Docker support\n\nIf you're using Docker / Kubernetes+Docker you'll need to override the ipv4 ip forward sysctl setting.\n\n```yaml\n- hosts: localhost\n  collections:\n    - devsec.hardening\n  roles:\n    - devsec.hardening.os_hardening\n  vars:\n    sysctl_overwrite:\n      # Enable IPv4 traffic forwarding.\n      net.ipv4.ip_forward: 1\n```\n\n### sysctl - vm.mmap_rnd_bits\n\nWe are setting this sysctl to a default of `32`, some systems only support smaller values and this will generate an error. Unfortunately we cannot determine the correct applicable maximum. If you encounter this error you have to override this sysctl in your playbook.\n\n```yaml\n- hosts: localhost\n  collections:\n    - devsec.hardening\n  roles:\n    - devsec.hardening.os_hardening\n  vars:\n    sysctl_overwrite:\n      vm.mmap_rnd_bits: 16\n```\n\n### Testing with inspec\n\nIf you're using inspec to test your machines after applying this role, please make sure to add the connecting user to the `os_ignore_users`-variable.\nOtherwise inspec will fail. For more information, see [issue #124](https://github.com/dev-sec/ansible-os-hardening/issues/124).\n\nWe know that this is the case on Raspberry Pi.\n\n## Variables\n\n- `os_desktop_enable`\n  - Default: `false`\n  - Description: true if this is a desktop system, ie Xorg, KDE/GNOME/Unity/etc\n- `os_env_extra_user_paths`\n  - Default: `[]`\n  - Description: add additional paths to the user's `PATH` variable (default is empty).\n- `os_env_umask`\n  - Default: `027`\n  - Description: set default permissions for new files to `750`\n- `os_auth_pw_max_age`\n  - Default: `60`\n  - Description: maximum password age (set to `99999` to effectively disable it)\n- `os_auth_pw_min_age`\n  - Default: `7`\n  - Description: minimum password age (before allowing any other password change)\n- `os_auth_retries`\n  - Default: `5`\n  - Description: the maximum number of authentication attempts, before the account is locked for some time\n- `os_auth_lockout_time`\n  - Default: `600`\n  - Description: time in seconds that needs to pass, if the account was locked due to too many failed authentication attempts\n- `os_auth_timeout`\n  - Default: `60`\n  - Description: authentication timeout in seconds, so login will exit if this time passes\n- `os_auth_allow_homeless`\n  - Default: `false`\n  - Description: true if to allow users without home to login\n- `os_auth_pam_passwdqc_enable`\n  - Default: `true`\n  - Description: true if you want to use strong password checking in PAM using passwdqc\n- `os_auth_pam_passwdqc_options`\n  - Default: `min=disabled,disabled,16,12,8`\n  - Description: set to any option line (as a string) that you want to pass to passwdqc\n- `os_security_users_allow`\n  - Default: `[]`\n  - Description: list of things, that a user is allowed to do. May contain `change_user`.\n- `os_security_kernel_enable_module_loading`\n  - Default: `true`\n  - Description: true if you want to allowed to change kernel modules once the system is running (eg `modprobe`, `rmmod`)\n- `os_security_kernel_enable_core_dump`\n  - Default: `false`\n  - Description: kernel is crashing or otherwise misbehaving and a kernel core dump is created\n- `os_security_suid_sgid_enforce`\n  - Default: `true`\n  - Description: true if you want to reduce SUID/SGID bits. There is already a list of items which are searched for configured, but you can also add your own\n- `os_security_suid_sgid_blacklist`\n  - Default: `[]`\n  - Description: a list of paths which should have their SUID/SGID bits removed\n- `os_security_suid_sgid_whitelist`\n  - Default: `[]`\n  - Description: a list of paths which should not have their SUID/SGID bits altered\n- `os_security_suid_sgid_remove_from_unknown`\n  - Default: `false`\n  - Description: true if you want to remove SUID/SGID bits from any file, that is not explicitly configured in a `blacklist`. This will make every Ansible-run search through the mounted filesystems looking for SUID/SGID bits that are not configured in the default and user blacklist. If it finds an SUID/SGID bit, it will be removed, unless this file is in your `whitelist`.\n- `os_security_packages_clean`\n  - Default: `true`\n  - Description: removes packages with known issues. See section packages.\n- `os_selinux_state`\n  - Default: `enforcing`\n  - Description: Set the SELinux state, can be either disabled, permissive, or enforcing.\n- `os_selinux_policy`\n  - Default: `targeted`\n  - Description: Set the SELinux polixy.\n- `ufw_manage_defaults`\n  - Default: `true`\n  - Description: true means apply all settings with `ufw_` prefix\n- `ufw_ipt_sysctl`\n  - Default: `''`\n  - Description: by default it disables IPT_SYSCTL in /etc/default/ufw. If you want to overwrite /etc/sysctl.conf values using ufw - set it to your sysctl dictionary, for example `/etc/ufw/sysctl.conf`\n- `ufw_default_input_policy`\n  - Default: `DROP`\n  - Description: set default input policy of ufw to `DROP`\n- `ufw_default_output_policy`\n  - Default: `ACCEPT`\n  - Description: set default output policy of ufw to `ACCEPT`\n- `ufw_default_forward_policy`\n  - Default: `DROP`\n  - Description: set default forward policy of ufw to `DROP`\n- `os_auditd_enabled`\n  - Default: `true`\n  - Description: Set to false to disable installing and configuring auditd.\n- `os_auditd_max_log_file_action`\n  - Default: `keep_logs`\n  - Description: Defines the behaviour of auditd when its log file is filled up. Possible other values are described in the auditd.conf man page. The most common alternative to the default may be `rotate`.\n- `hidepid_option`\n  - Default: `2`\n  - Description: `0`: This is the default setting and gives you the default behaviour. `1`: With this option an normal user would not see other processes but their own about ps, top etc, but he is still able to see process IDs in /proc. `2`: Users are only able too see their own processes (like with hidepid=1), but also the other process IDs are hidden for them in /proc.\n- `proc_mnt_options`\n  - Default: `rw,nosuid,nodev,noexec,relatime,hidepid={{ hidepid_option }}`\n  - Description: Mount proc with hardenized options, including `hidepid` with variable value.\n\n## Packages\n\nWe remove the following packages:\n\n- xinetd ([NSA](https://apps.nsa.gov/iaarchive/library/ia-guidance/security-configuration/operating-systems/guide-to-the-secure-configuration-of-red-hat-enterprise.cfm), Chapter 3.2.1)\n- inetd ([NSA](https://apps.nsa.gov/iaarchive/library/ia-guidance/security-configuration/operating-systems/guide-to-the-secure-configuration-of-red-hat-enterprise.cfm), Chapter 3.2.1)\n- tftp-server ([NSA](https://apps.nsa.gov/iaarchive/library/ia-guidance/security-configuration/operating-systems/guide-to-the-secure-configuration-of-red-hat-enterprise.cfm), Chapter 3.2.5)\n- ypserv ([NSA](https://apps.nsa.gov/iaarchive/library/ia-guidance/security-configuration/operating-systems/guide-to-the-secure-configuration-of-red-hat-enterprise.cfm), Chapter 3.2.4)\n- telnet-server ([NSA](https://apps.nsa.gov/iaarchive/library/ia-guidance/security-configuration/operating-systems/guide-to-the-secure-configuration-of-red-hat-enterprise.cfm), Chapter 3.2.2)\n- rsh-server ([NSA](https://apps.nsa.gov/iaarchive/library/ia-guidance/security-configuration/operating-systems/guide-to-the-secure-configuration-of-red-hat-enterprise.cfm), Chapter 3.2.3)\n- prelink ([open-scap](https://static.open-scap.org/ssg-guides/ssg-sl7-guide-ospp-rhel7-server.html#xccdf_org.ssgproject.content_rule_disable_prelink))\n\n## Disabled filesystems\n\nWe disable the following filesystems, because they're most likely not used:\n\n- \"cramfs\"\n- \"freevxfs\"\n- \"jffs2\"\n- \"hfs\"\n- \"hfsplus\"\n- \"squashfs\"\n- \"udf\"\n- \"vfat\" # only if uefi is not in use\n\nTo prevent some of the filesystems from being disabled, add them to the `os_filesystem_whitelist` variable.\n\n## Example Playbook\n\n```yaml\n- hosts: localhost\n  collections:\n    - devsec.hardening\n  roles:\n    - devsec.hardening.os_hardening\n```\n\n## Changing sysctl variables\n\nIf you want to override sysctl-variables, you can use the `sysctl_overwrite` variable (in older versions you had to override the whole `sysctl_dict`).\nSo for example if you want to change the IPv4 traffic forwarding variable to `1`, do it like this:\n\n```yaml\n- hosts: localhost\n  collections:\n    - devsec.hardening\n  roles:\n    - devsec.hardening.os_hardening\n  vars:\n    sysctl_overwrite:\n      # Enable IPv4 traffic forwarding.\n      net.ipv4.ip_forward: 1\n```\n\nAlternatively you can change Ansible's [hash-behaviour](https://docs.ansible.com/ansible/latest/reference_appendices/config.html#default-hash-behaviour) to `merge`, then you only have to overwrite the single hash you need to. But please be aware that changing the hash-behaviour changes it for all your playbooks and is not recommended by Ansible.\n\n## Improving Kernel Audit logging\n\nBy default, any process that starts before the `auditd` daemon will have an AUID of `4294967295`. To improve this and provide more accurate logging, it's recommended to add the kernel boot parameter `audit=1` to you configuration. Without doing this, you will find that your `auditd` logs fail to properly audit all processes.\n\nFor more information, please see this [upstream documentation](https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html) and your system's boot loader documentation for how to configure additional kernel parameters.\n\n## More information\n\nThis role is mostly based on guides by:\n\n- [Arch Linux wiki, Sysctl hardening](https://wiki.archlinux.org/index.php/Sysctl)\n- [NSA: Guide to the Secure Configuration of Red Hat Enterprise Linux 5](http://www.nsa.gov/ia/_files/os/redhat/rhel5-guide-i731.pdf)\n- [Ubuntu Security/Features](https://wiki.ubuntu.com/Security/Features)\n- [Deutsche Telekom, Group IT Security, Security Requirements (German)](https://www.telekom.com/psa)\n"
  },
  {
    "path": "roles/os-harden/defaults/main.yml",
    "content": "---\nos_desktop_enable: false\nos_env_extra_user_paths: []\nos_auth_pw_max_age: 60\nos_auth_pw_min_age: 7  # discourage password cycling\nos_auth_retries: 5\nos_auth_lockout_time: 600  # 10min\nos_auth_timeout: 60\nos_auth_allow_homeless: false\nos_auth_pam_passwdqc_enable: true\nos_auth_pam_passwdqc_options: 'min=disabled,disabled,16,12,8'  # used in RHEL6\nos_auth_pam_pwquality_options: 'try_first_pass retry=3 type='  # used in RHEL7\nos_auth_root_ttys: [console, tty1, tty2, tty3, tty4, tty5, tty6]\n\nos_chfn_restrict: ''\n# may contain: change_user\nos_security_users_allow: []\n# specify system accounts those login should not be disabled and password not changed\nos_ignore_users: ['vagrant', 'kitchen']\nos_security_kernel_enable_module_loading: true\nos_security_kernel_enable_core_dump: false\nos_security_suid_sgid_enforce: true\n# user-defined blacklist and whitelist\nos_security_suid_sgid_blacklist: []\nos_security_suid_sgid_whitelist: []\n# if this is true, remove any suid/sgid bits from files that were not in the whitelist\nos_security_suid_sgid_remove_from_unknown: false\n\n# remove packages with known issues\nos_security_packages_clean: true\nos_security_packages_list: ['xinetd', 'inetd', 'ypserv', 'telnet-server', 'rsh-server', 'prelink']\n\n# Allow interactive startup (rhel, centos)\nos_security_init_prompt: true\n# Require root password for single user mode. (rhel, centos)\nos_security_init_single: false\n\n# Apply ufw defaults\nufw_manage_defaults: true\n\n# Empty variable disables IPT_SYSCTL in /etc/default/ufw\n# by default in Ubuntu it set to: /etc/ufw/sysctl.conf\n# CAUTION\n# if you enable it - it'll overwrite /etc/sysctl.conf file, managed by hardening framework\nufw_ipt_sysctl: ''\n\n# Default ufw variables\nufw_default_input_policy: 'DROP'\nufw_default_output_policy: 'ACCEPT'\nufw_default_forward_policy: 'DROP'\nufw_default_application_policy: 'SKIP'\nufw_manage_builtins: 'no'\nufw_ipt_modules: 'nf_conntrack_ftp nf_nat_ftp nf_conntrack_netbios_ns'\n\nsysctl_config:\n  # Disable IPv4 traffic forwarding. | sysctl-01\n  net.ipv4.ip_forward: 0\n\n  # Disable IPv6 traffic forwarding. | sysctl-19\n  net.ipv6.conf.all.forwarding: 0\n\n  # ignore RAs on Ipv6. | sysctl-25\n  net.ipv6.conf.all.accept_ra: 0\n  net.ipv6.conf.default.accept_ra: 0\n\n  # Enable RFC-recommended source validation feature. | sysctl-02\n  net.ipv4.conf.all.rp_filter: 1\n  net.ipv4.conf.default.rp_filter: 1\n\n  # Reduce the surface on SMURF attacks. | sysctl-04\n  # Make sure to ignore ECHO broadcasts, which are only required in broad network analysis.\n  net.ipv4.icmp_echo_ignore_broadcasts: 1\n\n  # There is no reason to accept bogus error responses from ICMP, so ignore them instead. | sysctl-03\n  net.ipv4.icmp_ignore_bogus_error_responses: 1\n\n  # Limit the amount of traffic the system uses for ICMP. | sysctl-05\n  net.ipv4.icmp_ratelimit: 100\n\n  # Adjust the ICMP ratelimit to include ping, dst unreachable,\n  # source quench, ime exceed, param problem, timestamp reply, information reply | sysctl-06\n  net.ipv4.icmp_ratemask: 88089\n\n  # Disable IPv6 | sysctl-18\n  net.ipv6.conf.all.disable_ipv6: 1\n\n  # Protect against wrapping sequence numbers at gigabit speeds | sysctl-07\n  net.ipv4.tcp_timestamps: 0\n\n  # Define restriction level for announcing the local source IP | sysctl-08\n  net.ipv4.conf.all.arp_ignore: 1\n\n  # Define mode for sending replies in response to\n  # received ARP requests that resolve local target IP addresses | sysctl-09\n  net.ipv4.conf.all.arp_announce: 2\n\n  # RFC 1337 fix F1 | sysctl-10\n  net.ipv4.tcp_rfc1337: 1\n\n  # Send(router) or accept(host) RFC1620 shared media redirects | sysctl-12\n  net.ipv4.conf.all.shared_media: 1\n  net.ipv4.conf.default.shared_media: 1\n\n  # Accepting source route can lead to malicious networking behavior,\n  # so disable it if not needed. | sysctl-13\n  net.ipv4.conf.all.accept_source_route: 0\n  net.ipv4.conf.default.accept_source_route: 0\n\n  # Accepting redirects can lead to malicious networking behavior, so disable\n  # it if not needed. | sysctl-13 | sysctl-14 | sysctl-15 | sysctl-20\n  net.ipv4.conf.default.accept_redirects: 0\n  net.ipv4.conf.all.accept_redirects: 0\n  net.ipv4.conf.all.secure_redirects: 0\n  net.ipv4.conf.default.secure_redirects: 0\n  net.ipv6.conf.default.accept_redirects: 0\n  net.ipv6.conf.all.accept_redirects: 0\n\n  # For non-routers: don't send redirects, these settings are 0 | sysctl-16\n  net.ipv4.conf.all.send_redirects: 0\n  net.ipv4.conf.default.send_redirects: 0\n\n  # log martian packets | sysctl-17\n  net.ipv4.conf.all.log_martians: 1\n  net.ipv4.conf.default.log_martians: 1\n\n  # ipv6 config\n  # Disable acceptance of IPv6 router solicitations messages | sysctl-21\n  net.ipv6.conf.default.router_solicitations: 0\n\n  # Disable Accept Router Preference from router advertisement | sysctl-22\n  net.ipv6.conf.default.accept_ra_rtr_pref: 0\n\n  # Disable learning Prefix Information from router advertisement | sysctl-23\n  net.ipv6.conf.default.accept_ra_pinfo: 0\n\n  # Disable learning Hop limit from router advertisement | sysctl-24\n  net.ipv6.conf.default.accept_ra_defrtr: 0\n\n  # Disable IPv6 autoconfiguration | sysctl-26\n  net.ipv6.conf.default.autoconf: 0\n\n  # Disable neighbor solicitations to send out per address | sysctl-27\n  net.ipv6.conf.default.dad_transmits: 0\n\n  # Assign one global unicast IPv6 addresses to each interface | sysctl-28\n  net.ipv6.conf.default.max_addresses: 1\n\n  # This settings controls how the kernel behaves towards module changes at\n  # runtime. Setting to 1 will disable module loading at runtime.\n  # Setting it to 0 is actually never supported. | sysctl-29\n  # kernel.modules_disabled: 1\n\n  # Magic Sysrq should be disabled, but can also be set to a safe value if so\n  # desired for physical machines. It can allow a safe reboot if the system hangs\n  # and is a 'cleaner' alternative to hitting the reset button. | sysctl-30\n  # The following values are permitted:\n  # * **0**   - disable sysrq\n  # * **1**   - enable sysrq completely\n  # * **>1**  - bitmask of enabled sysrq functions:\n  # * **2**   - control of console logging level\n  # * **4**   - control of keyboard (SAK, unraw)\n  # * **8**   - debugging dumps of processes etc.\n  # * **16**  - sync command\n  # * **32**  - remount read-only\n  # * **64**  - signalling of processes (term, kill, oom-kill)\n  # * **128** - reboot/poweroff\n  # * **256** - nicing of all RT tasks\n  kernel.sysrq: 0\n\n  # Prevent core dumps with SUID. These are usually only\n  # needed by developers and may contain sensitive information. | sysctl-31\n  fs.suid_dumpable: 0\n\n  # Virtual memory regions protection | sysctl-32\n  kernel.randomize_va_space: 2\n\n  kernel.core_uses_pid: 1\n\n  # The PTRACE system is used for debugging.  With it, a single user process\n  # can attach to any other dumpable process owned by the same user.  In the\n  # case of malicious software, it is possible to use PTRACE to access\n  # credentials that exist in memory (re-using existing SSH connections,\n  # extracting GPG agent information, etc).\n  #\n  # A PTRACE scope of \"0\" is the more permissive mode.  A scope of \"1\" limits\n  # PTRACE only to direct child processes (e.g. \"gdb name-of-program\" and\n  # \"strace -f name-of-program\" work, but gdb's \"attach\" and \"strace -fp $PID\"\n  # do not).  The PTRACE scope is ignored when a user has CAP_SYS_PTRACE, so\n  # \"sudo strace -fp $PID\" will work as before.  For more details see:\n  # https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace\n  #\n  # For applications launching crash handlers that need PTRACE, exceptions can\n  # be registered by the debugee by declaring in the segfault handler\n  # specifically which process will be using PTRACE on the debugee:\n  #   prctl(PR_SET_PTRACER, debugger_pid, 0, 0, 0);\n  #\n  # In general, PTRACE is not needed for the average running Ubuntu system.\n  # To that end, the default is to set the PTRACE scope to \"1\".  This value\n  # may not be appropriate for developers or servers with only admin accounts.\n  # kernel.yama.ptrace_scope = 1\n  kernel.yama.ptrace_scope: 1\n\n  # Protect the zero page of memory from userspace mmap to prevent kernel\n  # NULL-dereference attacks against potential future kernel security\n  # vulnerabilities.  (Added in kernel 2.6.23.)\n  #\n  # While this default is built into the Ubuntu kernel, there is no way to\n  # restore the kernel default if the value is changed during runtime; for\n  # example via package removal (e.g. wine, dosemu).  Therefore, this value\n  # is reset to the secure default each time the sysctl values are loaded.\n  vm.mmap_min_addr: 65536\n\n  # These settings eliminate an entire class of security vulnerability:\n  # time-of-check-time-of-use cross-privilege attacks using guessable\n  # filenames (generally seen as \"/tmp file race\" vulnerabilities).\n  fs.protected_hardlinks: 1\n  fs.protected_symlinks: 1\n\n  # These settings are set to the maximum supported value in order to\n  # improve ASLR effectiveness for mmap, at the cost of increased\n  # address-space fragmentation. | Tail-1\n  vm.mmap_rnd_bits: 32\n  vm.mmap_rnd_compat_bits: 16\n\n  # When an attacker is trying to exploit the local kernel, it is often\n  # helpful to be able to examine where in memory the kernel, modules,\n  # and data structures live. As such, kernel addresses should be treated\n  # as sensitive information.\n  #\n  # Many files and interfaces contain these addresses (e.g. /proc/kallsyms,\n  # /proc/modules, etc), and this setting can censor the addresses. A value\n  # of \"0\" allows all users to see the kernel addresses. A value of \"1\"\n  # limits visibility to the root user, and \"2\" blocks even the root user.\n  #\n  # Some off-the-shelf malware exploit kernel addresses exposed\n  # via /proc/kallsyms so by not making these addresses easily available\n  # we increase the cost of such attack some what; now such malware has\n  # to check which kernel Tails is running and then fetch the corresponding\n  # kernel address map from some external source. This is not hard,\n  # but certainly not all malware has such functionality. | Tails-2\n  kernel.kptr_restrict: 2\n\n  # kexec is dangerous: it enables replacement of the running kernel. | Tails-3\n  kernel.kexec_load_disabled: 1\n\n# Do not delete the following line or otherwise the playbook will fail\n# at task 'create a combined sysctl-dict if overwrites are defined'\nsysctl_overwrite:\n  net.ipv4.ip_forward: 1\n  net.bridge.bridge-nf-call-iptables: 1\n  net.bridge.bridge-nf-call-ip6tables: 1\n  net.bridge.bridge-nf-call-arptables: 1\n\n# disable unused filesystems\nos_unused_filesystems:\n  - \"cramfs\"\n  - \"freevxfs\"\n  - \"jffs2\"\n  - \"hfs\"\n  - \"hfsplus\"\n  - \"squashfs\"\n  - \"udf\"\n  - \"vfat\"\n  # Obsolete network protocols that should be disabled\n  # per CIS Oracle Linux 6 Benchmark (2016)\n  - \"tipc\"  # CIS 3.5.4\n  - \"sctp\"  # CIS 3.5.2\n  - \"dccp\"  # CIS 3.5.1\n  - \"rds\"   # CIS 3.5.3\n\n# whitelist for used filesystems\nos_filesystem_whitelist: []\n\n# Set to false to turn the role into a no-op. Useful when using\n# the Ansible role dependency mechanism.\nos_hardening_enabled: true\n\n# Set to false to disable installing and configuring auditd.\nos_auditd_enabled: false \nos_auditd_max_log_file_action: keep_logs\n\n# Set the SELinux state, can be either disabled, permissive, or enforcing.\nos_selinux_state: disabled\n# Set the SELinux polixy.\nos_selinux_policy: targeted\n\nhidepid_option: '2'  # allowed values: 0, 1, 2\nproc_mnt_options: 'rw,nosuid,nodev,noexec,relatime,hidepid={{ hidepid_option }}'\n"
  },
  {
    "path": "roles/os-harden/handlers/main.yml",
    "content": "---\n- name: update-initramfs\n  command: 'update-initramfs -u'\n"
  },
  {
    "path": "roles/os-harden/meta/main.yml",
    "content": "---\ngalaxy_info:\n  author: \"Sebastian Gumprich\"\n  description: 'This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.'\n  company: Hardening Framework Team\n  license: Apache License 2.0\n  min_ansible_version: '2.5'\n  platforms:\n    - name: EL\n      versions:\n        - 7\n        - 8\n    - name: Ubuntu\n      versions:\n        - xenial\n        - bionic\n    - name: Debian\n      versions:\n        - stretch\n        - buster\n    - name: Amazon\n    - name: Fedora\n    - name: Archlinux\n    - name: SmartOS\n    - name: openSUSE\n  galaxy_tags:\n    - system\n    - security\n    - hardening\ndependencies: []\n"
  },
  {
    "path": "roles/os-harden/tasks/apt.yml",
    "content": "---\n- name: remove deprecated or insecure packages | package-01 - package-09\n  apt:\n    name: '{{ os_security_packages_list }}'\n    state: 'absent'\n    purge: 'yes'\n  when: os_security_packages_clean | bool\n"
  },
  {
    "path": "roles/os-harden/tasks/auditd.yml",
    "content": "---\n- name: install auditd package | package-08\n  package:\n    name: '{{ auditd_package }}'\n    state: 'present'\n\n- name: configure auditd | package-08\n  template:\n    src: 'etc/audit/auditd.conf.j2'\n    dest: '/etc/audit/auditd.conf'\n    owner: 'root'\n    group: 'root'\n    mode: '0640'\n"
  },
  {
    "path": "roles/os-harden/tasks/hardening.yml",
    "content": "---\n- name: Set OS family dependent variables\n  include_vars: '{{ ansible_facts.os_family }}.yml'\n  tags: always\n\n- name: Set OS dependent variables\n  include_vars: '{{ item }}'\n  with_first_found:\n    - files:\n        - '{{ ansible_facts.distribution }}-{{ ansible_facts.distribution_major_version }}.yml'\n        - '{{ ansible_facts.distribution }}.yml'\n        - '{{ ansible_facts.os_family }}-{{ ansible_facts.distribution_major_version }}.yml'\n      skip: true\n  tags: always\n\n- import_tasks: auditd.yml\n  tags: auditd\n  when: os_auditd_enabled | bool\n\n- import_tasks: limits.yml\n  tags: limits\n\n- import_tasks: login_defs.yml\n  tags: login_defs\n\n- import_tasks: minimize_access.yml\n  tags: minimize_access\n\n- import_tasks: pam.yml\n  tags: pam\n\n- import_tasks: modprobe.yml\n  tags: modprobe\n\n- import_tasks: profile.yml\n  tags: profile\n\n- import_tasks: securetty.yml\n  tags: securetty\n\n- import_tasks: suid_sgid.yml\n  when: os_security_suid_sgid_enforce  | bool\n  tags: suid_sgid\n\n- import_tasks: sysctl.yml\n  tags: sysctl\n\n- import_tasks: user_accounts.yml\n  tags: user_accounts\n\n- import_tasks: rhosts.yml\n  tags: rhosts\n\n- import_tasks: yum.yml\n  when: ansible_facts.os_family == 'RedHat'\n  tags: yum\n\n- import_tasks: apt.yml\n  when: ansible_facts.distribution in ['Debian', 'Ubuntu']\n  tags: apt\n\n- import_tasks: selinux.yml\n  tags: selinux\n  when: ansible_facts.selinux.status == 'enabled'\n"
  },
  {
    "path": "roles/os-harden/tasks/limits.yml",
    "content": "---\n- block:\n  - name: create limits.d-directory if it does not exist | sysctl-31a, sysctl-31b\n    file:\n      path: '/etc/security/limits.d'\n      owner: 'root'\n      group: 'root'\n      mode: '0755'\n      state: 'directory'\n\n  - name: create additional limits config file -> 10.hardcore.conf | sysctl-31a, sysctl-31b\n    pam_limits:\n      dest: '/etc/security/limits.d/10.hardcore.conf'\n      domain: '*'\n      limit_type: hard\n      limit_item: core\n      value: '0'\n      comment: Prevent core dumps for all users. These are usually not needed and may contain sensitive information\n\n  - name: set 10.hardcore.conf perms to 0400 and root ownership\n    file:\n      path: /etc/security/limits.d/10.hardcore.conf\n      owner: 'root'\n      group: 'root'\n      mode: '0440'\n      state: touch\n      modification_time: preserve\n      access_time: preserve\n\n  when: not os_security_kernel_enable_core_dump | bool\n\n- name: remove 10.hardcore.conf config file\n  file:\n    path: /etc/security/limits.d/10.hardcore.conf\n    state: absent\n  when: os_security_kernel_enable_core_dump | bool\n"
  },
  {
    "path": "roles/os-harden/tasks/login_defs.yml",
    "content": "---\n- name: create login.defs | os-05, os-05b\n  template:\n    src: 'etc/login.defs.j2'\n    dest: '/etc/login.defs'\n    owner: 'root'\n    group: 'root'\n    mode: '0444'\n"
  },
  {
    "path": "roles/os-harden/tasks/main.yml",
    "content": "---\n- import_tasks: hardening.yml\n  ignore_errors: true\n  when: os_hardening_enabled | bool\n"
  },
  {
    "path": "roles/os-harden/tasks/minimize_access.yml",
    "content": "---\n# If the find-task throws an error on /usr/bin/X11 like \"File system loop detected\"\n# the other files inside /usr/bin (and all other directories) are\n# still getting found and the permissions minimized in the next task.\n# This is also the reason why there's ignore_errors: true on the task.\n# also see: https://github.com/dev-sec/ansible-os-hardening/issues/219\n- name: find files with write-permissions for group\n  shell: \"find -L {{ item }} -perm /go+w -type f\"  # noqa 305\n  with_flattened:\n    - '/usr/local/sbin'\n    - '/usr/local/bin'\n    - '/usr/sbin'\n    - '/usr/bin'\n    - '/sbin'\n    - '/bin'\n    - \"{{ os_env_extra_user_paths }}\"  # noqa 104\n  register: minimize_access_directories\n  ignore_errors: true\n  changed_when: false\n\n- name: minimize access on found files\n  file:\n    path: '{{ item.1 }}'\n    mode: 'go-w'\n    state: file\n  with_subelements:\n    - \"{{ minimize_access_directories.results }}\"\n    - stdout_lines\n\n- name: change shadow ownership to root and mode to 0600 | os-02\n  file:\n    dest: '/etc/shadow'\n    owner: '{{ os_shadow_perms.owner }}'\n    group: '{{ os_shadow_perms.group }}'\n    mode: '{{ os_shadow_perms.mode }}'\n\n- name: change passwd ownership to root and mode to 0644 | os-03\n  file:\n    dest: '/etc/passwd'\n    owner: '{{ os_passwd_perms.owner }}'\n    group: '{{ os_passwd_perms.group }}'\n    mode: '{{ os_passwd_perms.mode }}'\n\n- name: change su-binary to only be accessible to user and group root\n  file:\n    dest: '/bin/su'\n    owner: 'root'\n    group: 'root'\n    mode: '0750'\n  when: '\"change_user\" not in os_security_users_allow'\n\n- name: set option hidepid for proc filesystem\n  mount:\n    path: /proc\n    src: proc\n    fstype: proc\n    opts: '{{ proc_mnt_options }}'\n    state: present\n"
  },
  {
    "path": "roles/os-harden/tasks/modprobe.yml",
    "content": "---\n- name: install modprobe to disable filesystems | os-10\n  package:\n    name: '{{ modprobe_package }}'\n    state: 'present'\n\n- name: check if efi is installed\n  stat:\n    path: \"/sys/firmware/efi\"\n  register: efi_installed\n\n- name: remove vfat from fs-list if efi is used\n  set_fact:\n    os_unused_filesystems: \"{{ os_unused_filesystems | difference('vfat') }}\"\n  when:\n    - efi_installed.stat.isdir is defined\n    - efi_installed.stat.isdir\n\n- name: remove used filesystems from fs-list\n  set_fact:\n    os_unused_filesystems: \"{{ os_unused_filesystems | difference(ansible_mounts | map(attribute='fstype') | list) }}\"\n  # we cannot do this on el6 and below, because these systems don't support the map function\n  when: not ((ansible_facts.os_family in ['Oracle Linux', 'RedHat']) and ansible_facts.distribution_major_version < '7')\n\n- name: disable unused filesystems | os-10\n  template:\n    src: 'etc/modprobe.d/modprobe.j2'\n    dest: '/etc/modprobe.d/dev-sec.conf'\n    owner: 'root'\n    group: 'root'\n    mode: '0644'\n"
  },
  {
    "path": "roles/os-harden/tasks/pam.yml",
    "content": "---\n- name: update pam on Debian systems\n  command: 'pam-auth-update --package'\n  when: ansible_facts.distribution in ['Debian', 'Ubuntu']\n  changed_when: false\n  environment:\n    DEBIAN_FRONTEND: noninteractive\n\n# the reason for this is so a user cannot connect to a server,\n# that isn't connected to an LDAP server anymore.\n# normally caching credentials shouldn't be necessary for most machines.\n# removing it provides some more security while not removing usability.\n- name: remove pam ccreds to disable password caching\n  package:\n    name: '{{ os_packages_pam_ccreds }}'\n    state: 'absent'\n  when:\n    - ansible_facts.os_family != 'Archlinux'\n\n- name: remove pam_cracklib, because it does not play nice with passwdqc\n  apt:\n    name: '{{ os_packages_pam_cracklib }}'\n    state: 'absent'\n  when:\n    - ansible_facts.distribution in ['Debian', 'Ubuntu']\n    - os_auth_pam_passwdqc_enable\n\n- name: install the package for strong password checking\n  apt:\n    name: '{{ os_packages_pam_passwdqc }}'\n    state: 'present'\n    update_cache: 'yes'\n  when:\n    - ansible_facts.distribution in ['Debian', 'Ubuntu']\n    - os_auth_pam_passwdqc_enable\n\n- name: configure passwdqc\n  template:\n    src: 'usr/share/pam-configs/pam_passwdqd.j2'\n    dest: '{{ passwdqc_path }}'\n    mode: '0644'\n    owner: 'root'\n    group: 'root'\n  when:\n    - ansible_facts.distribution in ['Debian', 'Ubuntu']\n    - os_auth_pam_passwdqc_enable\n\n- name: remove passwdqc\n  apt:\n    name: '{{ os_packages_pam_passwdqc }}'\n    state: 'absent'\n  when:\n    - ansible_facts.distribution in ['Debian', 'Ubuntu']\n    - not os_auth_pam_passwdqc_enable\n\n- name: install tally2\n  apt:\n    name: 'libpam-modules'\n    state: 'present'\n  when:\n    - ansible_facts.distribution in ['Debian', 'Ubuntu']\n    - not os_auth_pam_passwdqc_enable\n    - os_auth_retries > 0\n\n- name: configure tally2\n  template:\n    src: 'usr/share/pam-configs/pam_tally2.j2'\n    dest: '{{ tally2_path }}'\n    mode: '0644'\n    owner: 'root'\n    group: 'root'\n  when:\n    - ansible_facts.distribution in ['Debian', 'Ubuntu']\n    - not os_auth_pam_passwdqc_enable\n    - os_auth_retries > 0\n\n- name: delete tally2 when retries is 0\n  file:\n    path: '{{ tally2_path }}'\n    state: 'absent'\n  when:\n    - ansible_facts.distribution in ['Debian', 'Ubuntu']\n    - not os_auth_pam_passwdqc_enable\n    - os_auth_retries == 0\n\n- name: remove pam_cracklib, because it does not play nice with passwdqc\n  yum:\n    name: '{{ os_packages_pam_cracklib }}'\n    state: 'absent'\n  when:\n    - ansible_facts.os_family == 'RedHat'\n    - ansible_facts.distribution_major_version|int is version('7', '<')\n    - ansible_facts.distribution != 'Amazon'\n    - os_auth_pam_passwdqc_enable\n\n- name: install the package for strong password checking\n  yum:\n    name: '{{ os_packages_pam_passwdqc }}'\n    state: 'present'\n  when:\n    - ansible_facts.os_family == 'RedHat'\n    - ansible_facts.distribution_major_version|int is version('7', '<')\n    - ansible_facts.distribution != 'Amazon'\n    - os_auth_pam_passwdqc_enable\n\n- name: remove passwdqc\n  yum:\n    name: '{{ os_packages_pam_passwdqc }}'\n    state: 'absent'\n  when:\n    - ansible_facts.os_family == 'RedHat'\n    - not os_auth_pam_passwdqc_enable\n\n- name: configure passwdqc and tally via central system-auth confic\n  template:\n    src: 'etc/pam.d/rhel_system_auth.j2'\n    dest: '/etc/pam.d/system-auth-ac'\n    mode: '0640'\n    owner: 'root'\n    group: 'root'\n  when: ansible_facts.os_family == 'RedHat'\n\n- name: Gather package facts\n  package_facts:\n    manager: auto\n  when:\n    - ansible_facts.os_family != 'Suse'\n    - ansible_facts.os_family != 'Archlinux'\n\n- name: NSA 2.3.3.5 Upgrade Password Hashing Algorithm to SHA-512\n  template:\n    src: 'etc/libuser.conf.j2'\n    dest: '/etc/libuser.conf'\n    mode: '0640'\n    owner: 'root'\n    group: 'root'\n  when:\n    - ansible_facts.os_family != 'Suse'\n    - ansible_facts.os_family != 'Archlinux'\n    - \"'libuser' in ansible_facts.packages\"\n"
  },
  {
    "path": "roles/os-harden/tasks/profile.yml",
    "content": "---\n- name: add pinerolo_profile.sh to profile.d\n  template:\n    src: 'etc/profile.d/profile.conf.j2'\n    dest: '/etc/profile.d/pinerolo_profile.sh'\n    owner: 'root'\n    group: 'root'\n    mode: '0750'\n  when: not os_security_kernel_enable_core_dump | bool\n\n- name: remove pinerolo_profile.sh from profile.d\n  file:\n    path: /etc/profile.d/pinerolo_profile.sh\n    state: absent\n  when: os_security_kernel_enable_core_dump | bool\n"
  },
  {
    "path": "roles/os-harden/tasks/rhosts.yml",
    "content": "---\n- name: Get user accounts | os-09\n  command: \"awk -F: '{print $1}' /etc/passwd\"\n  changed_when: false\n  check_mode: false\n  register: users_accounts\n\n- name: delete rhosts-files from system | os-09\n  file:\n    dest: '~{{ item }}/.rhosts'\n    state: 'absent'\n  with_flattened: '{{ users_accounts.stdout_lines | default([]) }}'\n\n- name: delete hosts.equiv from system | os-01\n  file:\n    dest: '/etc/hosts.equiv'\n    state: 'absent'\n\n- name: delete .netrc-files from system | os-09\n  file:\n    dest: '~{{ item }}/.netrc'\n    state: 'absent'\n  with_flattened: '{{ users_accounts.stdout_lines | default([]) }}'\n"
  },
  {
    "path": "roles/os-harden/tasks/securetty.yml",
    "content": "---\n- name: create securetty\n  template:\n    src: 'etc/securetty.j2'\n    dest: '/etc/securetty'\n    owner: 'root'\n    group: 'root'\n    mode: '0400'\n"
  },
  {
    "path": "roles/os-harden/tasks/selinux.yml",
    "content": "---\n- name: configure selinux | selinux-01\n  selinux:\n    policy: \"{{ os_selinux_policy }}\"\n    state: \"{{ os_selinux_state }}\"\n"
  },
  {
    "path": "roles/os-harden/tasks/suid_sgid.yml",
    "content": "---\n- name: remove suid/sgid bit from binaries in blacklist | os-06\n  file:\n    path: '{{ item }}'\n    mode: 'a-s'\n    state: 'file'\n    follow: 'yes'\n  failed_when: false\n  with_flattened:\n    - '{{ os_security_suid_sgid_system_blacklist }}'\n    - '{{ os_security_suid_sgid_blacklist }}'\n\n- name: find binaries with suid/sgid set | os-06\n  shell: find / -xdev \\( -perm -4000 -o -perm -2000 \\) -type f ! -path '/proc/*' -print 2>/dev/null\n  register: sbit_binaries\n  when: os_security_suid_sgid_remove_from_unknown | bool\n  changed_when: false\n\n- name: gather files from which to remove suids/sgids and remove system white-listed files | os-06\n  set_fact:\n    suid: '{{ sbit_binaries.stdout_lines | difference(os_security_suid_sgid_system_whitelist) }}'\n  when: os_security_suid_sgid_remove_from_unknown | bool\n\n- name: remove suid/sgid bit from all binaries except in system and user whitelist | os-06\n  file:\n    path: '{{ item }}'\n    mode: 'a-s'\n    state: 'file'\n    follow: 'yes'\n  with_flattened:\n    - '{{ suid | default([]) | difference(os_security_suid_sgid_whitelist) }}'\n  when: os_security_suid_sgid_remove_from_unknown | bool\n"
  },
  {
    "path": "roles/os-harden/tasks/sysctl.yml",
    "content": "---\n- name: protect sysctl.conf\n  file:\n    path: '/etc/sysctl.conf'\n    owner: 'root'\n    group: 'root'\n    mode: '0440'\n    state: touch\n    modification_time: preserve\n    access_time: preserve\n\n- name: set Daemon umask, do config for rhel-family | NSA 2.2.4.1\n  template:\n    src: 'etc/sysconfig/rhel_sysconfig_init.j2'\n    dest: '/etc/sysconfig/init'\n    owner: 'root'\n    group: 'root'\n    mode: '0544'\n  when: ansible_facts.distribution in ['Amazon', 'CentOS', 'Fedora', 'RedHat']\n\n- name: install initramfs-tools\n  apt:\n    name: 'initramfs-tools'\n    state: 'present'\n    update_cache: true\n  when:\n    - ansible_facts.os_family == 'Debian'\n    - os_security_kernel_enable_module_loading\n\n- name: rebuild initramfs with starting pack of modules, if module loading at runtime is disabled\n  template:\n    src: 'etc/initramfs-tools/modules.j2'\n    dest: '/etc/initramfs-tools/modules'\n    owner: 'root'\n    group: 'root'\n    mode: '0440'\n  notify:\n    - update-initramfs\n  when:\n    - ansible_facts.os_family == 'Debian'\n    - os_security_kernel_enable_module_loading\n  register: initramfs\n\n- name: change sysctls\n  block:\n    - name: create a combined sysctl-dict if overwrites are defined\n      set_fact:\n        sysctl_config: '{{ sysctl_config | combine(sysctl_overwrite) }}'\n      when: sysctl_overwrite | default()\n\n    - name: Change various sysctl-settings, look at the sysctl-vars file for documentation\n      sysctl:\n        name: '{{ item.key }}'\n        value: '{{ item.value }}'\n        sysctl_set: true\n        state: present\n        reload: true\n        ignoreerrors: true\n      with_dict: '{{ sysctl_config }}'\n\n    - name: Change various sysctl-settings on rhel6-hosts or older, look at the sysctl-vars file for documentation\n      sysctl:\n        name: '{{ item.key }}'\n        value: '{{ item.value }}'\n        state: present\n        reload: true\n        ignoreerrors: true\n      with_dict: '{{ sysctl_rhel_config }}'\n      when: ((ansible_facts.distribution in ['CentOS', 'Fedora', 'RedHat']) and\n            ansible_distribution_version|int is version('7', '<')) or ansible_facts.distribution == 'Amazon'\n\n  when: ansible_virtualization_type not in ['docker', 'lxc', 'openvz']\n\n- name: Apply ufw defaults\n  template:\n    src: 'etc/default/ufw.j2'\n    dest: '/etc/default/ufw'\n    mode: '0644'\n  when:\n    - ufw_manage_defaults\n    - ansible_facts.distribution in ['Debian', 'Ubuntu']\n  tags: ufw\n"
  },
  {
    "path": "roles/os-harden/tasks/user_accounts.yml",
    "content": "---\n- name: get UID_MIN from login.defs\n  shell: awk '/^\\s*UID_MIN\\s*([0-9]*).*?$/ {print $2}' /etc/login.defs\n  args:\n    removes: /etc/login.defs\n  register: uid_min\n  check_mode: false\n  changed_when: false\n\n- name: calculate UID_MAX from UID_MIN by substracting 1\n  set_fact:\n    uid_max: '{{ uid_min.stdout | int - 1 }}'\n  when: uid_min.stdout|int > 0\n\n- name: set UID_MAX on Debian-systems if no login.defs exist\n  set_fact:\n    uid_max: '999'\n  when:\n    - ansible_facts.os_family == 'Debian'\n    - uid_max is not defined\n\n- name: set UID_MAX on other systems if no login.defs exist\n  set_fact:\n    uid_max: '499'\n  when: uid_max is not defined\n\n- name: get all system accounts\n  command: awk -F'':'' '{ if ( $3 <= {{ uid_max|quote }} ) print $1}' /etc/passwd\n  args:\n    removes: /etc/passwd\n  changed_when: false\n  check_mode: false\n  register: sys_accs\n\n- name: remove always ignored system accounts from list\n  set_fact:\n    sys_accs_cond: '{{ sys_accs.stdout_lines | difference(os_always_ignore_users) }}'\n  check_mode: false\n\n- name: change system accounts not on the user provided ignore-list\n  user:\n    name: '{{ item }}'\n    shell: '{{ os_nologin_shell_path }}'\n    password: '*'\n    createhome: false\n  with_flattened:\n    - '{{ sys_accs_cond | default([]) | difference(os_ignore_users) | list }}'\n"
  },
  {
    "path": "roles/os-harden/tasks/yum.yml",
    "content": "---\n- name: remove unused repositories\n  file:\n    name: '/etc/yum.repos.d/{{ item }}.repo'\n    state: 'absent'\n  loop:\n    - 'CentOS-Debuginfo'\n    - 'CentOS-Media'\n    - 'CentOS-Vault'\n  when: os_security_packages_clean | bool\n\n- name: get yum-repository-files\n  find:\n    paths: '/etc/yum.repos.d'\n    patterns: '*.repo'\n  register: yum_repos\n\n# for the 'default([])' see here:\n# https://github.com/dev-sec/ansible-os-hardening/issues/99 and\n# https://stackoverflow.com/questions/37067827/ansible-deprecation-warning-for-undefined-variable-despite-when-clause\n- name: activate gpg-check for yum-repository-files\n  replace:\n    path: '{{ item.path }}'\n    regexp: '^\\s*gpgcheck.*'\n    replace: 'gpgcheck=1'\n    mode: '0644'\n  with_items:\n    - '{{ yum_repos.files | default([]) }}'\n\n# failed_when is needed because by default replace module will fail if the file doesn't exists.\n# status.rc is only defined if an error accrued and only error code (rc) 257 will be ignored.\n# All other errors will still be raised.\n- name: activate gpg-check for config files\n  replace:\n    path: '{{ item }}'\n    regexp: '^\\s*gpgcheck\\W.*'\n    replace: 'gpgcheck=1'\n    mode: '0644'\n  register: status\n  failed_when: status.rc is defined and status.rc != 257\n  loop:\n    - '/etc/yum.conf'\n    - '/etc/dnf/dnf.conf'\n    - '/etc/yum/pluginconf.d/rhnplugin.conf'\n\n- name: remove deprecated or insecure packages | package-01 - package-09\n  yum:\n    name: '{{ os_security_packages_list }}'\n    state: 'absent'\n  when: os_security_packages_clean | bool\n"
  },
  {
    "path": "roles/os-harden/templates/etc/audit/auditd.conf.j2",
    "content": "{{ ansible_managed | comment }}\n\nlog_file = /var/log/audit/audit.log\nlog_format = RAW\nlog_group = root\npriority_boost = 4\nflush = INCREMENTAL\nfreq = 20\nnum_logs = 5\ndisp_qos = lossy\ndispatcher = /sbin/audispd\nname_format = NONE\n##name = mydomain\nmax_log_file = 6\nmax_log_file_action = {{ os_auditd_max_log_file_action }}\nspace_left = 75\nspace_left_action = SYSLOG\naction_mail_acct = root\nadmin_space_left = 50\nadmin_space_left_action = SUSPEND\ndisk_full_action = SUSPEND\ndisk_error_action = SUSPEND\n##tcp_listen_port =\ntcp_listen_queue = 5\ntcp_max_per_addr = 1\n##tcp_client_ports = 1024-65535\ntcp_client_max_idle = 0\nenable_krb5 = no\nkrb5_principal = auditd\n##krb5_key_file = /etc/audit/audit.key\n"
  },
  {
    "path": "roles/os-harden/templates/etc/default/ufw.j2",
    "content": "{{ ansible_managed | comment }}\n\n# /etc/default/ufw\n#\n\n# Set to yes to apply rules to support IPv6 (no means only IPv6 on loopback\n# accepted). You will need to 'disable' and then 'enable' the firewall for\n# the changes to take affect.\nIPV6={{ 'no' if sysctl_config['net.ipv6.conf.all.disable_ipv6'] is defined and sysctl_config['net.ipv6.conf.all.disable_ipv6'] == 1 else 'yes' }}\n\n# Set the default input policy to ACCEPT, DROP, or REJECT. Please note that if\n# you change this you will most likely want to adjust your rules.\nDEFAULT_INPUT_POLICY=\"{{ ufw_default_input_policy }}\"\n\n# Set the default output policy to ACCEPT, DROP, or REJECT. Please note that if\n# you change this you will most likely want to adjust your rules.\nDEFAULT_OUTPUT_POLICY=\"{{ ufw_default_output_policy }}\"\n\n# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that\n# if you change this you will most likely want to adjust your rules\nDEFAULT_FORWARD_POLICY=\"{{ ufw_default_forward_policy }}\"\n\n# Set the default application policy to ACCEPT, DROP, REJECT or SKIP. Please\n# note that setting this to ACCEPT may be a security risk. See 'man ufw' for\n# details\nDEFAULT_APPLICATION_POLICY=\"{{ ufw_default_application_policy }}\"\n\n# By default, ufw only touches its own chains. Set this to 'yes' to have ufw\n# manage the built-in chains too. Warning: setting this to 'yes' will break\n# non-ufw managed firewall rules\nMANAGE_BUILTINS=\"{{ ufw_manage_builtins }}\"\n\n#\n# IPT backend\n#\n# only enable if using iptables backend and want to overwrite /etc/sysctl.conf\n{% if ufw_ipt_sysctl == '' %}#{% endif %}IPT_SYSCTL={{ ufw_ipt_sysctl }}\n\n# Extra connection tracking modules to load. Complete list can be found in\n# net/netfilter/Kconfig of your kernel source. Some common modules:\n# nf_conntrack_irc, nf_nat_irc: DCC (Direct Client to Client) support\n# nf_conntrack_netbios_ns: NetBIOS (samba) client support\n# nf_conntrack_pptp, nf_nat_pptp: PPTP over stateful firewall/NAT\n# nf_conntrack_ftp, nf_nat_ftp: active FTP support\n# nf_conntrack_tftp, nf_nat_tftp: TFTP support (server side)\nIPT_MODULES=\"{{ ufw_ipt_modules }}\"\n"
  },
  {
    "path": "roles/os-harden/templates/etc/initramfs-tools/modules.j2",
    "content": "{{ ansible_managed | comment }}\n\n# This file contains the names of kernel modules that should be loaded at boot time, one per line. Lines beginning with \"#\" are ignored.\n#\n# A list of all available kernel modules kann be found with `find /lib/modules/$(uname -r)/kernel/`\n# We will sort by folder.\n\n\n# Arch\n# ----\n#\n# Modules for certains builds, contains support modules and some CPU-specific optimizations.\n\n{% if ansible_facts.architecture == 'x86_64' %}\n# Optimize for x86_64 cryptographic features\ntwofish-x86_64-3way\ntwofish-x86_64\naes-x86_64\nsalsa20-x86_64\nblowfish-x86_64\n{% endif %}\n\n{% if 'amd' in ansible_facts.processor %}\n# AMD-specific optimizations\nkvm-amd\n{% else %}\n# Intel-specific optimizations\nghash-clmulni-intel\naesni-intel\nkvm-intel\n{% endif %}\n\nkvm\n\n# Crypto\n# ------\n\n# Some core modules which comprise strong cryptography.\nblowfish_common\nblowfish_generic\nctr\ncts\nlrw\nlzo\nrmd160\nrmd256\nrmd320\nserpent\nsha512_generic\ntwofish_common\ntwofish_generic\nxts\nzlib\n\n\n# Drivers\n# -------\n\n# Basics\nlp\nrtc\nloop\n\n# Filesystems\next2\nbtrfs\n\n{% if os_desktop_enable %}\n# Desktop\npsmouse\nsnd\nsnd_ac97_codec\nsnd_intel8x0\nsnd_page_alloc\nsnd_pcm\nsnd_timer\nsoundcore\nusbhid\n{% endif %}\n\n# Lib\n# ---\nxz\n\n\n# Net\n# ---\n\n# All packets needed for netfilter rules (ie iptables, ebtables).\nip_tables\nx_tables\niptable_filter\niptable_nat\n\n# Targets\nipt_LOG\nipt_REJECT\n\n# Modules\nxt_connlimit\nxt_tcpudp\nxt_recent\nxt_limit\nxt_conntrack\nnf_conntrack\nnf_conntrack_ipv4\nnf_defrag_ipv4\nxt_state\nnf_nat\n\n# Addons\nxt_pknock\n"
  },
  {
    "path": "roles/os-harden/templates/etc/libuser.conf.j2",
    "content": "{{ ansible_managed | comment }}\n\n# See libuser.conf(5) for more information. \n\n# Do not modify the default module list if you care about unattended calls\n# to programs (i.e., scripts) working!\n\n[import]\n# Data from these files is used when libuser.conf does not define a value.\n# The mapping is documented in the man page.\nlogin_defs = /etc/login.defs\ndefault_useradd = /etc/default/useradd\n\n[defaults]\n# The default (/usr/lib*/libuser) is usually correct\n# moduledir = /your/custom/directory\n\n# The following variables are usually imported:\n# skeleton = /etc/skel\n# mailspooldir = /var/mail\n\n# NSA 2.3.3.5 Upgrade Password Hashing Algorithm to SHA-512\ncrypt_style = sha512\n\nmodules = files shadow\ncreate_modules = files shadow\n# modules = files shadow ldap\n# create_modules = ldap\n\n[userdefaults]\nLU_USERNAME = %n\n# LU_UIDNUMBER = 500\nLU_GIDNUMBER = %u\n# LU_USERPASSWORD = !!\n# LU_GECOS = %n\n# LU_HOMEDIRECTORY = /home/%n\n# LU_LOGINSHELL = /bin/bash\n\n# LU_SHADOWNAME = %n\n# LU_SHADOWPASSWORD = !!\n# LU_SHADOWLASTCHANGE = %d\n# LU_SHADOWMIN = 0\n# LU_SHADOWMAX = 99999\n# LU_SHADOWWARNING = 7\n# LU_SHADOWINACTIVE = -1\n# LU_SHADOWEXPIRE = -1\n# LU_SHADOWFLAG = -1\n\n[groupdefaults]\nLU_GROUPNAME = %n\n# LU_GIDNUMBER = 500\n# LU_GROUPPASSWORD = !!\n# LU_MEMBERUID =\n# LU_ADMINISTRATORUID =\n\n[files]\n# This is useful for the case where some master files are used to\n# populate a different NSS mechanism which this workstation uses.\n# directory = /etc\n\n[shadow]\n# This is useful for the case where some master files are used to\n# populate a different NSS mechanism which this workstation uses.\n# directory = /etc\n\n[ldap]\n# Setting these is always necessary.\n# server = ldap\n# basedn = dc=example,dc=com\n\n# Setting these is rarely necessary, since it's usually correct.\n# userBranch = ou=People\n# groupBranch = ou=Group\n\n# Set only if your administrative user uses simple bind operations to\n# connect to the server.\n# binddn = cn=Manager,dc=example,dc=com\n\n# Set this only if the default user (as determined by SASL) is incorrect\n# for SASL bind operations.  Usually, it's correct, so you'll rarely need\n# to set these.\n# user = Manager\n# authuser = Manager\n\n[sasl]\n# Set these only if your sasldb is only used by a particular application, and\n# in a particular domain.  The default (all applications, all domains) is\n# probably correct for most installations.\n# appname = imap\n# domain = EXAMPLE.COM\n"
  },
  {
    "path": "roles/os-harden/templates/etc/login.defs.j2",
    "content": "{{ ansible_managed | comment }}\n\n# Configuration control definitions for the login package.\n#\n# Three items must be defined:  `MAIL_DIR`, `ENV_SUPATH`, and `ENV_PATH`. If unspecified, some arbitrary (and possibly incorrect) value will be assumed.  All other items are optional - if not specified then the described action or option will be inhibited.\n#\n# Comment lines (lines beginning with `#`) and blank lines are ignored.\n#\n#-- Modified for Linux.  --marekm\n\n{% if os_useradd_mail_dir is defined %}\n# *REQUIRED for useradd/userdel/usermod*\n#\n# Directory where mailboxes reside, _or_ name of file, relative to the home directory.  If you _do_ define `MAIL_DIR` and `MAIL_FILE`, `MAIL_DIR` takes precedence.\n# Essentially:\n#\n# * `MAIL_DIR` defines the location of users mail spool files (for mbox use) by appending the username to `MAIL_DIR` as defined below.\n# * `MAIL_FILE` defines the location of the users mail spool files as the fully-qualified filename obtained by prepending the user home directory before `$MAIL_FILE`\n#\n# *NOTE*: This is no more used for setting up users MAIL environment variable which is, starting from shadow 4.0.12-1 in Debian, entirely the job of the pam_mail PAM modules.\n#\n# See default PAM configuration files provided for login, su, etc.\n# This is a temporary situation: setting these variables will soon move to `/etc/default/useradd` and the variables will then be no more supported\nMAIL_DIR          {{ os_useradd_mail_dir }}\n{% endif %}\n\n{% if os_useradd_create_home is defined %}\n# If useradd should create home directories for users by default\nCREATE_HOME       {{ 'yes' if os_useradd_create_home else 'no' }}\n\n{% endif %}\n# Enable logging and display of `/var/log/faillog` login failure info. This option conflicts with the `pam_tally` PAM module.\nFAILLOG_ENAB      yes\n\n# Enable display of unknown usernames when login failures are recorded.\n#\n# *WARNING*: Unknown usernames may become world readable. See #290803 and #298773 for details about how this could become a security concern\nLOG_UNKFAIL_ENAB  no\n\n# Enable logging of successful logins\nLOG_OK_LOGINS     yes\n\n# Enable \"syslog\" logging of su activity - in addition to sulog file logging.\nSYSLOG_SU_ENAB    yes\n\n# Enable \"syslog\" logging of newgrp and sg.\nSYSLOG_SG_ENAB    yes\n\n# If defined, all su activity is logged to this file.\n#SULOG_FILE        /var/log/sulog\n\n# If defined, file which maps tty line to `TERM` environment parameter. Each line of the file is in a format something like \"vt100  tty01\".\n#TTYTYPE_FILE      /etc/ttytype\n\n# If defined, login failures will be logged here in a utmp format last, when invoked as lastb, will read `/var/log/btmp`, so...\nFTMP_FILE         /var/log/btmp\n\n# If defined, the command name to display when running \"su -\".  For # example, if this is defined as \"su\" then a \"ps\" will display the command is \"-su\".  If not defined, then \"ps\" would display the name of the shell actually being run, e.g. something like \"-sh\".\nSU_NAME           su\n\n# If defined, file which inhibits all the usual chatter during the login sequence.  If a full pathname, then hushed mode will be enabled if the user's name or shell are found in the file.  If not a full pathname, then hushed mode will be enabled if the file exists in the user's home directory.\n#HUSHLOGIN_FILE    /etc/hushlogins\nHUSHLOGIN_FILE    .hushlogin\n\n# *REQUIRED*: The default PATH settings, for superuser and normal users. (they are minimal, add the rest in the shell startup files)\nENV_SUPATH        PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV_PATH          PATH=/usr/local/bin:/usr/bin:/bin:{{ os_env_extra_user_paths | join (':') }}\n\n# Terminal permissions\n# --------------------\n\n# Login tty will be assigned this group ownership.\n# If you have a \"write\" program which is \"setgid\" to a special group which owns the terminals, define `TTYGROUP` to the group number and `TTYPERM` to `0620`.  Otherwise leave `TTYGROUP` commented out and assign `TTYPERM` to either `622` or `600`.\nTTYGROUP          tty\n\n# Login tty will be set to this permission.\n# In Debian `/usr/bin/bsd-write` or similar programs are setgid tty. However, the default and recommended value for `TTYPERM` is still `0600` to not allow anyone to write to anyone else console or terminal\n# Users can still allow other people to write them by issuing the `mesg y` command.\nTTYPERM           0600\n\n# Login conf initializations\n# --------------------------\n\n# Terminal ERASE character ('\\010' = backspace). Only used on System V.\nERASECHAR         0177\n\n# Terminal KILL character ('\\025' = CTRL/U). Only used on System V.\nKILLCHAR          025\n\n# The default umask value for `pam_umask` and is used by useradd and newusers to set the mode of the new home directories.\n# If `USERGROUPS_ENAB` is set to `yes`, that will modify this `UMASK` default value for private user groups, i. e. the uid is the same as gid, and username is the same as the primary group name: for these, the user permissions will be used as group permissions, e. g. `022` will become `002`.\n# Prefix these values with `0` to get octal, `0x` to get hexadecimal.\n# `022` is the \"historical\" value in Debian for UMASK\n# `027`, or even `077`, could be considered better for privacy.\nUMASK             {{ os_env_umask }}\n\n# Enable setting of the umask group bits to be the same as owner bits (examples: `022` -> `002`, `077` -> `007`) for non-root users, if the uid is the same as gid, and username is the same as the primary group name.\n# If set to yes, userdel will remove the user´s group if it contains no more members, and useradd will create by default a group with the name of the user.\nUSERGROUPS_ENAB   yes\n\n\n# Password aging controls\n# -----------------------\n\n# Maximum number of days a password may be used.\nPASS_MAX_DAYS     {{ os_auth_pw_max_age }}\n\n# Minimum number of days allowed between password changes.\nPASS_MIN_DAYS     {{ os_auth_pw_min_age }}\n\n# Number of days warning given before a password expires.\nPASS_WARN_AGE     7\n\n# Min/max values for automatic uid selection in useradd\nUID_MIN           {{ os_auth_uid_min }}\nUID_MAX           60000\n# System accounts\nSYS_UID_MIN       {{ os_auth_sys_uid_min }}\nSYS_UID_MAX       {{ os_auth_sys_uid_max }}\n\n# Min/max values for automatic gid selection in groupadd\nGID_MIN           {{ os_auth_gid_min }}\nGID_MAX           60000\n# System accounts\nSYS_GID_MIN       {{ os_auth_sys_gid_min }}\nSYS_GID_MAX       {{ os_auth_sys_gid_max }}\n\n# Max number of login retries if password is bad. This will most likely be overriden by PAM, since the default pam_unix module has it's own built in of 3 retries. However, this is a safe fallback in case you are using an authentication module that does not enforce PAM_MAXTRIES.\nLOGIN_RETRIES     {{ os_auth_retries }}\n\n# Max time in seconds for login\nLOGIN_TIMEOUT     {{ os_auth_timeout }}\n\n# Which fields may be changed by regular users using chfn - use any combination of letters \"frwh\" (full name, room number, work phone, home phone).  If not defined, no changes are allowed.\n# For backward compatibility, \"yes\" = \"rwh\" and \"no\" = \"frwh\".\n{% if os_chfn_restrict %}\nCHFN_RESTRICT     {{ os_chfn_restrict }}\n{% endif %}\n# Should login be allowed if we can't cd to the home directory?\nDEFAULT_HOME      {{ 'yes' if os_auth_allow_homeless else 'no' }}\n\n# If defined, this command is run when removing a user.\n# It should remove any at/cron/print jobs etc. owned by\n# the user to be removed (passed as the first argument).\n#USERDEL_CMD       /usr/sbin/userdel_local\n\n# Instead of the real user shell, the program specified by this parameter will be launched, although its visible name (`argv[0]`) will be the shell's. The program may do whatever it wants (logging, additional authentification, banner, ...) before running the actual shell.\n#FAKE_SHELL        /bin/fakeshell\n\n# If defined, either full pathname of a file containing device names or a \":\" delimited list of device names.  Root logins will be allowed only upon these devices.\n# This variable is used by login and su.\n#CONSOLE           /etc/consoles\n#CONSOLE           console:tty01:tty02:tty03:tty04\n\n# List of groups to add to the user's supplementary group set when logging in on the console (as determined by the `CONSOLE` setting).  Default is none.\n# Use with caution - it is possible for users to gain permanent access to these groups, even when not logged in on the console. How to do it is left as an exercise for the reader...\n# This variable is used by login and su.\n#CONSOLE_GROUPS    floppy:audio:cdrom\n\n# If set to `MD5`, MD5-based algorithm will be used for encrypting password\n# If set to `SHA256`, SHA256-based algorithm will be used for encrypting password\n# If set to `SHA512`, SHA512-based algorithm will be used for encrypting password\n# If set to `DES`, DES-based algorithm will be used for encrypting password (default)\n# Overrides the MD5_CRYPT_ENAB option\n#\n# Note: It is recommended to use a value consistent with\n# the PAM modules configuration.\nMD5_CRYPT_ENAB    no\nENCRYPT_METHOD    SHA512\n\n# Only used if `ENCRYPT_METHOD` is set to `SHA256` or `SHA512`: Define the number of SHA rounds.\n# With a lot of rounds, it is more difficult to brute forcing the password. But note also that it more CPU resources will be needed to authenticate users.\n# If not specified, the libc will choose the default number of rounds (5000). The values must be inside the 1000-999999999 range. If only one of the MIN or MAX values is set, then this value will be used.\n# If MIN > MAX, the highest value will be used.\n#SHA_CRYPT_MIN_ROUNDS    5000\n#SHA_CRYPT_MAX_ROUNDS    5000\n\n\n# Obsoleted by PAM\n# ================\n# These options are now handled by PAM. Please edit the appropriate file in `/etc/pam.d/` to enable the equivelants of them.\n#MOTD_FILE\n#DIALUPS_CHECK_ENAB\n#LASTLOG_ENAB\n#MAIL_CHECK_ENAB\n#OBSCURE_CHECKS_ENAB\n#PORTTIME_CHECKS_ENAB\n#SU_WHEEL_ONLY\n#CRACKLIB_DICTPATH\n#PASS_CHANGE_TRIES\n#PASS_ALWAYS_WARN\n#ENVIRON_FILE\n#NOLOGINS_FILE\n#ISSUE_FILE\n#PASS_MIN_LEN\n#PASS_MAX_LEN\n#ULIMIT\n#ENV_HZ\n#CHFN_AUTH\n#CHSH_AUTH\n#FAIL_DELAY\n\n# Obsoleted\n# =========\n# These options are no more handled by shadow.\n# Shadow utilities will display a warning if they still appear.\n#CLOSE_SESSIONS\n#LOGIN_STRING\n#NO_PASSWORD_CONSOLE\n#QMAIL_DIR\n\n# If set to `yes`, new passwords will be encrypted using the MD5-based algorithm compatible with the one used by recent releases of FreeBSD. It supports passwords of unlimited length and longer salt strings.\n# Set to `no` if you need to copy encrypted passwords to other systems which don't understand the new algorithm.  Default is `no`.\n# This variable is deprecated. You should use ENCRYPT_METHOD.\n#\n#MD5_CRYPT_ENAB no\n"
  },
  {
    "path": "roles/os-harden/templates/etc/modprobe.d/modprobe.j2",
    "content": "{{ ansible_managed | comment }}\n\n{% for fs in os_unused_filesystems | difference(os_filesystem_whitelist) %}\ninstall {{fs}} /bin/true\n{% endfor %}\n"
  },
  {
    "path": "roles/os-harden/templates/etc/pam.d/rhel_system_auth.j2",
    "content": "{{ ansible_managed | comment }}\n\n#%PAM-1.0\n{% if os_auth_retries > 0 %}\nauth        required      pam_tally2.so deny={{ os_auth_retries }} onerr=fail unlock_time={{ os_auth_lockout_time }}\n{% endif %}\nauth        required      pam_env.so\nauth        sufficient    pam_unix.so nullok try_first_pass\nauth        requisite     pam_succeed_if.so uid >= 500 quiet\nauth        required      pam_deny.so\n\n{% if os_auth_retries > 0 %}\naccount     required      pam_tally2.so\n{% endif %}\naccount     required      pam_unix.so\naccount     sufficient    pam_localuser.so\naccount     sufficient    pam_succeed_if.so uid < 500 quiet\naccount     required      pam_permit.so\n\n{% if (os_auth_pam_passwdqc_enable|bool) %}\n  {%- if ((ansible_facts.os_family == 'RedHat' and ansible_facts.distribution_version|int is version('7', '>=')) or ansible_facts.distribution == 'Amazon') %}\npassword    required      pam_pwquality.so {{ os_auth_pam_pwquality_options }}\n  {%- else %}\npassword    requisite     pam_passwdqc.so {{ os_auth_pam_passwdqc_options }}\n  {%- endif %}\n{% else %}\npassword    requisite     pam_cracklib.so try_first_pass retry=3 type=\n{% endif %}\n\n\n# NSA 2.3.3.5 Upgrade Password Hashing Algorithm to SHA-512\n# NSA 2.3.3.6 Limit Password Reuse\npassword    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5\npassword    required      pam_deny.so\n\nsession     optional      pam_keyinit.so revoke\nsession     required      pam_limits.so\nsession     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid\nsession     required      pam_unix.so\n"
  },
  {
    "path": "roles/os-harden/templates/etc/profile.d/profile.conf.j2",
    "content": "{{ ansible_managed | comment }}\n\n# Disable core dumps via soft limits for all users. Compliance to this setting is voluntary and can be modified by users up to a hard limit. This setting is a sane default.\nulimit -S -c 0 > /dev/null 2>&1\n"
  },
  {
    "path": "roles/os-harden/templates/etc/securetty.j2",
    "content": "{{ ansible_managed | comment }}\n\n# A list of TTYs, from which root can log in\n# see `man securetty` for reference\n{{ \"\\n\".join(os_auth_root_ttys) }}\n"
  },
  {
    "path": "roles/os-harden/templates/etc/sysconfig/rhel_sysconfig_init.j2",
    "content": "{{ ansible_managed | comment }}\n\n# color => new RH6.0 bootup\n# verbose => old-style bootup\n# anything else => new style bootup without ANSI colors or positioning\nBOOTUP=color\n# column to start \"[  OK  ]\" label in\nRES_COL=60\n# terminal sequence to move to that column. You could change this\n# to something like \"tput hpa ${RES_COL}\" if your terminal supports it\nMOVE_TO_COL=\"echo -en \\\\033[${RES_COL}G\"\n# terminal sequence to set color to a 'success' color (currently: green)\nSETCOLOR_SUCCESS=\"echo -en \\\\033[0;32m\"\n# terminal sequence to set color to a 'failure' color (currently: red)\nSETCOLOR_FAILURE=\"echo -en \\\\033[0;31m\"\n# terminal sequence to set color to a 'warning' color (currently: yellow)\nSETCOLOR_WARNING=\"echo -en \\\\033[0;33m\"\n# terminal sequence to reset to the default color.\nSETCOLOR_NORMAL=\"echo -en \\\\033[0;39m\"\n# Set to anything other than 'no' to allow hotkey interactive startup...\nPROMPT={{ 'yes' if (os_security_init_prompt|bool) else 'no' }}\n# Set to 'yes' to allow probing for devices with swap signatures\nAUTOSWAP=no\n# What ttys should gettys be started on?\nACTIVE_CONSOLES=/dev/tty[1-6]\n# Set to '/sbin/sulogin' to prompt for password on single-user mode\n# Set to '/sbin/sushell' otherwise\nSINGLE={{ '/sbin/sulogin' if os_security_init_single else '/sbin/sushell' }}\n\n# NSA 2.2.4.1 Set Daemon umask\numask 027\n"
  },
  {
    "path": "roles/os-harden/templates/usr/share/pam-configs/pam_passwdqd.j2",
    "content": "{{ ansible_managed | comment }}\n\nName: passwdqc password strength enforcement\nDefault: yes\nPriority: 1024\nConflicts: cracklib\nPassword-Type: Primary\nPassword:\n  requisite     pam_passwdqc.so {{ os_auth_pam_passwdqc_options }}\n"
  },
  {
    "path": "roles/os-harden/templates/usr/share/pam-configs/pam_tally2.j2",
    "content": "{{ ansible_managed | comment }}\n\nName: tally2 lockout after failed attempts enforcement\nDefault: yes\nPriority: 1024\nConflicts: cracklib\nAuth-Type: Primary\nAuth-Initial:\n  required      pam_tally2.so deny={{ os_auth_retries }} onerr=fail unlock_time={{ os_auth_lockout_time }}\nAccount-Type: Primary\nAccount-Initial:\n  required      pam_tally2.so\n"
  },
  {
    "path": "roles/os-harden/vars/Amazon.yml",
    "content": "---\n# system accounts that do not get their login disabled and pasword changed\nos_always_ignore_users: ['root', 'sync', 'shutdown', 'halt', 'ec2-user']\n\nsysctl_rhel_config:\n  # ExecShield protection against buffer overflows\n  kernel.exec-shield: 1\n  # Syncookies is used to prevent SYN-flooding attacks.\n  net.ipv4.tcp_syncookies: 1\n"
  },
  {
    "path": "roles/os-harden/vars/Archlinux.yml",
    "content": "---\n\nos_nologin_shell_path: '/sbin/nologin'\n\nos_shadow_perms:\n  owner: root\n  group: root\n  mode: '0600'\n\nos_passwd_perms:\n  owner: root\n  group: root\n  mode: '0644'\n\nos_env_umask: '027'\n\nos_auth_uid_min: 1000\nos_auth_gid_min: 1000\nos_auth_sys_uid_min: 500\nos_auth_sys_uid_max: 999\nos_auth_sys_gid_min: 500\nos_auth_sys_gid_max: 999\n\nmodprobe_package: 'kmod'\nauditd_package: 'audit'\n"
  },
  {
    "path": "roles/os-harden/vars/Debian.yml",
    "content": "---\n\nos_packages_pam_ccreds: 'libpam-ccreds'\nos_packages_pam_passwdqc: 'libpam-passwdqc'\nos_packages_pam_cracklib: 'libpam-cracklib'\nos_nologin_shell_path: '/usr/sbin/nologin'\n\n# Different distros use different standards for /etc/shadow perms, e.g.\n# RHEL derivatives use root:root 0000, whereas Debian-based use root:shadow 0640.\n# You must provide key/value pairs for owner, group, and mode if overriding.\nos_shadow_perms:\n  owner: root\n  group: shadow\n  mode: '0640'\n\nos_passwd_perms:\n  owner: root\n  group: root\n  mode: '0644'\n\nos_env_umask: '027'\n\nos_auth_uid_min: 1000\nos_auth_gid_min: 1000\nos_auth_sys_uid_min: 100\nos_auth_sys_uid_max: 999\nos_auth_sys_gid_min: 100\nos_auth_sys_gid_max: 999\n\n# defaults for useradd\nos_useradd_mail_dir: /var/mail\n\nmodprobe_package: 'kmod'\nauditd_package: 'auditd'\n\ntally2_path: '/usr/share/pam-configs/tally2'\npasswdqc_path: '/usr/share/pam-configs/passwdqc'\n"
  },
  {
    "path": "roles/os-harden/vars/Fedora.yml",
    "content": "---\n\nos_packages_pam_ccreds: 'pam_ccreds'\nos_packages_pam_passwdqc: 'pam_passwdqc'\nos_packages_pam_cracklib: 'pam_cracklib'\nos_nologin_shell_path: '/sbin/nologin'\n\n# Different distros use different standards for /etc/shadow perms, e.g.\n# RHEL derivatives use root:root 0000, whereas Debian-based use root:shadow 0640.\n# You must provide key/value pairs for owner, group, and mode if overriding.\nos_shadow_perms:\n  owner: root\n  group: root\n  mode: '0000'\n\nos_passwd_perms:\n  owner: root\n  group: root\n  mode: '0644'\n\nos_env_umask: '027'\n\nos_auth_uid_min: 1000\nos_auth_gid_min: 1000\nos_auth_sys_uid_min: 201\nos_auth_sys_uid_max: 999\nos_auth_sys_gid_min: 201\nos_auth_sys_gid_max: 999\n\nmodprobe_package: 'module-init-tools'\nauditd_package: 'audit'\n"
  },
  {
    "path": "roles/os-harden/vars/Oracle Linux.yml",
    "content": "---\n\nos_packages_pam_ccreds: 'pam_ccreds'\nos_packages_pam_passwdqc: 'pam_passwdqc'\nos_packages_pam_cracklib: 'pam_cracklib'\nos_nologin_shell_path: '/sbin/nologin'\n\n# Different distros use different standards for /etc/shadow perms, e.g.\n# RHEL derivatives use root:root 0000, whereas Debian-based use root:shadow 0640.\n# You must provide key/value pairs for owner, group, and mode if overriding.\nos_shadow_perms:\n  owner: root\n  group: root\n  mode: '0000'\n\nos_passwd_perms:\n  owner: root\n  group: root\n  mode: '0644'\n\nos_env_umask: '077'\n\nos_auth_uid_min: 1000\nos_auth_gid_min: 1000\nos_auth_sys_uid_min: 201\nos_auth_sys_uid_max: 999\nos_auth_sys_gid_min: 201\nos_auth_sys_gid_max: 999\n"
  },
  {
    "path": "roles/os-harden/vars/RedHat-6.yml",
    "content": "---\n\nsysctl_rhel_config:\n  # ExecShield protection against buffer overflows\n  kernel.exec-shield: 1\n  # Syncookies is used to prevent SYN-flooding attacks.\n  net.ipv4.tcp_syncookies: 1\n"
  },
  {
    "path": "roles/os-harden/vars/RedHat.yml",
    "content": "---\n\nos_packages_pam_ccreds: 'pam_ccreds'\nos_packages_pam_passwdqc: 'pam_passwdqc'\nos_packages_pam_cracklib: 'pam_cracklib'\nos_nologin_shell_path: '/sbin/nologin'\n\n# Different distros use different standards for /etc/shadow perms, e.g.\n# RHEL derivatives use root:root 0000, whereas Debian-based use root:shadow 0640.\n# You must provide key/value pairs for owner, group, and mode if overriding.\nos_shadow_perms:\n  owner: root\n  group: root\n  mode: '0000'\n\nos_passwd_perms:\n  owner: root\n  group: root\n  mode: '0644'\n\nos_env_umask: '077'\n\nos_auth_uid_min: 1000\nos_auth_gid_min: 1000\nos_auth_sys_uid_min: 201\nos_auth_sys_uid_max: 999\nos_auth_sys_gid_min: 201\nos_auth_sys_gid_max: 999\n\n# defaults for useradd\nos_useradd_mail_dir: /var/spool/mail\nos_useradd_create_home: true\n\nmodprobe_package: 'module-init-tools'\nauditd_package: 'audit'\n"
  },
  {
    "path": "roles/os-harden/vars/Suse.yml",
    "content": "---\n\nos_packages_pam_ccreds: 'pam_ccreds'\nos_packages_pam_passwdqc: 'pam_passwdqc'\nos_packages_pam_cracklib: 'cracklib'\nos_nologin_shell_path: '/sbin/nologin'\n\n# Different distros use different standards for /etc/shadow perms, e.g.\n# RHEL derivatives use root:root 0000, whereas Debian-based use root:shadow 0640.\n# You must provide key/value pairs for owner, group, and mode if overriding.\nos_shadow_perms:\n  owner: root\n  group: shadow\n  mode: '0640'\n\nos_passwd_perms:\n  owner: root\n  group: root\n  mode: '0644'\n\nos_env_umask: '027'\n\nos_auth_uid_min: 1000\nos_auth_gid_min: 1000\nos_auth_sys_uid_min: 100\nos_auth_sys_uid_max: 499\nos_auth_sys_gid_min: 100\nos_auth_sys_gid_max: 499\n\n# defaults for useradd\nos_useradd_create_home: false\n\nmodprobe_package: 'kmod-compat'\nauditd_package: 'audit'\n"
  },
  {
    "path": "roles/os-harden/vars/main.yml",
    "content": "---\n# SYSTEM CONFIGURATION\n# ====================\n# These are not meant to be modified by the user\n\n# suid and sgid blacklists and whitelists\n# ---------------------------------------\n# don't change values in the system_blacklist/whitelist\n# adjust values for blacklist/whitelist instead, they can override system_blacklist/whitelist\n\n# list of suid/sgid entries that must be removed\nos_security_suid_sgid_system_blacklist:\n  # blacklist as provided by NSA\n  - '/usr/bin/rcp'\n  - '/usr/bin/rlogin'\n  - '/usr/bin/rsh'\n  # sshd must not use host-based authentication (see ssh cookbook)\n  - '/usr/libexec/openssh/ssh-keysign'\n  - '/usr/lib/openssh/ssh-keysign'\n  # misc others\n  - '/sbin/netreport'                                            # not normally required for user\n  - '/usr/sbin/usernetctl'                                       # modify interfaces via functional accounts\n  # connecting to ...\n  - '/usr/sbin/userisdnctl'                                      # no isdn...\n  - '/usr/sbin/pppd'                                             # no ppp / dsl ...\n  # lockfile\n  - '/usr/bin/lockfile'\n  - '/usr/bin/mail-lock'\n  - '/usr/bin/mail-unlock'\n  - '/usr/bin/mail-touchlock'\n  - '/usr/bin/dotlockfile'\n  # need more investigation blacklist for now\n  - '/usr/bin/arping'\n  - '/usr/sbin/uuidd'\n  - '/usr/bin/mtr'                                               # investigate current state...\n  - '/usr/lib/evolution/camel-lock-helper-1.2'                   # investigate current state...\n  - '/usr/lib/pt_chown'                                          # pseudo-tty needed?\n  - '/usr/lib/eject/dmcrypt-get-device'\n  - '/usr/lib/mc/cons.saver'                                      # midnight commander screensaver\n\n# list of suid/sgid entries that can remain untouched\nos_security_suid_sgid_system_whitelist:\n  # whitelist as provided by NSA\n  - '/bin/mount'\n  - '/bin/ping'\n  - '/bin/su'\n  - '/usr/bin/su'\n  - '/bin/umount'\n  - '/sbin/pam_timestamp_check'\n  - '/sbin/unix_chkpwd'\n  - '/usr/bin/at'\n  - '/usr/bin/gpasswd'\n  - '/usr/bin/locate'\n  - '/usr/bin/newgrp'\n  - '/usr/bin/passwd'\n  - '/usr/bin/ssh-agent'\n  - '/usr/libexec/utempter/utempter'\n  - '/usr/sbin/lockdev'\n  - '/usr/sbin/sendmail.sendmail'\n  - '/usr/bin/expiry'\n  # whitelist ipv6\n  - '/bin/ping6'\n  - '/usr/bin/traceroute6.iputils'\n  # whitelist nfs\n  - '/sbin/mount.nfs'\n  - '/sbin/umount.nfs'\n  # whitelist nfs4\n  - '/sbin/mount.nfs4'\n  - '/sbin/umount.nfs4'\n  # whitelist cron\n  - '/usr/bin/crontab'\n  # whitelist consolemssaging\n  - '/usr/bin/wall'\n  - '/usr/bin/write'\n  # whitelist: only SGID with utmp group for multi-session access\n  # impact is limited; installation/usage has some remaining risk\n  - '/usr/bin/screen'\n  # whitelist locate\n  - '/usr/bin/mlocate'\n  # whitelist usermanagement\n  - '/usr/bin/chage'\n  - '/usr/bin/chfn'\n  - '/usr/bin/chsh'\n  # whitelist fuse\n  - '/bin/fusermount'\n  # whitelist pkexec\n  - '/usr/bin/pkexec'\n  # whitelist sudo\n  - '/usr/bin/sudo'\n  - '/usr/bin/sudoedit'\n  # whitelist postfix\n  - '/usr/sbin/postdrop'\n  - '/usr/sbin/postqueue'\n  # whitelist apache\n  - '/usr/sbin/suexec'\n  # whitelist squid\n  - '/usr/lib/squid/ncsa_auth'\n  - '/usr/lib/squid/pam_auth'\n  # whitelist kerberos\n  - '/usr/kerberos/bin/ksu'\n  # whitelist pam_caching\n  - '/usr/sbin/ccreds_validate'\n  # whitelist Xorg\n  - '/usr/bin/Xorg'                                              # xorg\n  - '/usr/bin/X'                                                 # xorg\n  - '/usr/lib/dbus-1.0/dbus-daemon-launch-helper'                # freedesktop ipc\n  - '/usr/lib/vte/gnome-pty-helper'                              # gnome\n  - '/usr/lib/libvte9/gnome-pty-helper'                          # gnome\n  - '/usr/lib/libvte-2.90-9/gnome-pty-helper'                     # gnome\n\n# system accounts that do not get their login disabled and pasword changed\nos_always_ignore_users: ['root', 'sync', 'shutdown', 'halt']\n"
  },
  {
    "path": "roles/prepare/files/sctp.conf",
    "content": "# put sctp into blacklist\ninstall sctp /bin/true\n"
  },
  {
    "path": "roles/prepare/tasks/common.yml",
    "content": "# 禁用系统swap\n- name: 禁用系统 swap\n  shell: \"source /etc/profile; swapoff -a && sysctl -w vm.swappiness=0\"\n  ignore_errors: true\n\n- name: 删除fstab swap 相关配置\n  lineinfile:\n    path: /etc/fstab\n    regexp: 'swap'\n    state: absent\n    backup: 'yes'\n\n- name: 加载内核模块\n  modprobe: name={{ item }} state=present\n  with_items:\n    - br_netfilter\n    - dm_snapshot\n    - dm_thin_pool\n    - ip_vs\n    - ip_vs_rr\n    - ip_vs_wrr\n    - ip_vs_sh\n    - nf_conntrack\n  ignore_errors: true\n\n- name: 尝试加载nf_conntrack_ipv4\n  shell: 'modprobe nf_conntrack_ipv4 || echo \"NoFound\"'\n  register: NF_CONNTRACK_IPV4\n\n- name: 启用systemd自动加载模块服务\n  service: name=systemd-modules-load enabled=yes\n\n- name: 增加内核模块开机加载配置\n  template: src=10-k8s-modules.conf.j2 dest=/etc/modules-load.d/10-k8s-modules.conf\n\n# 设置系统参数for k8s\n# 消除docker info 警告WARNING: bridge-nf-call-ip[6]tables is disabled\n# https://success.docker.com/article/ipvs-connection-timeout-issue 缩短keepalive_time超时时间为600s\n- name: 设置系统参数\n  template: src=95-k8s-sysctl.conf.j2 dest=/etc/sysctl.d/95-k8s-sysctl.conf\n\n- name: 查看是否需要设置 fs.may_detach_mounts\n  stat:\n    path: /proc/sys/fs/may_detach_mounts\n    get_attributes: no\n    get_checksum: no\n    get_mime: no\n  register: fs_may_detach_mounts\n  ignore_errors: true\n\n- name: 当需要时，设置 fs.may_detach_mounts 为 1\n  sysctl:\n    sysctl_file: \"/etc/sysctl.d/95-k8s-sysctl.conf\"\n    name: fs.may_detach_mounts\n    value: 1\n    state: present\n    reload: yes\n  when: fs_may_detach_mounts.stat.exists|bool\n\n- name: 查看是否需要设置 net.ipv4.tcp_tw_recycle\n  stat:\n    path: /proc/sys/net/ipv4/tcp_tw_recycle\n  register: tcp_tw_recycle\n  ignore_errors: true\n\n- name: 设置tcp_tw_recycle\n  sysctl:\n    sysctl_file: \"/etc/sysctl.d/95-k8s-sysctl.conf\"\n    name: net.ipv4.tcp_tw_recycle\n    value: 0\n    state: present\n    reload: yes\n  when: tcp_tw_recycle.stat.exists|bool\n\n- name: 生效系统参数\n  shell: \"source /etc/profile; sysctl -p /etc/sysctl.d/95-k8s-sysctl.conf\"\n  ignore_errors: true\n\n# 设置系统 ulimits\n- name: 创建 systemd 配置目录\n  file: name=/etc/systemd/system.conf.d state=directory  \n\n- name: 设置系统 ulimits\n  template: src=30-k8s-ulimits.conf.j2 dest=/etc/systemd/system.conf.d/30-k8s-ulimits.conf\n\n- name: 把SCTP列入内核模块黑名单\n  copy: src=sctp.conf dest=/etc/modprobe.d/sctp.conf\n"
  },
  {
    "path": "roles/prepare/tasks/debian.yml",
    "content": "# 系统基础软件环境\n- name: apt更新缓存刷新\n  apt: update_cache=yes cache_valid_time=72000\n  ignore_errors: true\n  when: 'INSTALL_SOURCE != \"offline\"'\n\n# 删除默认安装\n- name: 删除ubuntu默认安装\n  package:\n    name:\n      - ufw\n      - lxd\n      - lxcfs\n      - lxc-common\n    state: absent\n  ignore_errors: true\n\n# 安装基础软件包\n- name: 安装 ubuntu/debian基础软件\n  package: \n    name:\n      - bash-completion     # bash命令补全工具，需要重新登录服务器生效\n      - conntrack           # network connection cleanup 用到\n      - ipset               # ipvs 模式需要\n      - ipvsadm             # ipvs 模式需要\n      - jq                  # 轻量JSON处理程序，安装docker查询镜像需要\n      - libseccomp2         # 安装containerd需要\n      - lvm2                # 安装Local PV LVM 存储插件需要\n      - nfs-common          # 挂载nfs 共享文件需要 (创建基于 nfs的PV 需要)\n      - psmisc              # 安装psmisc 才能使用命令killall，keepalive的监测脚本需要\n      - rsync               # 文件同步工具，分发证书等配置文件需要\n      - socat               # 用于port forwarding\n    state: present\n  when: 'INSTALL_SOURCE != \"offline\"'\n\n# 离线安装基础软件包\n- import_tasks: offline.yml\n  when: 'INSTALL_SOURCE == \"offline\"'\n\n# 优化设置 journal 日志相关，避免日志重复搜集，浪费系统资源\n- name: 准备 journal 日志相关目录\n  file: name={{ item }} state=directory\n  with_items:\n  - \"/etc/systemd/journald.conf.d\"\n  - \"/var/log/journal\"\n\n- name: 优化设置 journal 日志\n  template: src=95-k8s-journald.conf.j2 dest=/etc/systemd/journald.conf.d/95-k8s-journald.conf\n\n- name: 重启 journald 服务\n  service: name=systemd-journald state=restarted\n"
  },
  {
    "path": "roles/prepare/tasks/main.yml",
    "content": "## 读取prepare_tasks文件是否存在，已经存在的话不需要再次执行prepare task\n- name: 读取prepare_tasks\n  stat: path=\"/opt/kubeasz_prepare_tasks\"\n  register: p\n\n- name: 已完成提示\n  debug:\n    msg: \"节点已完成prepare_tasks，跳过\"  \n  when: p.stat.isreg is defined\n  \n- block:\n    - import_tasks: debian.yml\n      when: 'ansible_distribution_file_variety in [\"Debian\"]'\n    \n    - import_tasks: redhat.yml\n      # when: 'ansible_distribution_file_variety in [\"RedHat\"]'\n      when: ansible_distribution_file_variety in [\"RedHat\"] or ansible_distribution in [\"CentOS\"]\n    \n    - import_tasks: suse.yml\n      when: 'ansible_distribution_file_variety in [\"SUSE\"]'\n    \n    - import_tasks: redhat.yml\n      when: 'ansible_distribution in [\"Anolis OS\", \"openEuler\", \"Kylin Linux Advanced Server\"]'\n    \n    # 公共系统参数设置\n    - import_tasks: common.yml\n    \n    - name: prepare some dirs\n      file: name={{ item }} state=directory\n      with_items:\n      - \"{{ bin_dir }}\"\n      - \"{{ ca_dir }}\"\n      - /root/.kube\n    \n    - name: 复制kubectl kubeconfig\n      copy: src={{ cluster_dir }}/kubectl.kubeconfig dest=/root/.kube/config\n      when: \"inventory_hostname in groups['kube_master'] or inventory_hostname in groups['kube_node']\"\n    \n    - name: 写入环境变量$PATH\n      lineinfile:\n        dest: ~/.bashrc\n        state: present\n        regexp: 'custom PATH'\n        line: 'export PATH={{ bin_dir }}:$PATH  # generated by kubeasz:custom PATH'\n    \n    - name: ansible 控制端写入命令别名\n      lineinfile:\n        dest: ~/.bashrc\n        state: present\n        regexp: 'docker exec'\n        line: \"alias dk='docker exec -it kubeasz'  # generated by kubeasz\"\n      when: \"inventory_hostname == ansible_env.SSH_CLIENT.split(' ')[0]\"\n    \n    - name: 添加 local registry hosts 解析\n      lineinfile:\n        dest: /etc/hosts\n        state: present\n        regexp: 'easzlab.io.local'\n        line: \"{{ ansible_env.SSH_CLIENT.split(' ')[0] }}    easzlab.io.local\"\n    \n    # 设置节点hostname，calico 网络组件要求每个节点不一样的hostname\n    - name: 设置节点 hostname\n      hostname:\n        name: \"{{ K8S_NODENAME }}\"\n        use: systemd\n      when: \"ENABLE_SETTING_HOSTNAME|bool\"\n    \n    # 设置节点名称{{ K8S_NODENAME }} /etc/hosts 解析\n    # 1.先确保第一个主节点做好解析\n    - name: 设置 k8s_nodename 在 master[0] 节点 /etc/hosts 地址解析\n      lineinfile:\n        dest: /etc/hosts\n        state: present\n        regexp: \"{{ K8S_NODENAME }} .* generated by kubeasz\"\n        line: \"{{ inventory_hostname }}    {{ K8S_NODENAME }} # generated by kubeasz\"\n      delegate_to: \"{{ groups.kube_master[0] }}\"\n      when: \"inventory_hostname != K8S_NODENAME\"\n      tags: set_hosts\n    \n    # 2.然后复制给集群所有节点\n    - block:\n      - name: 获取 master[0] 节点由kubeasz 创建的 /etc/hosts 地址解析\n        shell: 'grep \"generated by kubeasz\" /etc/hosts|sort|uniq'\n        register: RESOLVE_K8S_NODENAME\n        delegate_to: \"{{ groups.kube_master[0] }}\"\n    \n      - name: 删除 master[0] 节点由kubeasz 创建的 /etc/hosts 地址解析\n        lineinfile:\n          dest: /etc/hosts\n          state: absent\n          regexp: \"generated by kubeasz\"\n        delegate_to: \"{{ groups.kube_master[0] }}\"\n    \n      - name: 设置 k8s_nodename 在所有节点的 /etc/hosts 地址解析\n        blockinfile:\n          path: /etc/hosts\n          block: |\n            {{ RESOLVE_K8S_NODENAME.stdout }}\n          marker: \"### {mark} KUBEASZ MANAGED BLOCK\"\n        delegate_to: \"{{ item }}\"\n        with_items: [\"{{ groups.kube_master }}\", \"{{ groups.kube_node }}\"]\n      run_once: true\n      tags: set_hosts\n\n    ## 最后标记该节点已经完成prepare_tasks\n    - name: 设置prepare_tasks文件\n      shell: \"echo done > /opt/kubeasz_prepare_tasks\"\n  when: p.stat.isreg is not defined\n"
  },
  {
    "path": "roles/prepare/tasks/offline.yml",
    "content": "# 离线安装基础系统包\n# 仅当机器无法从本地yum/apt源安装时使用\n# 执行前需要预先运行类似 ./ezdown -P debian_10 下载离线安装包\n\n- name: 检查是否已下载离线软件包{{ SYS_PKG_NAME }}\n  stat:\n    path: \"{{ base_dir }}/down/packages/{{ SYS_PKG_NAME }}\"\n  register: pkg\n  connection: local\n  run_once: true\n\n- name: 准备离线安装包目录\n  file: name=/opt/kube/packages/basic state=directory\n\n- block:\n  - name: 分发离线软件包{{ SYS_PKG_NAME }}\n    copy:\n      src: \"{{ base_dir }}/down/packages/{{ SYS_PKG_NAME }}\"\n      dest: \"/opt/kube/packages/basic/{{ SYS_PKG_NAME }}\"\n\n  # 离线安装包可能需要安装多次才能成功\n  - name: 安装离线软件包{{ SYS_PKG_NAME }}\n    shell: 'cd /opt/kube/packages/basic && tar zxf {{ SYS_PKG_NAME }} && \\\n           dpkg -i *.deb > /tmp/install_basic.log 2>&1'\n    register: install_info\n    until: not install_info.failed\n    retries: 3\n    delay: 1\n    when: 'ansible_distribution_file_variety in [\"Debian\"]'\n\n  - name: 安装离线软件包{{ SYS_PKG_NAME }}\n    shell: 'cd /opt/kube/packages/basic && tar zxf {{ SYS_PKG_NAME }} && \\\n           rpm -Uvh --force --nodeps *.rpm > /tmp/install_basic.log 2>&1'\n    when: 'ansible_distribution_file_variety in [\"RedHat\", \"SUSE\"]'\n  when: 'pkg.stat.exists|bool'\n  ignore_errors: true\n"
  },
  {
    "path": "roles/prepare/tasks/redhat.yml",
    "content": "# 检查dnf是否可用，优先使用dnf安装包\n- name: 检查dnf可执行文件是否存在\n  command: 'command -v dnf'\n  register: dnf_check\n  ignore_errors: yes\n  changed_when: false\n\n#- name: debug info\n#  debug: var=\"dnf_check\"\n\n- name: dnf删除centos/redhat默认安装\n  dnf:\n    name:\n      - firewalld\n      - python-firewall\n      - firewalld-filesystem\n    state: absent\n  ignore_errors: true\n  when: dnf_check.rc == 0\n\n- name: dnf安装基础软件包\n  dnf:\n    name:\n      - bash-completion     # bash命令补全工具，需要重新登录服务器生效\n      - conntrack-tools     # ipvs 模式需要\n      - ipset               # ipvs 模式需要\n      - ipvsadm             # ipvs 模式需要\n      - libseccomp          # 安装containerd需要\n      - lvm2                # 安装Local PV LVM 存储插件需要\n      - nfs-utils           # 挂载nfs 共享文件需要 (创建基于 nfs的PV 需要)\n      - psmisc              # 安装psmisc 才能使用命令killall，keepalive的监测脚本需要\n      - rsync               # 文件同步工具，分发证书等配置文件需要\n      - socat               # 用于port forwarding\n    state: present\n  when:\n    - dnf_check.rc == 0\n    - 'INSTALL_SOURCE != \"offline\"'\n\n- name: 删除centos/redhat默认安装\n  package:\n    name:\n      - firewalld\n      - python-firewall\n      - firewalld-filesystem\n    state: absent\n  ignore_errors: true\n  when: dnf_check.rc != 0\n\n- name: 安装基础软件包\n  package:\n    name:\n      - bash-completion     # bash命令补全工具，需要重新登录服务器生效\n      - conntrack-tools     # ipvs 模式需要\n      - ipset               # ipvs 模式需要\n      - ipvsadm             # ipvs 模式需要\n      - libseccomp          # 安装containerd需要\n      - lvm2                # 安装Local PV LVM 存储插件需要\n      - nfs-utils           # 挂载nfs 共享文件需要 (创建基于 nfs的PV 需要)\n      - psmisc              # 安装psmisc 才能使用命令killall，keepalive的监测脚本需要\n      - rsync               # 文件同步工具，分发证书等配置文件需要\n      - socat               # 用于port forwarding\n    state: present\n  when:\n    - dnf_check.rc != 0\n    - 'INSTALL_SOURCE != \"offline\"'\n\n# 离线安装基础软件包\n- import_tasks: offline.yml\n  when: 'INSTALL_SOURCE == \"offline\"'\n\n- name: 临时关闭 selinux\n  shell: \"setenforce 0\"\n  failed_when: false\n\n# 部分系统没有文件/etc/selinux/config\n- name: 检查文件/etc/selinux/config\n  stat: path=\"/etc/selinux/config\"\n  register: se\n\n- name: 永久关闭 selinux\n  lineinfile:\n    dest: /etc/selinux/config\n    regexp: \"^SELINUX=\"\n    line: \"SELINUX=disabled\"\n  ignore_errors: true\n  when: se.stat.isreg is defined\n\n- name: 永久关闭 selinux\n  shell: \"echo 'SELINUX=disabled' > /etc/selinux/config && \\\n          echo 'SELINUXTYPE=targeted' >> /etc/selinux/config\"\n  when: se.stat.isreg is not defined\n\n# 优化设置 journal 日志相关，避免日志重复搜集，浪费系统资源\n- name: 禁止rsyslog获取journald日志1\n  lineinfile:\n    dest: /etc/rsyslog.conf\n    state: present\n    regexp: 'ModLoad imjournal'\n    line: '#$ModLoad imjournal # provides access to the systemd journal'\n  ignore_errors: true\n\n- name: 禁止rsyslog获取journald日志2\n  lineinfile:\n    dest: /etc/rsyslog.conf\n    state: present\n    regexp: 'IMJournalStateFile'\n    line: '#$IMJournalStateFile imjournal.state'\n  ignore_errors: true\n\n- name: 重启rsyslog服务\n  service: name=rsyslog state=restarted\n  ignore_errors: true\n"
  },
  {
    "path": "roles/prepare/tasks/suse.yml",
    "content": "- name: 安装基础软件包\n  package: \n    name:\n      - bash-completion     # bash命令补全工具，需要重新登录服务器生效\n      - conntrack-tools     # ipvs 模式需要\n      - ipset               # ipvs 模式需要\n      - ipvsadm             # ipvs 模式需要\n      - libseccomp2         # 安装containerd需要\n      - lvm2                # 安装Local PV LVM 存储插件需要\n      - nfs-client          # 挂载nfs 共享文件需要 (创建基于 nfs的PV 需要)\n      - psmisc              # 安装psmisc 才能使用命令killall，keepalive的监测脚本需要\n      - rsync               # 文件同步工具，分发证书等配置文件需要\n      - socat               # 用于port forwarding\n    state: present\n  when: 'INSTALL_SOURCE != \"offline\"'\n\n# 离线安装基础软件包\n- import_tasks: offline.yml\n  when: 'INSTALL_SOURCE == \"offline\"'\n"
  },
  {
    "path": "roles/prepare/templates/10-k8s-modules.conf.j2",
    "content": "br_netfilter\ndm_snapshot\ndm_thin_pool\nip_vs\nip_vs_rr\nip_vs_wrr\nip_vs_sh\nnf_conntrack\n{% if 'NoFound' not in NF_CONNTRACK_IPV4.stdout %}\nnf_conntrack_ipv4\n{% endif %}\n"
  },
  {
    "path": "roles/prepare/templates/30-k8s-ulimits.conf.j2",
    "content": "[Manager]\nDefaultLimitCORE=infinity\nDefaultLimitNOFILE=100000\nDefaultLimitNPROC=100000\n"
  },
  {
    "path": "roles/prepare/templates/95-k8s-journald.conf.j2",
    "content": "[Journal]\n# 持久化保存到磁盘\nStorage=persistent\n\n# 最大占用空间 2G\nSystemMaxUse=2G\n\n# 单日志文件最大 200M\nSystemMaxFileSize=200M\n\n# 日志保存时间 2 周\nMaxRetentionSec=2week\n\n# 禁止转发\nForwardToSyslog=no\nForwardToWall=no\n"
  },
  {
    "path": "roles/prepare/templates/95-k8s-sysctl.conf.j2",
    "content": "## 网络优化\n# 启用 IPv4 数据包转发（CNI 网络插件如 Calico/Cilium 依赖）\nnet.ipv4.ip_forward = 1\nnet.ipv4.tcp_tw_reuse = 2\nnet.ipv4.tcp_timestamps = 1\nnet.ipv4.tcp_fin_timeout = 30\n# 增大 TCP 全连接队列长度（防止 SYN 洪水攻击导致连接丢弃）\nnet.core.somaxconn = 65535\n# 提高网络接口接收数据包队列长度（应对突发流量）\nnet.core.netdev_max_backlog = 65536\n# 增加 SYN 半连接队列长度（防 SYN Flood）\nnet.ipv4.tcp_max_syn_backlog = 65536\nnet.ipv4.tcp_rmem = 4096 12582912 16777216\nnet.ipv4.tcp_wmem = 4096 12582912 16777216\nnet.netfilter.nf_conntrack_max = 1048576\n{% if PROXY_MODE == \"ipvs\" %}\nnet.ipv4.tcp_keepalive_time = 600\nnet.ipv4.tcp_keepalive_intvl = 30\nnet.ipv4.tcp_keepalive_probes = 10\n{% endif %}\n\n# 文件系统\nfs.file-max = 2097152\nfs.inotify.max_user_instances = 8192\nfs.inotify.max_user_watches = 524288\n\n# 内存管理\nvm.swappiness = 0\nvm.max_map_count = 262144\nvm.overcommit_memory = 1\nvm.panic_on_oom = 0\nkernel.panic = 10\n\n# 容器支持\nkernel.pid_max = 4194304\n# 让桥接流量经过 iptables（Service 网络和网络策略生效的关键）\nnet.bridge.bridge-nf-call-iptables = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-arptables = 1\n\n# Kubernetes 要求\nnet.ipv4.conf.all.rp_filter = 0\nnet.ipv4.conf.default.rp_filter = 0\nkernel.softlockup_panic = 1\n"
  },
  {
    "path": "roles/prepare/vars/main.yml",
    "content": "# 离线软件包名\n\nSYS_PKG_NAME: \"{{ ansible_distribution|lower|replace(' ', '_') }}_{{ ansible_distribution_major_version }}.tgz\"\n"
  },
  {
    "path": "tools/imgutil.sh",
    "content": "#!/bin/bash\n#------------------------------------------------------------\n# - Save docker images to disk or load images from disk\n#\n# @author:  gjmzj\n# @usage:   ./imgutil.sh <image_repository>\n# @ref:     https://github.com/easzlab/kubeasz/tree/master/tools/imgutils\n\nset -o nounset\nset -o errexit\n#set -o xtrace\n\nfunction logger() {\n  TIMESTAMP=$(date +'%Y-%m-%d %H:%M:%S')\n  local FNAME=$(basename \"${BASH_SOURCE[1]}\")\n  local SOURCE=\"\\033[36m[$FNAME:${BASH_LINENO[0]}]\\033[0m\"\n  case \"$1\" in\n    debug)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[36mDEBUG $2\\033[0m\"\n      ;;\n    info)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[32mINFO $2\\033[0m\"\n      ;;\n    warn)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[33mWARN $2\\033[0m\"\n      ;;\n    error)\n      echo -e \"\\033[36m$TIMESTAMP\\033[0m $SOURCE \\033[31mERROR $2\\033[0m\"\n      ;;\n    *) ;;\n  esac\n}\n\nfunction pull_and_push_images(){\n  NS=\"easzlab\"\n  [ \"$#\" -eq 1 ] && NS=\"$1\"\n  for item in \"${IMAGES[@]}\"; do\n    image_part=\"${item##*/}\"\n    image_name=\"${image_part%:*}\"\n    image_tag=\"${image_part##*:}\"\n    image_file=\"$imageDir/${image_name}_${image_tag}.tar\"\n    if [[ ! -f \"$image_file\" ]];then\n      docker pull \"$item\" && \\\n      docker save -o \"$image_file\" \"$item\" || \\\n      { logger error \"download $item failed!\"; return 1; }\n    else\n      docker load -i \"$image_file\"\n    fi\n    docker tag \"$item\" \"easzlab.io.local:5000/${NS}/${image_part}\"\n    docker push \"easzlab.io.local:5000/${NS}/${image_part}\" || \\\n    { logger error \"push easzlab.io.local:5000/${NS}/${image_part} failed!\"; return 1; }\n  done\n}\n\nfunction main() {\n  # 检查是否传入参数\n  if [ $# -ne 1 ]; then\n    echo \"Usage: ./imgutil.sh <image_repository>\"\n    echo \"Example: ./imgutil.sh docker.io/library/nginx:alpine\"\n    exit 1\n  fi\n\n  # 可以设置 IMAGE_DIR 环境变量\n  imageDir=${IMAGE_DIR:=/etc/kubeasz/down}\n\n  IMAGES=(\\\n          \"$1\" \\\n        )\n\n  pull_and_push_images\n}\n\nmain \"$@\"\n"
  },
  {
    "path": "tools/kubectl-node_shell",
    "content": "#!/usr/bin/env sh\n# from: https://github.com/kvaps/kubectl-node-shell\n\nset -e\n\nkubectl=kubectl\nversion=1.5.5\ngenerator=\"\"\nnode=\"\"\nnodefaultctx=0\nnodefaultns=0\ncmd='[ \"nsenter\", \"--target\", \"1\", \"--mount\", \"--uts\", \"--ipc\", \"--net\", \"--pid\", \"--\"'\n# If this has a terminal for STDIN\nif [ -t 0 ]; then\n  tty=true\nelse\n  tty=false\nfi\nwhile [ $# -gt 0 ]; do\n  key=\"$1\"\n\n  case $key in\n  -v | --version)\n    echo \"kubectl-node-shell $version\"\n    exit 0\n    ;;\n  --context)\n    nodefaultctx=1\n    kubectl=\"$kubectl --context $2\"\n    shift\n    shift\n    ;;\n  --kubecontext=*)\n    nodefaultctx=1\n    kubectl=\"$kubectl --context=${key##*=}\"\n    shift\n    ;;\n  --kubeconfig)\n    kubectl=\"$kubectl --kubeconfig $2\"\n    shift\n    shift\n    ;;\n  --kubeconfig=*)\n    kubectl=\"$kubectl --kubeconfig=${key##*=}\"\n    shift\n    ;;\n  -n | --namespace)\n    nodefaultns=1\n    kubectl=\"$kubectl --namespace $2\"\n    shift\n    shift\n    ;;\n  --namespace=*)\n    nodefaultns=1\n    kubectl=\"$kubectl --namespace=${key##*=}\"\n    shift\n    ;;\n  --)\n    shift\n    break\n    ;;\n  *)\n    if [ -z \"$node\" ]; then\n      node=\"${1#node/}\"\n      shift\n    else\n      echo \"exactly one node required\"\n      exit 1\n    fi\n    ;;\n  esac\ndone\n\n# Set the default context and namespace to avoid situations where the user switch them during the build process\n[ \"$nodefaultctx\" = 1 ] || kubectl=\"$kubectl --context=$(${kubectl} config current-context)\"\n[ \"$nodefaultns\" = 1 ] || kubectl=\"$kubectl --namespace=$(${kubectl} config view --minify --output 'jsonpath={.contexts..namespace}')\"\n\nif [ $# -gt 0 ]; then\n  while [ $# -gt 0 ]; do\n    cmd=\"$cmd, \\\"$(echo \"$1\" | \\\n      awk '{gsub(/[\"\\\\]/,\"\\\\\\\\&\");gsub(/\\x1b/,\"\\\\u001b\");printf \"%s\",last;last=$0\"\\\\n\"} END{print $0}' \\\n    )\\\"\"\n    shift\n  done\n  cmd=\"$cmd ]\"\nelse\n  cmd=\"$cmd, \\\"bash\\\", \\\"-l\\\" ]\"\nfi\n\nif [ -z \"$node\" ]; then\n  echo \"Please specify node name\"\n  exit 1\nfi\n\nimage=\"${KUBECTL_NODE_SHELL_IMAGE:-docker.io/library/alpine}\"\npod=\"nsenter-$(env LC_ALL=C tr -dc a-z0-9 </dev/urandom | head -c 6)\"\n\n# Check the node\n$kubectl get node \"$node\" >/dev/null || exit 1\n\ncontainer_cpu=\"${KUBECTL_NODE_SHELL_POD_CPU:-100m}\"\ncontainer_memory=\"${KUBECTL_NODE_SHELL_POD_MEMORY:-256Mi}\"\nlabels=\"${KUBECTL_NODE_SHELL_LABELS}\"\n\noverrides=\"$(\n  cat <<EOT\n{\n  \"spec\": {\n    \"nodeName\": \"$node\",\n    \"hostPID\": true,\n    \"hostNetwork\": true,\n    \"containers\": [\n      {\n        \"securityContext\": {\n          \"privileged\": true\n        },\n        \"image\": \"$image\",\n        \"name\": \"nsenter\",\n        \"stdin\": true,\n        \"stdinOnce\": true,\n        \"tty\": $tty,\n        \"command\": $cmd,\n        \"resources\": {\n          \"limits\": {\n            \"cpu\": \"${container_cpu}\",\n            \"memory\": \"${container_memory}\"\n          },\n          \"requests\": {\n            \"cpu\": \"${container_cpu}\",\n            \"memory\": \"${container_memory}\"\n          }\n        }\n      }\n    ],\n    \"tolerations\": [\n      {\n        \"key\": \"CriticalAddonsOnly\",\n        \"operator\": \"Exists\"\n      },\n      {\n        \"effect\": \"NoExecute\",\n        \"operator\": \"Exists\"\n      }\n    ]\n  }\n}\nEOT\n)\"\n\n# Support Kubectl <1.18\nm=$(kubectl version --client -o yaml | awk -F'[ :\"]+' '$2 == \"minor\" {print $3+0}')\nif [ \"$m\" -lt 18 ]; then\n  generator=\"--generator=run-pod/v1\"\nfi\n\ntrap \"EC=\\$?; $kubectl delete pod --wait=false $pod >&2 || true; exit \\$EC\" EXIT INT TERM\n\necho \"spawning \\\"$pod\\\" on \\\"$node\\\"\" >&2\n$kubectl run --image \"$image\" --restart=Never --overrides=\"$overrides\" --labels=\"$labels\" $([ \"$tty\" = true ] && echo -t) -i \"$pod\" $generator\n"
  },
  {
    "path": "tools/kubetail",
    "content": "#!/bin/bash\n# https://github.com/johanhaleby/kubetail/blob/master/kubetail\n\nif [ -z \"${KUBECTL_BIN}\" ]; then\n\tif hash kubectl 2>/dev/null; then\n\t\tKUBECTL_BIN='kubectl'\n\telif hash kubectl.exe 2>/dev/null; then\n\t\tKUBECTL_BIN='kubectl.exe'\n\telif hash microk8s 2>/dev/null; then\n\t\tKUBECTL_BIN='microk8s.kubectl'\n\tfi\nfi\n\nif ! hash \"${KUBECTL_BIN}\" 2>/dev/null; then\n\techo >&2 \"kubectl is not installed\"\n\texit 1\nfi\n\nreadonly PROGNAME=$(basename $0)\n\ncalculate_default_namespace() {\n\tlocal config_namespace=$(${KUBECTL_BIN} config view --minify --output 'jsonpath={..namespace}')\n\techo \"${KUBETAIL_NAMESPACE:-${config_namespace:-default}}\"\n}\n\n# Sets default color ouput to 'false' if output is not a terminal\nterminal_aware_default_color=line\n[ ! -t 1 ] && terminal_aware_default_color=false\n\ndefault_previous=\"${KUBETAIL_PREVIOUS:-false}\"\ndefault_since=\"${KUBETAIL_SINCE:-10s}\"\ndefault_namespace=$(calculate_default_namespace)\ndefault_follow=\"${KUBETAIL_FOLLOW:-true}\"\ndefault_prefix=\"${KUBETAIL_PREFIX:-true}\"\ndefault_line_buffered=\"${KUBETAIL_LINE_BUFFERED:-}\"\ndefault_colored_output=\"${KUBETAIL_COLORED_OUTPUT:-$terminal_aware_default_color}\"\ndefault_timestamps=\"${KUBETAIL_TIMESTAMPS:-}\"\ndefault_jq_selector=\"${KUBETAIL_JQ_SELECTOR:-}\"\ndefault_skip_colors=\"${KUBETAIL_SKIP_COLORS:-7,8}\"\ndefault_tail=\"${KUBETAIL_TAIL:--1}\"\ndefault_show_color_index=\"${KUBETAIL_SHOW_COLOR_INDEX:-false}\"\n\nnamespace=\"${default_namespace}\"\nfollow=\"${default_follow}\"\nprefix=\"${default_prefix}\"\nline_buffered=\"${default_line_buffered}\"\ncolored_output=\"${default_colored_output}\"\ntimestamps=\"${default_timestamps}\"\njq_selector=\"${default_jq_selector}\"\nskip_colors=\"${default_skip_colors}\"\ntail=\"${default_tail}\"\nshow_color_index=\"${default_show_color_index}\"\n\nif [[ ${1} != -* ]]\nthen\n\tpod=\"${1}\"\nfi\ncontainers=()\nselector=()\nregex='substring'\nprevious=\"${default_previous}\"\nsince=\"${default_since}\"\nversion=\"1.6.19-SNAPSHOT\"\ndryrun=false\ncluster=\"\"\nnamespace_arg=\"-n ${default_namespace}\"\n\nusage=\"${PROGNAME} <search term> [-h] [-c] [-n] [-t] [-l] [-f] [-d] [-P] [-p] [-s] [-b] [-e] [-j] [-k] [-z] [-v] [-r] [-i] -- tail multiple Kubernetes pod logs at the same time\n\nwhere:\n    -h, --help              Show this help text.\n    -c, --container         The name of the container to tail in the pod (if multiple containers are defined in the pod).\n                            Defaults to all containers in the pod. Can be used multiple times.\n    -t, --context           The k8s context. ex. int1-context. Relies on ~/.kube/config for the contexts.\n    -l, --selector          Label selector. If used the pod name is ignored.\n    -n, --namespace         The Kubernetes namespace where the pods are located. Defaults to \\\"${default_namespace}\\\".\n    -f, --follow            Specify if the logs should be streamed. (true|false) Defaults to ${default_follow}.\n    -d, --dry-run           Print the names of the matched pods and containers, then exit.\n    -P, --prefix            Specify if add the pod name prefix before each line. (true|false) Defaults to ${default_prefix}.\n    -p, --previous          Return logs for the previous instances of the pods, if available. (true|false) Defaults to ${default_previous}.\n    -s, --since             Only return logs newer than a relative duration like 5s, 2m, or 3h. Defaults to ${default_since}.\n    -b, --line-buffered     This flags indicates to use line-buffered. (true|false) Defaults to ${default_line_buffered:-false}.\n    -e, --regex             The type of name matching to use (regex|substring). Defaults to ${regex}.\n    -j, --jq                If your output is json - use this jq-selector to parse it. Defaults to \\\"${default_jq_selector}\\\".\n                            example: --jq \\\".logger + \\\\\\\" \\\\\\\" + .message\\\"\n    -k, --colored-output    Use colored output (pod|line|false).\n                            pod = only color pod name, line = color entire line, false = don't use any colors.\n                            Defaults to ${default_colored_output}.\n    -z, --skip-colors       Comma-separated list of colors to not use in output.\n                            If you have green foreground on black, this will skip dark grey and some greens: -z 2,8,10\n                            Defaults to: ${default_skip_colors}.\n        --timestamps        Show timestamps for each log line. (true|false) Defaults to ${default_timestamps:-false}.\n        --tail              Lines of recent log file to display. Defaults to ${default_tail}, showing all log lines.\n    -v, --version           Prints the kubetail version.\n    -r, --cluster           The name of the kubeconfig cluster to use.\n    -i, --show-color-index  Show the color index before the pod name prefix that is shown before each log line.\n                            Normally only the pod name is added as a prefix before each line, for example \\\"[app-5b7ff6cbcd-bjv8n]\\\",\n                            but if \\\"show-color-index\\\" is true then color index is added as well: \\\"[1:app-5b7ff6cbcd-bjv8n]\\\".\n                            This is useful if you have color blindness or if you want to know which colors to exclude (see \\\"--skip-colors\\\").\n                            Defaults to ${default_show_color_index}.\n\nexamples:\n    ${PROGNAME} my-pod-v1\n    ${PROGNAME} my-pod-v1 -c my-container\n    ${PROGNAME} my-pod-v1 -t int1-context -c my-container\n    ${PROGNAME} '(service|consumer|thing)' -e regex\n    ${PROGNAME} -l service=my-service\n    ${PROGNAME} --selector service=my-service --since 10m\n    ${PROGNAME} --tail 1\"\n\nif [ \"$#\" -ne 0 ]; then\n\twhile [ \"$#\" -gt 0 ]\n\tdo\n\t\tcase \"$1\" in\n\t\t-h|--help)\n\t\t\techo \"$usage\"\n\t\t\texit 0\n\t\t\t;;\n\t\t-v|--version)\n\t\t\techo \"$version\"\n\t\t\texit 0\n\t\t\t;;\n\t\t-c|--container)\n\t\t\tcontainers+=(\"$2\")\n\t\t\t;;\n\t\t-e|--regex)\n\t\t\tif [ \"$2\" = \"substring\" ]; then\n\t\t\t\tregex=\"substring\"\n\t\t\telse\n\t\t\t\tregex=\"regex\"\n\t\t\tfi\n\t\t\t;;\n\t\t-t|--context)\n\t\t\tcontext=\"$2\"\n\t\t\t;;\n\t\t-r|--cluster)\n\t\t\tcluster=\"--cluster $2\"\n\t\t\t;;\n\t\t-l|--selector)\n\t\t\tselector=(--selector \"$2\")\n\t\t\tpod=\"\"\n\t\t\t;;\n\t\t-d|--dry-run)\n\t\t\tdryrun=true\n\t\t\t;;\n\t\t-p|--previous)\n\t\t\tif [ \"$2\" = \"false\" ]; then\n\t\t\t\tprevious=\"false\"\n\t\t\telse\n\t\t\t\tprevious=\"true\"\n\t\t\tfi\n\t\t\t;;\n\t\t-s|--since)\n\t\t\tif [ -z \"$2\" ]; then\n\t\t\t\tsince=\"${default_since}\"\n\t\t\telse\n\t\t\t\tsince=\"$2\"\n\t\t\tfi\n\t\t\t;;\n\t\t-n|--namespace)\n\t\t\tif [ -z \"$2\" ]; then\n\t\t\t\t# using namespace from context\n\t\t\t\t:\n\t\t\telse\n\t\t\t\tnamespace_arg=\"--namespace $2\"\n\t\t\tfi\n\t\t\t;;\n\t\t-f|--follow)\n\t\t\tif [ \"$2\" = \"false\" ]; then\n\t\t\t\tfollow=\"false\"\n\t\t\telse\n\t\t\t\tfollow=\"true\"\n\t\t\tfi\n\t\t\t;;\n\t\t-P|--prefix)\n\t\t\tif [ \"$2\" = \"false\" ]; then\n\t\t\t\tprefix=\"false\"\n\t\t\telse\n\t\t\t\tprefix=\"true\"\n\t\t\tfi\n\t\t\t;;\n\t\t-b|--line-buffered)\n\t\t\tif [ \"$2\" = \"false\" ]; then\n\t\t\t\tline_buffered=\"\"\n\t\t\telse\n\t\t\t\tline_buffered=\"| grep - --line-buffered\"\n\t\t\tfi\n\t\t\t;;\n\t\t-k|--colored-output)\n\t\t\tif [ -z \"$2\" ]; then\n\t\t\t\tcolored_output=\"${default_colored_output}\"\n\t\t\telse\n\t\t\t\tcolored_output=\"$2\"\n\t\t\tfi\n\t\t\t;;\n\t\t-j|--jq)\n\t\t\tif [ -z \"$2\" ]; then\n\t\t\t\tjq_selector=\"${default_jq_selector}\"\n\t\t\telse\n\t\t\t\tjq_selector=\"$2\"\n\t\t\tfi\n\t\t\t;;\n\t\t-z|--skip-colors)\n\t\t\tif [ -z \"$2\" ]; then\n\t\t\t\tskip_colors=\"${default_skip_colors}\"\n\t\t\telse\n\t\t\t\tskip_colors=\"$2\"\n\t\t\tfi\n\t\t\t;;\n\t\t--timestamps)\n\t\t\tif [ \"$2\" = \"false\" ]; then\n\t\t\t\t\ttimestamps=\"$1=$2\"\n\t\t\telse\n\t\t\t\t\ttimestamps=\"$1\"\n\t\t\tfi\n\t\t\t;;\n\t\t--tail)\n\t\t\tif [ -z \"$2\" ]; then\n\t\t\t\t\ttail=\"${default_tail}\"\n\t\t\telse\n\t\t\t\t\ttail=\"$2\"\n\t\t\tfi\n\t\t\t;;\n\t\t-i|--show-color-index)\n\t\t\tif [ -z \"$2\" ]; then\n\t\t\t\t\tshow_color_index=\"${default_show_color_index}\"\n\t\t\telse\n\t\t\t\t\tshow_color_index=\"$2\"\n\t\t\tfi\n\t\t\t;;\n\t\t--)\n\t\t\tbreak\n\t\t\t;;\n\t\t-*)\n\t\t\techo \"Invalid option '$1'. Use --help to see the valid options\" >&2\n\t\t\texit 1\n\t\t\t;;\n\t\t# an option argument, continue\n\t\t*) ;;\n\t\tesac\n\t\tshift\n\tdone\nelse\n\techo \"$usage\"\n\texit 1\nfi\n\n# Join function that supports a multi-character separator (copied from http://stackoverflow.com/a/23673883/398441)\nfunction join() {\n\t# $1 is sep\n\t# $2... are the elements to join\n\tlocal sep=\"$1\"\n\tshift\n\n\tlocal F=0\n\tfor x in \"$@\"\n\tdo\n\t\tif [[ F -eq 1 ]]\n\t\t\tthen\n\t\t\t\techo -n \"$sep\"\n\t\t\telse\n\t\t\t\tF=1\n\t\t\tfi\n\t\t\techo -n \"$x\"\n\tdone\n\techo\n}\n\n# Check if pod query contains a comma and we've not specified \"regex\" explicitly,\n# if so we convert the pod query string into a regex that matches all pods seperated by the comma\nif [[ \"${pod}\" = *\",\"* ]] && [ ! \"${regex}\" == 'regex' ]; then\n\n\t# Split the supplied query string (in variable pod) by comma into an array named \"pods_to_match\"\n\tIFS=',' read -r -a pods_to_match <<< \"${pod}\"\n\n\t# Join all pod names into a string with \".*|.*\" as delimiter\n\tpod=$(join \".*|.*\" \"${pods_to_match[@]}\")\n\n\t# Prepend and initial \".*\" and and append the last \".*\"\n\tpod=\".*${pod}.*\"\n\n\t# Force the use of regex matching\n\tregex='regex'\nfi\n\ngrep_matcher=''\nif [ \"${regex}\" == 'regex' ]; then\n\techo \"Using regex '${pod}' to match pods\"\n\tgrep_matcher='-E'\nfi\n\n# Get all pods matching the input and put them in an array. If no input then all pods are matched.\nmatching_pods=(`${KUBECTL_BIN} get pods ${context:+--context=${context}} \"${selector[@]}\" ${namespace_arg} ${cluster} --field-selector=status.phase=Running --output=jsonpath='{.items[*].metadata.name}' | xargs -n1 | grep --color=never $grep_matcher \"${pod}\"`)\nmatching_pods_size=${#matching_pods[@]}\n\nif [ ${matching_pods_size} -eq 0 ]; then\n\techo \"No pod exists that matches ${pod}\"\n\texit 1\nfi\n\ncolor_end=$(tput sgr0)\n\n# Wrap all pod names in the \"kubectl logs <name> -f=true/false\" command\ndisplay_names_preview=()\npod_logs_commands=()\ni=0\ncolor_index=0\n\nfunction next_col {\n\tpotential_col=$(($1+1))\n\t[[ $skip_colors =~ (^|,)$potential_col($|,) ]] && echo `next_col $potential_col` || echo $potential_col\n}\n\n# Allows for more colors, this is useful if one tails a lot pods\nif [ ${colored_output} != \"false\" ]; then\n\texport TERM=xterm-256color\nfi\n\n# Function that kills all kubectl processes that are started by kubetail in the background\nfunction kill_kubectl_processes {\n\tkill 0\n}\n\n# Invoke the \"kill_kubectl_processes\" function when the script is stopped (including ctrl+c)\n# Note that \"INT\" is not used because if, for example, kubectl cannot find a container\n# (for example when running \"kubetail something -c non_matching\")\ntrap kill_kubectl_processes EXIT\n\n# Putting all needed values in a variable so that multiple requests to Kubernetes api can be avoided, thus making it faster\nall_pods_containers=$(echo -e `${KUBECTL_BIN} get pods ${namespace_arg} ${context:+--context=${context}} --output=jsonpath=\"{range .items[*]}{.metadata.name} {.spec['containers', 'initContainers'][*].name} \\n{end}\"`)\n\n\nfor pod in ${matching_pods[@]}; do\n\tif [ ${#containers[@]} -eq 0 ]; then\n\t\tpod_containers=($(echo -e \"$all_pods_containers\" | grep $pod | cut -d ' ' -f2- | xargs -n1))\n\telse\n\t\tpod_containers=(\"${containers[@]}\")\n\tfi\n\n\tfor container in ${pod_containers[@]}; do\n\t\t[ ${matching_pods_size} -eq 1 -a ${#pod_containers[@]} -eq 1 ] && single_stream=\"true\" || single_stream=\"false\"\n\n\t\tif [ ${colored_output} == \"false\" ] || [ ${single_stream} == \"true\" ]; then\n\t\t\tcolor_start=$(tput sgr0)\n\t\t\tcolor_index_prefix=\"\"\n\t\telse\n\t\t\tcolor_index=`next_col $color_index`\n\t\t\tcolor_start=$(tput setaf $color_index)\n\t\t\tcolor_index_prefix=`if [ ${show_color_index} == \"true\" ]; then echo \"${color_index}:\"; else echo \"\"; fi`\n\t\tfi\n\n\t\tif [ ${#pod_containers[@]} -eq 1 ]; then\n\t\t\tdisplay_name=\"${pod}\"\n\t\telse\n\t\t\tdisplay_name=\"${pod} ${container}\"\n\t\tfi\n\n\t\tif [ ${colored_output} == \"false\" ]; then\n\t\t\tdisplay_names_preview+=(\"${display_name}\")\n\t\telse\n\t\t\tdisplay_names_preview+=(\"$color_index_prefix${color_start}${display_name}${color_end}\")\n\t\tfi\n\n\t\tif [ ${prefix} == \"false\" ]; then\n\t\t\tprefix_line=\"\"\n\t\telse\n\t\t\tif [ ${colored_output} == \"false\" ]; then\n\t\t\t\tprefix_line=\"[${display_name}] \"\n\t\t\telse\n\t\t\t\tprefix_line=\"${color_start}[${color_end}${color_index_prefix}${color_start}${display_name}]${color_end} \"\n\t\t\tfi\n\t\tfi\n\n\t\tif [ ${colored_output} == \"false\" ] || [ ${colored_output} == \"pod\" ]; then\n\t\t\tcolored_line=\"${prefix_line}\\$REPLY\"\n\t\telse\n\t\t\tcolored_line=\"${prefix_line}${color_start}\\$REPLY${color_end}\"\n\t\tfi\n\n\t\tkubectl_cmd=\"${KUBECTL_BIN} ${context:+--context=${context}} logs ${pod} ${container} -f=${follow} --previous=${previous} --since=${since} --tail=${tail} ${namespace_arg} ${cluster}\"\n\t\tcolorify_lines_cmd=\"while read -r; do echo \\\"$colored_line\\\" | tail -n +1; done\"\n\t\tif [ \"z\" == \"z$jq_selector\" ]; then\n\t\t\tlogs_commands+=(\"${kubectl_cmd} ${timestamps} | ${colorify_lines_cmd}\");\n\t\telse\n\t\t\tlogs_commands+=(\"${kubectl_cmd} | jq --unbuffered -r -R --stream '. as \\$line | try (fromjson | $jq_selector) catch \\$line' | ${colorify_lines_cmd}\");\n\t\tfi\n\n\t\t# There are only 11 usable colors\n\t\ti=$(( ($i+1)%13 ))\n\tdone\ndone\n\n# Preview pod colors\necho \"Will tail ${#display_names_preview[@]} logs...\"\nfor preview in \"${display_names_preview[@]}\"; do\n\techo \"$preview\"\ndone\n\nif [[ ${dryrun} == true ]];\nthen\n\texit 0\nfi\n\n# Join all log commands into one string separated by \" & \"\ncommand_to_tail=$(join \" & \" \"${logs_commands[@]}\")\n\n# Aggregate all logs and print to stdout\n# Note that tail +1f doesn't work on some Linux distributions so we use this slightly longer alternative\n# Note that if --follow=false, then the tail command should also not be followed\ntail_follow_command=\"-f\"\nif [[ ${follow} == false ]];\nthen\n\ttail_follow_command=\"\"\nfi\ntail ${tail_follow_command} -n +1 <( eval \"${command_to_tail}\" ) $line_buffered\n"
  },
  {
    "path": "tools/yc-ssh-key-copy.sh",
    "content": "#!/bin/bash\n\n# 此脚本为批量部署服务器ssh key使用\n\n#set -x\n\n# check args count\nif test $# -ne 3; then\n    echo -e \"\\nUsage: $0 < hosts file > < username > < password >\\n\"\n    exit 1\nfi\n\n# check hosts file\nhosts_file=$1\nif ! test -e $hosts_file; then\n    echo \"[ERROR]: Can't find hosts file\"\n    exit 1\nfi\n\nusername=$2\npassword=$3\n\n# check sshkey file \nsshkey_file=~/.ssh/id_rsa.pub\nif ! test -e $sshkey_file; then\n    expect -c \"\n    spawn ssh-keygen -t rsa\n    expect \\\"Enter*\\\" { send \\\"\\n\\\"; exp_continue; }\n    \"\nfi\n\n# get hosts list\nhosts=$(ansible -i $hosts_file all --list-hosts | awk 'NR>1')\necho \"=======================================================================\"\necho \"hosts: \"\necho \"$hosts\"\necho \"=======================================================================\"\n\nssh_key_copy()\n{\n    # delete history\n    sed \"/$1/d\" -i ~/.ssh/known_hosts\n\n    # start copy \n    expect -c \"\n    set timeout 100\n    spawn ssh-copy-id $username@$1\n    expect {\n    \\\"yes/no\\\"   { send \\\"yes\\n\\\"; exp_continue; }\n    \\\"*assword\\\" { send \\\"$password\\n\\\"; }\n    \\\"already exist on the remote system\\\" { exit 1; }\n    }\n    expect eof\n    \"\n}\n\n# auto sshkey pair\nfor host in $hosts; do\n    echo \"=======================================================================\"\n\n    # check network\n    ping -i 0.2 -c 3 -W 1 $host >& /dev/null\n    if test $? -ne 0; then\n        echo \"[ERROR]: Can't connect $host\"\n        exit 1\n    fi\n\n    cat /etc/hosts | grep -v '^#' | grep $host >& /dev/null\n    if test $? -eq 0; then\n        hostaddr=$(cat /etc/hosts | grep -v '^#' | grep $host | awk '{print $1}')\n        hostname=$(cat /etc/hosts | grep -v '^#' | grep $host | awk '{print $2}')\n        \n        ssh_key_copy $hostaddr\n        ssh_key_copy $hostname\n    else\n        ssh_key_copy $host\n    fi\n\n    echo \"\"\ndone\n"
  }
]